2010年10月27日 星期三

sample "entry case" 2 our trade API

當你握有滿手好牌,卻又不知該怎麼辦時,我想數據分析應該還有一定的準確性..@@ 底下我們就用 Trader API 來寫個簡單的進出場判斷. 透過 "策略分析" 跟 "profit-analysis" 來回測我們的進出場判斷條件...@@
#!/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月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
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 使用