#!/usr/bin/perl
#==================================================
#author: sean chen mail: funningboy@gmail.com
#publish 2010/10/27
#License: BSD
#
# 進場策略 rules
# R1. ( T[0]_K(9) cross over T[0]_D(9) ) && ( T[-1]_K(9) <> D(9). 且 昨日 KD 必須小於 今日 KD
#
# R2. T[0]_MACD_DIF(12-26) > 0 && T[0]_MACD_DIFF(12-26) > T[1]_MACD_DIFF(12-26)
# 當日 MACD-DIFF > 0 且 必須大於昨日的 MACD-DIFF
#
# R3. 外資連續買超1日
#
#==================================================
use SYS::GLB;
use FINANCE::KD;
use FINANCE::MACD;
use TRADER::UTIL;
use Data::Dumper;
use strict;
my $pre_time = "2010/10/25";
my $cur_time = "2010/10/26";
my %stock_list =(
"STOCKID" => ["2330.TW",
"2409.TW",
"2317.TW",],
"PATH" => ["./data_off/stock/2330.TW.csv",
"./data_off/stock/2409.TW.csv",
"./data_off/stock/2317.TW.csv",],
"KD" => ["-1",
"-1",
"-1",],
"MACD" => ["-1",
"-1",
"-1",],
"EXTERNAL"=> ["-1",
"-1",
"-1",],
);
#printf Dumper(\%stock_list);
my $global = SYS::GLB->new();
my $market_super_hstable = $global->get_market_super_hstable;
my $market_trader_hstable = $global->get_market_trader_hstable;
my $trader = TRADER::UTIL->new();
$trader->set_market_super_hstable($market_super_hstable);
$trader->set_market_trader_hstable($market_trader_hstable);
#==========================================================
# step 1 get KD value && Check R1
#==========================================================
my @KD_Arr =();
foreach my $path ( @{$stock_list{PATH}} ){
my $info = FINANCE::HISTORY_INFO->new();
my $hslist = $info->get_file_info($path);
my $ikd = FINANCE::KD->new($hslist);
$ikd->run_all('9');
my $pre_kd = $ikd->get_KD('9',$pre_time); my %pre_kd = %{$pre_kd};
my $cur_kd = $ikd->get_KD('9',$cur_time); my %cur_kd = %{$cur_kd};
#printf Dumper($pre_kd);
#printf Dumper($cur_kd);
if( ($cur_kd{K} > $cur_kd{D} )&&
($cur_kd{K} > $pre_kd{K} )&&
($cur_kd{D} > $pre_kd{D} ) ){
push(@KD_Arr,1);
} else{ push(@KD_Arr,-1); }
}
@{$stock_list{KD}} = @KD_Arr;
#==========================================================
# step 2 get MACD value && Check R2
#==========================================================
my @MACD_Arr =();
foreach my $path ( @{$stock_list{PATH}} ){
my $info = FINANCE::HISTORY_INFO->new();
my $hslist = $info->get_file_info($path);
my $imacd = FINANCE::MACD->new($hslist);
$imacd->run_all('9');
my $pre_macd = $imacd->get_MACD('9',$pre_time); my %pre_macd = %{$pre_macd};
my $cur_macd = $imacd->get_MACD('9',$cur_time); my %cur_macd = %{$cur_macd};
#printf Dumper($pre_macd);
#printf Dumper($cur_macd);
if( ($cur_macd{DIF} > 0 )&&
($cur_macd{DIF} > $pre_macd{DIF} ) ){
push(@MACD_Arr,1);
} else{ push(@MACD_Arr,-1); }
}
@{$stock_list{MACD}} = @MACD_Arr;
#========================================
# step 3. get super buy info && check R3
#========================================
my @Super_Arr =();
my $super = $trader->get_bk_external_super_buy_hstable('1','2010/10/26'); my %super = %{$super};
#print Dumper($super);
foreach my $sid (@{$stock_list{STOCKID}} ){
my $ch =0;
foreach my $id (keys %super ){
if( $super{$id}->STID eq $sid ){
$ch =1;
}
}
if( $ch==1 ){ push(@Super_Arr,1); }
else{ push(@Super_Arr,-1); }
}
@{$stock_list{EXTERNAL}} = @Super_Arr;
#=====================================
# Dumper results
#=====================================
printf Dumper(\%stock_list);
ref : http://github.com/funningboy
2010年10月27日 星期三
sample "entry case" 2 our trade API
2010年10月26日 星期二
Trader API top view @ perl ...
Target:
其實理由很簡單,為了簡化我的交易系統,讓整體的 flow 更完整點,不然東一塊西一塊的看起來真醜....像之前的所寫過的 learning plus: SDDE Server-V1 ,learning plus: DDE server for Stock ..怎現在都不知道在做啥....XD, 不過人說最初的心血是不會白費的,好在之前有些紀錄.不然還真是砍掉重練.
Trader API
我們主要分成 3 大部份來講解
在 part 1 DDE, 主要透過 Web/DDE server 來抓取我們要的 info.
1. DDE part support
1-1 OFF_TIME data
1-1-1. history data @(Yahoo,Google)
1-1-2. super sell/buy [1,5,10,30] @ Web(yuanta)
1-1-3. trader info [1,5,10,30] @ Web (yuanta)
1-1-4. finance_bill [1] @ Web (yuanta)
1-2 ON_TIME data
1-2-1 Real DDE server @ Fubon e01
ex: data.pl
我們主要分成 3 大部份來講解
在 part 1 DDE, 主要透過 Web/DDE server 來抓取我們要的 info.
1. DDE part support
1-1 OFF_TIME data
1-1-1. history data @(Yahoo,Google)
1-1-2. super sell/buy [1,5,10,30] @ Web(yuanta)
1-1-3. trader info [1,5,10,30] @ Web (yuanta)
1-1-4. finance_bill [1] @ Web (yuanta)
1-2 ON_TIME data
1-2-1 Real DDE server @ Fubon e01
ex: data.pl
my $google = NET::GoogleDailyData->new();
$google->get_history_data('2330.TW','2010/01/01','2010/10/10');
$google->exp_history_data('2330.TW',"./DATA/2330.TW.csv");
my $yahoo = NET::YahooDailyData->new();
$yahoo->get_history_data('2330.TW','2010/01/01','2010/10/15');
$yahoo->exp_history_data('2330.TW',"2330.TW.csv");
my $trader = NET::TraderDetail->new();
$trader->get_trader_data();
$trader->exp_trader_data("2010_10_20_trader_detail.csv");
#===========================================
#
# get super buy/sell[1,5,10,30] info from web
# get trader [1,5,30] info from web
#
#============================================
my $global = SYS::GLB->new();
my $market_super_hstable = $global->get_market_super_hstable;
# printf Dumper($market_super_hstable);
my $market = NET::Market->new($market_super_hstable);
$market->get_market_super_buyer_seller_data();
$market->exp_market_data();
my $market_trader_hstable = $global->get_market_trader_hstable;
#printf Dumper($market_trader_hstable);
my $td4bysel = NET::Trader4BuySellDetail->new($market_trader_hstable);
$td4bysel->get_market_trader_data();
$td4bysel->exp_market_trader_data();
在 part 2 FINANCE 為資料分析 跟 簡單的判斷
2. FINANCE part support
2-1 Indicator
2-1-1 KD
2-1-2 BIAS
2-1-3 DMI
2-1-3 MACD
2-1-4 MA
2-1-5 OBV
2-1-6 PSY
2-1-7 RSI
2-1-8 SAR
2-1-9 VR
2-1-10 WR
2-2 Trader info
2-2-1 get trader info list by day
2-2-2 get statistic info by constrain
2-3 super buy/sell info
2-3-1 get super buy/sell by day
2-3-2 get statistic info by constrain
ex:
my $ikd = FINANCE::KD->new($hslist);
my $kd = $ikd->get_KD('30','2010/08/12');
printf Dumper($kd);
my $ibias = FINANCE::BIAS->new($hslist);
my $bias = $ibias->get_BIAS('30','2010/08/12');
printf Dumper($bias);
my $idmi = FINANCE::DMI->new($hslist);
my $dmi = $idmi->get_DMI('30','2010/08/12');
printf Dumper($dmi);
my $trader = TRADER::UTIL->new();
$trader->set_market_super_hstable($market_super_hstable);
$trader->set_market_trader_hstable($market_trader_hstable);
my $rst = $trader->get_bk_external_super_buy_hstable('1','2010/10/26');
$rst = $trader->get_bk_main_super_sell_hstable('1','2010/10/26');
printf Dumper($rst);
$rst = $trader->get_bk_external_trader_buy_hstable('1','2010/10/26','1440');
$rst = $trader->get_bk_internal_trader_sell_hstable('1','2010/10/26','9800');
在 part 3 PROFIT 為回測分析我們進場點的 report
my %data = (
"START_TIME" => '2010/09/01', #開始時間
"END_TIME" => '2010/10/18', #結束時間
"CAPITAL" => '500000', #成本
"LEAVE_PROFIT_LOST" => '15.0', #出場停損 10%
"LEAVE_PROFIT_MAKE" => '10.0', #出場獲利 7%
"KEEP_PROFIT_LOST" => '5.0', #持有時確保 損失 達 -5%,如超過則回補
"KEEP_PROFIT_MAKE" => '3.0', #持有時確保 獲利 達 3%,如操過則加碼
"KEEP_PROFIT_LOST_T"=> '1', #最多回補次數 3 次
"KEEP_PROFIT_MAKE_T"=> '0', #最多加碼次數 3 次
"KEEP_PROFIT_LENGTH"=> '1', #每5 天 check 損失/獲利
"PRICE_UP_LIMIT" => '40', #股價 <> '10', #股價 > 10 的才會進場 check
);
my $prt = PROFIT::profit->new(\%data);
$prt->get_input_set();
$prt->set_history_path("./daily/");
$prt->set_profit_info("Sharkv2_2010_09_10_c3.csv");
$prt->get_profit_run();
$prt->get_profit_report("rep.csv");
~
有興趣的人可以到 http://github.com/funningboy 參考看看,當然也歡迎一起開發..@@
2010年10月20日 星期三
git 初體驗
git 是個分散式的版本控制軟體, 透過 repo 的方式,使用者可以修改/上傳 所屬的 project. 除了可以確保 master 的 version 外. master 也可以藉由別人修改的 patch 來 update 原來所屬的 project. 可避免共同開發時所造成的 "版本" 不符 跟 file overwrite 的狀況.
ps: 最近會慢慢把之前的 project 改成 git 的型式 ...
Refs:
使用Git與Github管理軟體開發專案
Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.
Github 使用
訂閱:
文章 (Atom)