顯示具有 stock 標籤的文章。 顯示所有文章
顯示具有 stock 標籤的文章。 顯示所有文章

2013年4月2日 星期二

Ta-lib + bigdata = stock analysis tool

  • 如何用30分鐘, 打造出自己獨特程式交易系統. 話不多說,我們就直接開始吧!!!!
  • requirements
    • Ta-lib(support finance indicators)
    • bigdata(pandas, numpy, scipy, matplotlib...)
    • Ta-lib Cython wrapper (wrapper Ta-lib to python)
  • how to install in Mac 
    • install Ta-lib (port install ta-lib)
    • install bigdata 
      • port install py27-pandas
      • port install py27-numpy
      • port install py27-matplotlib
      • ...
    • setup python search path for mac port
      • add the below info to "~/.bashrc"
        • "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages"
      • source ~/.bashrc
    • install Ta-lib(wrapper)
      • https://github.com/funningboy/ta-lib
  • example case
    • 買點
      • 利用5日平均線大於10日平均線
    • 賣點
      • 持有天數最多只能有三天
    •  結論
      • 還是實在賺錢比較重要
    • ref:
      • https://github.com/funningboy/ta-lib/blob/master/tools/tdr_jump.py
    • results:
total profit is : -20.26
----------------------------------------------------------------------------------------------------
               ma10      ma5   close    high     low    open   volume  entry  leave  profit
2013-01-02      NaN      NaN  723.25  727.00  716.55  719.42  2541300      0      0    0.00
2013-01-03      NaN      NaN  723.67  731.93  720.72  724.93  2318200      0      0    0.00

import sys                                                                                                                                                                           
from datetime import datetime

import numpy as np
import talib
import matplotlib.finance as fin 
from pylab import show

from pandas import Index, DataFrame, Series
from pandas.core.datetools import BMonthEnd
from pandas import ols 


def getQuotes(symbol, start, end):
    """ get stock Quotes from Yahoo """

    quotes = fin.quotes_historical_yahoo(symbol, start, end)
    dates, open, close, high, low, volume = zip(*quotes)

    data = { 
        'open': open,
        'close': close,
        'high': high,
        'low': low,
        'volume': volume
    }   

    dates = Index([datetime.fromordinal(int(d)) for d in dates])
    return DataFrame(data, index=dates)


def getMA(quotes):
    """ get mv_avg indicator and update org quotes by joining two DataFrame """

    ma5 = talib.MA(quotes['close'],5)
    ma10 = talib.MA(quotes['close'],10)

    data = { 
            'ma5' : ma5,
            'ma10': ma10,
            }   

    update = DataFrame(data, index=quotes.index)
    return update.join(quotes)

def setEntryRule1(quotes):
    """ set entry rule when ma5 is cross-over ma10 """

    def rule1(quotes, index):
        rst = 1 if quotes['ma5'][index] > quotes['ma10'][index] else 0
        return rst

    quotes['entry'] = [rule1(quotes, index) for index in quotes.index]
    return quotes


def setLeaveRule1(quotes):
    """ set leave rule when the holding day is large than 3 days"""

    def rule1(quotes, position):
        if position - 3 >= 0:
            if quotes['entry'][position-3] == 1:
                return [1, quotes['close'][position] - quotes['close'][position-3]]
        return [0, 0]

    quotes['leave'], quotes['profit'] = zip(*[rule1(quotes, position) for position, index in enumerate(quotes.index)])
    return quotes


def getProfit(quotes):
    """ get profit report """

    print "total profit is : %s" %(sum(quotes['profit']))
    print "-" * 100
    print quotes


def main():
    # get stock info from start to end
    startDate = datetime(2013, 1, 1)
    endDate = datetime(2013, 1, 30)

    # get stock id
    goog = getQuotes('GOOG', startDate, endDate)
    goog = getMA(goog)

    goog = setEntryRule1(goog)
    goog = setLeaveRule1(goog)
    getProfit(goog)

if __name__ == '__main__':                                                                                                                                                           
    main()

2011年4月29日 星期五

GeniusTrader @ perl

TradeStation的交易系統上, 可以寫簡單的 Easy Language 做系統的回測分析. 可參考大象飛上天,裡面有很多簡單的例子.不過你需要先有 TradeStation 這套付錢的軟體. 這對Free Software的人來說真是太困難了. 還好有 GeniusTrader, 透過內建的 Indicator, money management...下些簡單的 Script commands, 可以模擬出類似 TradeStation 的 Chart 跟 Report 呢. GeniusTrader support 1.backtrack history data insert .txt 2.real time quote from Yahoo finance DBI:SQLite3, MySQL, 3. indicator support DMA,KD,... 5. money management & profit report hold time, max benefit, max lost. 可參考底下的安裝流程. http://geniustrader.org/first_use.html ps: 記得設定 GeniusTrader 的 system 變數 @ ~/.gt/options
DB::module Text
DB::text::directory /home/sean/prj/geniustrader/data
# relying on DB::Text defaults for sample database access

