作為一個(gè)退役的碼農(nóng),老是BB這些東西,真是討厭,即不專業(yè),又不有趣,可是我還是勇往直前的記錄到第5篇,臉皮之厚難以想象。
這個(gè)DEMO同樣是VC++的控制臺(tái)程序,程序?qū)崿F(xiàn)了20個(gè)品種、兩個(gè)策略。
總的數(shù)據(jù)處理在DataSniffer.h文件,總的交易處理在MyTrader.h文件,因?yàn)槭嵌嗥贩N和多策略,增加了幾個(gè)文件。每一個(gè)品種對(duì)應(yīng)一個(gè)品種的數(shù)據(jù)處理文件DataSniffer_A.h和DataSniffer_B.h;每個(gè)策略對(duì)應(yīng)一個(gè)策略文件strategy_A.h,strategy_B.h。
一、在程序入口
在入口文件里,保存了我們要交易的品種
char *ppInstrumentID[] = { "i1601", "jm1601", "j1601", "rb1601","rb1501", "TA601", "l1601","ru1601", "ru1501", "jd1601", "RM601", "m1601","y1501", "p1501","ag1506","ag1412","cu1408","cu1601","IF1601","IF1407"};//行情訂閱列表
和前面demo提到的一樣,建立連接后,OnRtnDepthMarketData函數(shù)進(jìn)行保存數(shù)據(jù)。
OnRtnDepthMarketData在文件MdSpi.cpp里,這次系統(tǒng)不但有tick數(shù)據(jù),還計(jì)算了分鐘K線的數(shù)據(jù),還計(jì)算了日線的數(shù)據(jù)。
系統(tǒng)建立了一個(gè)兩維數(shù)組tick_data[20][10],保存20個(gè)品種的連續(xù)tick的數(shù)據(jù),這個(gè)數(shù)組還記錄其它一些重要信息。系統(tǒng)對(duì)tick數(shù)據(jù)進(jìn)行了文件保存,在TickData目錄下。
系統(tǒng)還有Mn_open[]等數(shù)據(jù),保存1分鐘K線的數(shù)據(jù),共保存了60分鐘。沒(méi)有進(jìn)行文件保存。
系統(tǒng)還有Day_open[]等數(shù)據(jù),保存日K線的數(shù)據(jù)。沒(méi)有進(jìn)行文件保存。
二、接著進(jìn)行行情監(jiān)控和交易
while(RunMode) //實(shí)盤
{
Sniffer();//數(shù)據(jù)
Trading();//交易
Sleep(050);
}
三、數(shù)據(jù)處理
Sniffer函數(shù)DataSniffer.h文件里,他進(jìn)行數(shù)據(jù)的計(jì)算和給出交易信號(hào),針對(duì)每個(gè)品種,都計(jì)算了兩個(gè)策略的信號(hào)。
for (int i = 0; i < 20; i++)//他是每個(gè)品種,都調(diào)用一下兩個(gè)策略
{
......
Sniffer_A12(i); //針對(duì)品種i,進(jìn)行策略A的計(jì)算
Sniffer_B12(i); //針對(duì)品種i,進(jìn)行策略B的計(jì)算
......
}
策略A的計(jì)算函數(shù)Sniffer_A12在文件DataSniffer_A.h里,計(jì)算邏輯是這樣的:當(dāng)早上9:10的1分鐘K線收陽(yáng)時(shí),他將標(biāo)志為設(shè)為1,即是做多信號(hào)。Sniffer_dataA[i][0] = 1;如果收陰,則是做空信號(hào)。
策略B的計(jì)算函數(shù)Sniffer_B12在文件DataSniffer_B.h里,策略B是一個(gè)tick級(jí)別的信號(hào),上次DEMO里講過(guò),不展開(kāi)。
四、交易處理
Trading函數(shù)進(jìn)行交易處理,他在文件MyTrader.h里。
它針對(duì)每個(gè)品種,進(jìn)行兩個(gè)策略的交易處理。
for (int i = 0; i < 20; i++)
{
StopEndTime_A(tick_data[i][2],i);//策略A的收盤前平倉(cāng)
StopEndTime_B(tick_data[i][2],i);//策略B的收盤前平倉(cāng)
......
StopLossA12(tick_data[i][2],i); //策略A先進(jìn)行止贏止損
TraderA12(tick_data[i][2],i); //策略A進(jìn)行委托交易
......
StopLossA12(tick_data[i][2],i); //策略B先進(jìn)行止贏止損
TraderA12(tick_data[i][2],i); //策略B進(jìn)行委托交易
......
}
1、它先判斷當(dāng)前是不是快收盤了,如果快收盤了,平掉所有倉(cāng)位。StopEndTime里有,還有一個(gè)持倉(cāng)超過(guò)10分鐘,主動(dòng)平倉(cāng)的功能。
2、StopLossA12的邏輯是這樣:當(dāng)達(dá)到一定贏利點(diǎn)數(shù),他做止贏利。當(dāng)虧損達(dá)到一定點(diǎn)數(shù),則做止損。他是根據(jù)1分鐘的數(shù)據(jù)進(jìn)行處理的,相當(dāng)于1分鐘K線走完進(jìn)行處理。這個(gè)1分鐘K線變量Mn_open。
3、TraderA12的邏輯是這樣:先判斷之前是做多還是做空信號(hào),如果是做多的信號(hào)(Sniffer_dataA[i][0] = 1),有反向單則先平掉反向單,然后開(kāi)倉(cāng)(此時(shí)系統(tǒng)又增加了一些判斷和過(guò)濾條件)。
策略B的邏輯StopLossB12和TraderB12和上一篇中的demo是類似的。
五:幾個(gè)細(xì)節(jié)
1:系統(tǒng)記錄每次開(kāi)平時(shí)的價(jià)格,并計(jì)算了每次的贏虧情況,保存在Day_CloseProfit、Trade_CloseProfit這些變量里。如果有需要,策略回測(cè)時(shí),計(jì)算績(jī)效也可以沿用相同的計(jì)算邏輯。
2:系統(tǒng)啟動(dòng)時(shí),有讀本地配置文件,關(guān)閉時(shí)也會(huì)寫本地配置文件。這個(gè)日志,可以進(jìn)行功能拓展,幫助系統(tǒng)恢復(fù)上次關(guān)閉時(shí)的策略狀態(tài)。
系統(tǒng)啟動(dòng)起來(lái)是這樣