Brokers::module SelfTrade

Path::Font::Arial    /usr/share/fonts/truetype/msttcorefonts/arial.ttf
Path::Font::Courier  /usr/share/fonts/truetype/msttcorefonts/couri.ttf
Path::Font::Times    /usr/share/fonts/truetype/msttcorefonts/times.ttf

Analysis::ReferenceTimeFrame year

#Graphic::BackgroundColor black
#Graphic::ForegroundColor white

Aliases::Global::TFS    SY:TFS 50 10|CS:SY:TFS
Aliases::Global::TFS[]  SY:TFS #1 #2|CS:SY:TFS #1|CS:Stop:Fixed #3
ps: @ ex1 有沒有像 TradeStation 內的 Easy Language 阿.不過好像沒有 TradeStation那麼簡單. 全部是 GUI 的介面. 要跑回測要用 backtest.pl. 要圖形跑 graphic.pl. Run Mode 設定要修改 DB::module @ ~/.gt/options....還有一堆 script 要下,當然最大的特點是可以加入自己的想法到 library 中. 不過還是要找到適合自己的交易工具才重要. @ ex1
CS:Generic \
{S:Generic:CrossOverDown {I:DMI/3 14} 12 } \
{S:Generic:CrossOverUp   {I:DMI/3 14} -12 }
Ref: http://www.geniustrader.org/ https://help.ubuntu.com/8.04/serverguide/C/postgresql.html

2011年4月26日 星期二

Trader API update...

底下是 2009 年,高大師所做的演講,小弟就借來膜拜一下,順便把Trader API 做些改進. update lists 1. DBI data base support 2. backup & redundant remove support 3. history data co-sync support 4. error check 5. iJump entry rule 6. profit analysis ps: 如果你不想自己開發,我想底下的這套tool,對於股票的篩選還蠻有幫助的. http://sonyshare.com/FreeSoft/index.php Refs: Finance-GeniusTrader https://github.com/clkao

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月19日 星期二

Tiger preview && Shark v2 2010_08~10 profit reports

好久沒有更新交易資料了,除了目前已經在 run 的 Shark_v2 外,感覺似乎少了Real Data 的部份. 雖然之前有發過些零星的 DDE 程式,如 CDP 當沖程式 From TSTS星人, RealDDE 4 Fubon Server...,NDde....,但感覺好像就是少了個什麼. 畢竟 Shark_v2 是盤後分析 tool, 而盤中的變化要依靠券商所提供的 tool,但券商的 tool 的策略跟我想要的還是有些差距,變的是我們要透過外加個殼去 access DDE. 而主要在 real data(Tiger) 的部份, 是要分析盤中的委買賣價差, 成交量是否放大... 因為我們是反轉系統(Shark_v2),判斷底端頭部位置一但出現強勢攻擊訊號,表示頭部形成準備上衝...^_^ 底下是 2010-09~10 Shark_v2 的 profit reports,發現在高價股 2454.TW 的進場判斷失去準度,且連續賠錢出場...ㄟ害...不過如果扣除 2454.TW 的虧損,還是有不錯的獲利拉 ...ps 自我安慰中...XD

2010年9月12日 星期日

Qtstalker @ finance tool

Qtstalker 為 Open Source 的 project, 有點像TS(trade-station)跟HTS(日盛) 的分析軟體, 可以插入交易策略跟自訂的Indicator. 沒想到我還笨笨的自己在那邊刻.....XD,不過這樣也好. 可以熟知每個交系訊號的觸發機制跟字己進出場的原則. 可參考我過去做的一些理論跟原則 Ref Finance Lists Refs 盤後分析軟體 - qtstalker

特色

  • 支援一打以上的技術指標,像是平滑異同曲線(MACD)、相對強弱指標(RSI)、布林格交易波帶 (MA's Bollinger Bankds)等
  • 六種 K 線圖表現圖形, line, bar, candlestick, point and fingure, paint bars 與 swing
  • 蹩腳的有價証券管理機制。但適合追蹤股價
  • 支援多種市場資訊來源,可以從 Yahoo, CME, NYBOT 中取得股市市價
  • 技術線圖中可以加上買賣指標記號、文字、直線、橫線與斐波納契折線(Fibonacci Retracement)
  • 圖形顯示模式可為日、週與月
  • 投資模式可供 stock, futures, index 與 spreads.
  • 三種圖形縮放模式像是,縮放至螢幕大小,所有資料序列與 log。
  • 可模組化股價與指標,提供未來應用彈性
  • 回測功能,可用實際交易資料來測試指標效能
  • 支援獲利計算功能,可加入特定股票計算買入市值到售出之獲利或損失
Refs 盤後分析軟體 - qtstalker

2010年8月23日 星期一

Sharkv2 2010_06~08 profit reports pt2

接續 Sharkv2 2010_06~08 profit reports pt1 在之前我們已經把所有的解空間轉成Graph的型式,包含Edge跟Node的資料型態. 底下透過Boost C++ lib所提供的 DFS(deep first search) 來找出最多的交易次數 && 最少的交易次數,再分別比較每條交易曲線所各自代表的獲利跟交易次數的相關性,藉由不同的持股標的跟進出場時間來分析這一季或這段交易時間內的風險跟持股的周期. ps : Boost C++ 內support graphviz 的 input format, 可參考 boost_1_43_0/libs/graph/example/dfs-parenthesis.cpp. Refs: Boost build [boost] how to compile when using read_graphml linking error read_graphviz Google answer

2010年8月20日 星期五

Sharkv2 2010_06~08 profit reports pt1

底下為 Sharkv2 在 2010_06~08的績效表. 可參考 Finance Lists下,我們之前發過的post... Doc definition: sheet (c1) 為首次出現買進訊號時的交易績效表 sheet (c2) 為連續出現兩次買進訊號時的交易績效表 sheet (c3) 為連續出現三次買進訊號時的交易績效表 可以發現並不是連續買進訊號愈多代表交易績效愈好,因為我們這個是底部(頭)反轉系統,要確保股價已經打底完成,且做上漲準備時的交易區間.如果交易買進的連續訊號過多,表示底部尚未形成還有補跌的空間.所以適當的連續交易訊號才有一個較好的獲利區間. ps : 交易績效表下載 但其實用剛剛的績效表只能顯示我們每次的進出場時間點跟全部的獲利情況,就時間跟空間軸而言還不算完整,因為時間是連續性的且我們的成本是固定的,代表在現有的分險中手中持股數目跟價錢是固定的.表示握有的股票不會同時持有不同的交易標的,當然這是假設每次交易只有單一持股的情況,不過似乎很少人會這麼做.any way,底下我們假設每次交易都只持有單一股票,且在時間軸上做交易的情形,除了可以分析我們持股的周期,持股的股性,持股的交易次數...最後可以得到一個時間跟獲利的交易曲線,利用這兩條交易曲線做cross 就可找出獲利區間是落在哪個地方,分別各自代表時間上的哪個部位,還有交易時的訊號情況(indicator,三大法人...) 欄位說明 ID,Entry Day,End Day, Entry Price, End Price, Profit 所以經由上述的說明我們可以找到所有的Case solutions,假設 case 1. E1 = 1102.TW,2010/06/09,2010/06/21,27.55,29.8,2.25 E2 = 1605.TW,2010/06/28,2010/07/06,12,12.85,0.85 E3 = 1210.TW,2010/07/13,2010/07/20,29.2,31.4,2.2 ... case 2. E1 = 1530.TW,2010/06/04,2010/06/24,36.3,39.8,3.5 E2 = 1435.TW,2010/06/30,2010/07/05,5.81,6.25,0.44 E3 = 1210.TW,2010/07/13,2010/07/20,29.2,31.4,2.2 ... case ... 經由timing Expand,我們可以找出我們在timing 區間上每次交易的Path組合(case),可能 case 1 Profit(30), Time(10). case 2 Profit(25), Time(4). 就可以發現在 case 1 雖然交易的獲利比較好,但進出次數過多,相對的風險也較大. case 2 雖然獲利較差,但進出場次數較少,相對的風險也較低,整體而言在case 2 的投資組合更勝 case 1. 可以利用 BFS/DFS Graph search 來尋找最大的獲利組合跟最少的獲利組合,再分析獲利組合下的交易次數,最後兩者做圖形的重疊,就可以找到我們所要的獲利區間.

2010年5月20日 星期四

NDde....

底下是我為了解決RealDDE Crack時的替代方案,可參考底下的連結. Ref: 談談 C#.NET 連結 DDE Server 的設計觀 C# DDE 用戶端(Client) 的範本(含源碼下載與說明) from : Kenming's 軟體設計思維 NDde Source Code Ref: NDde from NDde 主要原因在於RealDDE 會透過API Access 的方式存取 DDE Client, 但是我們並沒有任何 Luck, Event trigger的機制, 導致 sample/(s) 的次數過大時, 會造成 "Exceed Limit" 的狀態. 解決方式: 1. 把 sample ratio 調小 2.更改 DDE Client TimeOut 的時間 $Win32::DDE::Client::Timeout = 1000; -> $Win32::DDE::Client::Timeout = 6000; 3. combine NDde 2 Our Environment.... call "NDde.dll " use Perl Win32 api ... NDde Client 原理
//include lib:
using NDde.Client;

// Create a client that connects to XQFAP|Quote. 
DdeClient client = new DdeClient("XQFAP", "Quote");

// Subscribe to the Disconnected event
client.Disconnected += OnDisconnected;

// Connect to the server. 
client.Connect();

// Syncronous Request Operation
Console.WriteLine("Request: " + client.Request("FITX*1.TF-Price", 60000));

// Asynchronous Request Operation
client.BeginRequest("FITX*1.TF-Price", 1, OnRequestComplete, client);

// Advise Loop
client.StartAdvise("FITX*1.TF-Price", 1, true, 60000);
client.Advise += OnAdvise;

//
        private static void OnRequestComplete(IAsyncResult ar)
        {
            try
            {
                DdeClient client = (DdeClient)ar.AsyncState;
                byte[] data = client.EndRequest(ar);
                Console.WriteLine("OnRequestComplete: " + Encoding.ASCII.GetString(data));
            }
            catch (Exception e)
            {
                Console.WriteLine("OnRequestComplete: " + e.Message);
            }
        }
....

other NDde applications [C#][WinForm]利用程式使用DDE(Dynamic Data Exchange)來打開PDF or ExcelViewer自動列印PDF or Excel檔案 [Office][C#]使用動態資料交換 (DDE) 將 EXCEL 檔案輸出至印表機進行列印

2010年5月19日 星期三

RealDDE 4 FuBon ... update lists

RealDDE 原理 http://funningboy.blogspot.com/2010/05/real-4-fubon-dde.html RealDDE + EntryRule(策略分析) http://funningboy.blogspot.com/2010/05/cdp-from-tsts.html 1. RealDDE 參數說明 my $QU = QUInfo->new(); $QU->QU_SIZ(10); // 定義Queue Size, 盡量不要設太大. $QU->QU_PT_OK_LAT(2); // 定義sample 的時間點, 目前是每兩秒 sample一次 $QU->QU_PT_NO_LAT(1); // 定義如果Queue滿了,要Delay多久在Return $QU->QU_GT_OK_LAT(0); // 定義 Put 到(策略)要Delay 多久, Default 0 $QU->QU_GT_NO_LAT(1); // 定義 Queue Empty時,要Delay多久在Return 2. 加入 Backup機制 如果DDESer Crack, 可以藉由歷史資料回補. 3. Include 轉檔好的 "期交所前日交易資料" 期交所 K 棒轉檔 4 upload 期貨契約 4 期交所 4. 加入 Normal Function Highest('high',Length,D); Lowest('low',Length,D); ...

2010年5月18日 星期二

CDP 當沖程式 From TSTS星人

Target: Port TS 2 Our RealDDE Advantages : 1. flexible (NO TS, Met Server...) 2. Faster (Direct Link in Fubon DDE Server) 3. Memory (Memory Size Define by User) 4. replaceable (user can replace the entry rule easily) Disadvantages: 1. Cracker Fubon DDE Server is not stable, we should rerun it by hand. No automatic run. 2. CPU time / Memory if the Memory Size is so Deep, that would influence our performance and throughput. Sample Case: 分成兩大部分, RealDDE, TS->RealDDE(portable) RealDDE: 請參考 http://funningboy.blogspot.com/2010/05/real-4-fubon-dde.html TS->RealDDE(portable): 是用 TSTS星人所寫的 CDP 當沖程式(TS),改寫成我們的Format,且能跟RealDDE做結合. 可參考 TSTS 星人所寫的 CDP當沖程式跟原理. http://ts8.blogspot.com/2009/09/cdp.html?showComment=1273498372696#c4508543946141294345
PS: 回測績效請參考 TSTS星人用 (TS)跑的回測,這邊我們只是做Map的教學, 讓使用者能夠寫策略跟RealDDE做Link. Result:
PS: 本系統不俱自動下單功能,只有提示跟警示功能.

2010年5月17日 星期一

RealDDE 4 Fubon Server...

Target: 利用Real Time 的 DDE 做即時的進場/出場判斷機制. DDE 4 FuBon(富邦) 一些基本的定義,可參考底下的連結. http://funningboy.blogspot.com/2010/02/dde-server-for-stock.html Design Flow: Advantages: 1.利用 Thread 的方式增加系統的效能. 2.Entry Rule 可針對特定的StockID 有不同的進出場方式. 3.利用Queue來增加系統的穩定性,避免Latency 4 Proc, 拖垮系統的效能. CostFunc: Memory(記憶體), CPU Time處理速度...

Sample : 底下用最簡單的 Sample 當例子. Entry Rule : 當連續10筆資料中, 出現 "成交價 大於 買進價 且 成交量 大於等於 100 的次數" 大於 10*2/3=6 次, 就告知可以做買進的動作. 當然你也可以自己定義你的進出場訊號.最後在接回Display, 或者是 Internet 傳送.... Code
use Class::Struct; #use strict; use Win32::DDE::Client; use Win32::DDE; use Data::Dumper; use threads qw(yield); use Thread; use Thread::Queue; use threads::shared; #no warnings 'threads'; # example 4 2330.TW ########################################################## #2330.TW-ID //&#20195;&#30908; #2330.TW-Name //&#21830;&#21697; #2330.TW-Time //&#26178;&#38291; #2330.TW-Bid //&#36023;&#36914; #2330.TW-Ask //&#36067;&#20986; #2330.TW-Price //&#25104;&#20132; #2330.TW-Volume //&#21934;&#37327; #2330.TW-TotalVolume //&#32317;&#37327; #2330.TW-High //&#26368;&#39640; #2330.TW-Low //&#26368;&#20302; #2330.TW-AvgPrice //&#22343;&#20729; ########################################################## # DDE Info definition struct( DDEInfo => { DDE_SER => '$', DDE_HOST => '$', }); my $DDE = DDEInfo->new(); $DDE->DDE_SER('XQFAP'); $DDE->DDE_HOST('Quote'); # Stock info 4 FuBon definition struct( STInfo => { ST_ID => '$', ST_NM => '$', ST_TM => '$', ST_BID=> '$', ST_ASK=> '$', ST_PRC=> '$', ST_VOL=> '$', ST_HIG=> '$', ST_LOW=> '$', }); # Queue Definition 4 DDE 2 Entry struct ( QUInfo => { QU_SIZ => '$', QU_PT_OK_LAT=> '$', QU_PT_NO_LAT=> '$', QU_GT_OK_LAT=> '$', QU_GT_NO_LAT=> '$', }); my $QU = QUInfo->new(); $QU->QU_SIZ(5); $QU->QU_PT_OK_LAT(1); $QU->QU_PT_NO_LAT(2); $QU->QU_GT_OK_LAT(1); $QU->QU_GT_NO_LAT(2); # Buffer Definition 4 Entry struct ( BUFInfo => { BUF_SIZ => '$', }); my $BUF = BUFInfo->new(); $BUF->BUF_SIZ(10); #==============================================# # Create Each Thread 4 StockID #==============================================# open (iStockIDPtr, "../../StockList.csv") die "Open StockList Error\n"; while(<iStockIDPtr>){ chomp; my $StockID = $_; my $q = Thread::Queue->new(); my $thr1 = threads->create(\&GetQueue,$StockID,$q); my $thr2 = threads->create(\&PutQueue,$StockID,$q); } #=============================================# # Run And Display #=============================================# for(;;){ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $MyEndTime = $year."/".$mon."/".$mday."/".$hour."::".$min."::".$sec; print "OK...".$MyEndTime."\n"; sleep 60; } sub PutQueue :locked { my $StockID = $_[0]; my $q = $_[1]; for(;;){ if($q->pending()<=$QU->QU_SIZ()){ my $t= &GetStockInfo($StockID); $q->enqueue($t); yield; sleep $QU->QU_PT_OK_LAT(); } else { yield; sleep $QU->QU_PT_NO_LAT(); } } } sub GetQueue :locked { my $StockID = $_[0]; my $q = $_[1]; for(;;){ if($q->pending()!=0 ){ $t = $q->dequeue; GetEntryInfo($StockID,$t); yield; sleep $QU->QU_GT_OK_LAT(); } else{ yield; sleep $QU->QU_GT_OK_LAT(); } } return $t; } sub GetStockInfo { my $StockID = $_[0]; my $Client = new Win32::DDE::Client ( $DDE->DDE_SER(), $DDE->DDE_HOST() ); die "Unable to initiate conversation" if $Client->Error; my ($ID,$NM,$TM,$BID,$ASK,$PRC,$VOL,$HIG,$LOW) = (-1,-1,-1,-1,-1,-1,-1,-1,-1); defined ( $ID = $Client->Request ($StockID.'-ID')) print "Error ID request\n"; defined ( $NM = $Client->Request ($StockID.'-Name')) print "Error NM request\n"; defined ( $TM = $Client->Request ($StockID.'-Time')) print "Error TM request\n"; defined ( $BID = $Client->Request ($StockID.'-Bid')) print "Error BID request\n"; defined ( $ASK = $Client->Request ($StockID.'-Ask')) print "Error ASK request\n"; defined ( $PRC = $Client->Request ($StockID.'-Price')) print "Error PRC request\n"; defined ( $VOL = $Client->Request ($StockID.'-Volume')) print "Error VOL request\n"; defined ( $HIG = $Client->Request ($StockID.'-High')) print "Error HIG request\n"; defined ( $LOW = $Client->Request ($StockID.'-Low')) print "Error LOW request\n"; my $t = STInfo->new(); $t->ST_ID($ID); $t->ST_NM($NM); $t->ST_TM($TM); $t->ST_BID($BID); $t->ST_ASK($ASK); $t->ST_PRC($PRC); $t->ST_VOL($VOL); $t->ST_HIG($HIG); $t->ST_LOW($LOW); return $t; } sub GetEntryInfo { my $StockID = $_[0]; my $t = $_[1]; my @ArrPtr = @{$BufHsPtr{$StockID}}; if( $#ArrPtr == $BUF->BUF_SIZ() ){ #print Dumper(\@ArrPtr); my $cot =0; for(my $i=0; $i<=$#ArrPtr; $i++){ if( $ArrPtr[$i]->ST_PRC() > $ArrPtr[$i]->ST_BID() && $ArrPtr[$i]->ST_VOL >= 100 ){ $cot++;} } if( $cot >= $#ArrPtr*2/3 ){ print "Found ::".$StockID." count( PRC>BID &&VOL >=100 )\n"; } shift( @{$BufHsPtr{$StockID}} ); } else { push ( @{$BufHsPtr{$StockID}}, $t); } }
code download http://sites.google.com/site/funningboy/perl_code/realtime3.pl?attredirects=0&d=1 PS: 轉碼後,中文註解部分是出現亂碼....

2010年5月4日 星期二

期貨契約 4 期交所

底下是對台指期留倉(未平倉,交易口數與契約金額) 的資料下載, 可以使用底下的程式抓期交所的 Data. 我們是透過 HTML parse 出我們要的Data. Link可參考 http://www.taifex.com.tw/chinese/3/7_12_3.asp 如果是對當日的成交筆數或者是每分K線有興趣可以參考 http://funningboy.blogspot.com/2010/04/k.html 程式碼 :
#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::UserAgent;
use XML::Simple;
use Data::Dumper;
use HTML::TableExtract;

my %GbHsPtr;

GetHtml();
Exp2Exl();

sub GetHtml{
   
    my $ua = LWP::UserAgent->new;
    $ua->agent("MyApp/0.1");

    my $req = HTTP::Request->new(POST => 'http://www.taifex.com.tw/chinese/3/7_12_3.asp');
    my $res = $ua->request($req);
    return unless $res->is_success;
   
    #print $res->content();
    my $html_string = $res->content();
 
 my $te = HTML::TableExtract->new( depth => 4, count => 0);
    $te->parse($html_string);
 
 my $cot=0;
 my ($ID,$NM,$BYER,$TBC,$TBM,$TSC,$TSM,$TBSC,$TBSM,$RBC,$RBM,$RSC,$RSM,$RBSC,$RBSM);
 my ($NID,$NNM);

 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $year += 1900;
      $mon  += 1;
      
      if($mon<10){  $mon="0".$mon}
      if($mday<10){ $mday="0".$mday;}
      
my  $oMyFile = "../rem/".$year."_".$mon."_".$mday.".csv";
open (oMyFilePtr,">$oMyFile") || die "open oMyFile(Rem) Error";

 foreach my $ts ($te->tables) {
    foreach my $row ( $ts->rows ) { 
         my $st = join('.',@{$row});
            $st =~ s/\,//g; $st =~ s/\s+//g; $st=~ s/\./\,/g;
             
            printf oMyFilePtr ($st."\n");
           
          if($cot>=3 && $cot<=$#{$ts->rows}-4){
              ($ID,$NM,$BYER,$TBC,$TBM,$TSC,$TSM,$TBSC,$TBSM,$RBC,$RBM,$RSC,$RSM,$RBSC,$RBSM) = split(',',$st);
               
               if( $ID || $NM ){ ($NID,$NNM)=($ID,$NM); }
               else{             ($ID,$NM) = ($NID,$NNM)}
     
              $GbHsPtr{$NM}{$BYER} = {
                 "TBC" => $TBC,
                 "TBM" => $TBM,
                 "TSC" => $TSC,
                 "TSM" => $TSM,
                 "TBSC" => $TBSC,
                 "TBSM" => $TBSM,
                 "RBC"  => $RBC,
                 "RBM"  => $RBM,
                 "RSC"  => $RSC,
                 "RSM"  => $RSM,
                 "RBSC" => $RBSC,
                 "RBSM" => $RBSM,
                };
              }
              
          $cot++;
         }
      }
#    print Dumper (\%GbHsPtr);
}

sub Exp2Exl {
 
  my ($NM,$BYER,$file,$by);
  my %lt = (
    "&#33274;&#32929;&#26399;&#36008;" => "txf",
    "&#38651;&#23376;&#26399;&#36008;" => "exf",
    "&#37329;&#34701;&#26399;&#36008;" => "fxf",
    "&#23567;&#22411;&#33274;&#25351;" => "mxf",
  );
 
  my %By = (
    "&#33258;&#29151;&#21830;"     => "internal_bank",
    "&#25237;&#20449;"       => "internal_stock",   
    "&#22806;&#36039;&#21450;&#38520;&#36039;" => "external_stock",
    );
 
 my $oMyfile;
    foreach ( keys %GbHsPtr ){
        $NM =$_;
       
        if( defined($lt{$NM})){
            $file = $lt{$NM};
          
          foreach ( keys %{$GbHsPtr{$NM}} ){
              $BYER = $_;
              $by = $By{$BYER};
              
              $oMyfile = "../rem/".$file."/".$by.".csv";
              open(oMyFilePtr,">>$oMyfile") || die "open $oMyfile Error\n";
              
              my $TBC = $GbHsPtr{$NM}{$BYER}{"TBC"};
              my $TBM = $GbHsPtr{$NM}{$BYER}{"TBM"};
        my $TSC = $GbHsPtr{$NM}{$BYER}{"TSC"};
        my $TSM = $GbHsPtr{$NM}{$BYER}{"TSM"};
        my $TBSC = $GbHsPtr{$NM}{$BYER}{"TBSC"}
        my $TBSM = $GbHsPtr{$NM}{$BYER}{"TBSM"};
        my $RBC  = $GbHsPtr{$NM}{$BYER}{"RBC"};
        my $RBM  = $GbHsPtr{$NM}{$BYER}{"RBM"};       
        my $RSC  = $GbHsPtr{$NM}{$BYER}{"RSC"};   
        my $RSM  = $GbHsPtr{$NM}{$BYER}{"RSM"};   
        my $RBSC  = $GbHsPtr{$NM}{$BYER}{"RBSC"};     
        my $RBSM  = $GbHsPtr{$NM}{$BYER}{"RBSM"};   

              printf oMyFilePtr ("$TBC,$TBM,$TSC,$TSM,$TBSC,$TBSM,$RBC,$RBM,$RSC,$RSM,$RBSC,$RBSM\n");
             }
        }
    }
}
 
或者你可以下載打包好的 Path, 會有 code, rem, cur的資料夾 %code : 程式碼 %cur : 每日的 1分K 線 (可以自行定義成 5分K線) %rem : 成交筆數跟未平倉Data 使用步驟 %source fu_ticket.sh Download http://sites.google.com/site/funningboy/perl_code/future_v1.rar?attredirects=0&d=1

2010年5月3日 星期一

Shark Report 2010_04 && Future Works

work items 1. 台指期判斷機制, 藉由台指期轉檔器產生每日的壓力位置. 2. 留倉趨勢分析, 分析每日法人留倉的部位跟 T-n日的趨勢分析. 3. 建立避險機制, 如果空單過多, 則不做任何動作, 等籌碼穩定在動作.

2010年4月28日 星期三

Poison Candy

Poison Candy: Target: 1. 分析券商說的是真的還假的....不要傻傻的被騙摟.... 2. 找出券商跟股票的相關性, 判斷股價漲跌是否有特別的券商在炒作. tool: DDE : http://funningboy.blogspot.com/2010/02/sdde-server-v1.html Indicator : http://funningboy.blogspot.com/2010/03/auto-indicator-4-excel.html Google News: http://funningboy.blogspot.com/2010/04/googlenews.html Parameter Value CoFactorCls2Opn : 券商買賣超對open(開盤價)的影響 CoFactorCls2Hig : 券商買賣超對Close(收盤價)的影響 CoFactorCls2Lw : 券商買賣超對Low(最低價)的影響 Rule: ((open(t-1) - open(t)) > 0 && TraderID_Sell )? CoFactorCls2Opn++: CoFactorCls2Open--; 表示 券商(ID) 如果賣超,且今日開盤價低於昨日開盤價, CoFactorCls2Opn++; 反之 CoFactorCls2Opn--; Case 4 2324(仁寶) sheet : 2324_1440 : 仁寶 對 美林 的相關係數 sheet : 2324_1440 : 仁寶 對 瑞士信貸 的相關係數 sheet : 2324_total : 仁寶對 主力券商 相關係數 ex: (1440:美林) 券商ID 可到底下查詢: http://justdata.yuanta.com.tw/Z/ZG/ZGB/ZGB.asp.htm Rst: 發現 瑞士信貸, 美林, 高盛 對仁寶的 cofactor 影響很大, 且 港商麥格里 在低檔承接. Case 4 2330(台積電) Result : 每家券商都有各自擅長的股票操作方式, 藉由分析方式找到適當的進場位置.

2010年4月27日 星期二

2010年4月26日 星期一

期交所 K 棒轉檔 4 upload

Design Flow : PS: 轉檔器我們是用"Redjoe"所寫的台指期轉檔器在加以改良,加入upload file的功能, 提供下載備份跟回測的Data source. 轉檔器請參考 : Ref: http://redjoetseng.blogspot.com/ upload file : Google DOC api http://code.google.com/intl/zh-TW/apis/documents/docs/developers_guide.html Google DOC upload samle http://funningboy.blogspot.com/2010/03/google-upload-2-google-doc.html file Path: txf : 台指 mxf : 小台 fxf : 金指期 exf : 電指期 code : code location sample code : GoogleDOC.pl 4 upload my $upload_exf = &UpLoadFile($token,'exf','0B6XEwxVW8qCqZjBkYTgzMTQtMjBkMy00YjUwLTliMDAtNzZlODlhMmI5MzU5'); 紅色部分為upload的folder ID, sample code download http://sites.google.com/site/funningboy/perl_code/code.rar?attredirects=0&d=1 PS: 有需要的人我在開Share

2010年4月24日 星期六

GoogleNews....

Target : 在股票分析法則下,我們分成三大層面來分析, 分別是"技術", "基本", "新聞",用此來決定這隻股票本質的好壞. Ex: Case 1 Entry Point = 0.5*技術 + 0.3*基本 + 0.2*新聞 Case 2 Entry Point = 0.2*技術 + 0.5*基本+ 0.3*新聞 Case 1 >= 0,5 ? Entry : NOP Case 2 > 0.7 ? Entry : NOP 在Case 1, Case 2下,分別代表我們對這3個影響因子的比重. 在Case 1中表示 技術 > 基本 > 新聞,在技術線型( KD, RSI, WR, OBV...)對我們來說特別重要,只要Case 1的結果 >=0.5 就進場,不然就等待(NOP). 以此類推Case 2 Previous Case: 假設"基本", "技術"都為已知的, 這邊只討論如何處理"新聞面"的資訊 基本, 技術 可參考 http://funningboy.blogspot.com/search/label/stock Ref: http://www.perl.com/pub/a/2006/01/19/analyzing_html.html http://search.cpan.org/~tbone/HTML-Element-Library-4.2.b/lib/HTML/Element/Library.pod PS: Perl regular expression 中文處理 ([^<]*) 中文處理 Big5 -> UTF8 http://www.jeffhung.net/blog/articles/jeffhung/417/ sample code:
sub get_news_for_topic {

    my $topic = $_[0];

    my $url = "http://news.google.com.tw/news?hl=zh-TW&ned=ttw&q=$topic";
    my $ua = LWP::UserAgent->new();
    $ua->agent('Mozilla/5.0');

    my $response = $ua->get($url);
   return unless $response->is_success;

    my $content = $response->decoded_content;
    $content = $response->content if (not defined $content);
   
   #$content = encode('utf-8', decode('big5', $content));
 
   $content =~ s/<font color=\"\#CC0033\">//g;
   $content =~ s/<\/font>//g;
   
  my $tree = HTML::TreeBuilder::XPath->new;
     $tree->parse($content);
     $tree->eof;
     #$tree->dump;
   
     my $items=$tree->findnodes_as_string( '//div[@class[.=~/story/]]');
   
     my @class = split("
\n",$items);
    #  print $class[1];
     my $stu;
     my ($href,$title,$date,$st,$ID);
     my %result;
     $ID =0;

     for( my $i=0; $i <= $#class; $i++){
            if($class[$i] =~ m/href=\"(\S+)\"/                              ){ $href  = $1; $stu=1; }
            if($class[$i] =~ m/target=\"_blank\">([^<.]*)<\/a><\/h2>/       ){ $title = $1; $stu=2; }
            if($class[$i] =~ m/span class=\"date \">&#8206;([^<.]*)<\/span><\/div>/){ $date  = $1; $stu=3; }
            if($class[$i] =~ m/class=\"snippet\">([^<.]*)<b>\.\.\.<\/b>/    ){ $st    = $1; $stu=4; }
           
            if($stu==4){
                 $result{$ID} = {
                   "
href"   => $href,
                   "
title"  => $title,
                   "
date"   => $date,
                   "
st"     => $st,
                 };
                $ID++;
           }
     }
     
    $tree->delete;
   
    return \%result;
}
 
結果 date::2010年4月21日 title::富比世全球2000大企業 台灣39家入榜 鴻海排名最高 st:: 排名最高的是第176 名的電子代工龍頭鴻海(2317-TW),其次分別為台積電(2330-TW)、台塑(1301-TW)、中鋼(2002-TW)、中華電信(2412-TW) 與友達(2409-TW)等。 特別的是,總排名第810 名的宏碁(2353-TW),同時也列名130 家「全球成長表現優異」(Global High Performer) 排行榜 href::http://news.cnyes.com/Content/20100422/KC8Q1MUMP84VU.shtml?c=tw_stock sample code download http://sites.google.com/site/funningboy/perl_code/GoogleNews.pl?attredirects=0&d=1