金字塔決策交易系統(tǒng)—高級(jí)教程(____修訂版).docx_第1頁(yè)
金字塔決策交易系統(tǒng)—高級(jí)教程(____修訂版).docx_第2頁(yè)
金字塔決策交易系統(tǒng)—高級(jí)教程(____修訂版).docx_第3頁(yè)
金字塔決策交易系統(tǒng)—高級(jí)教程(____修訂版).docx_第4頁(yè)
金字塔決策交易系統(tǒng)—高級(jí)教程(____修訂版).docx_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

上海金之塔信息技術(shù)有限公司2016金字塔決策交易系統(tǒng)高級(jí)教程l 本教程主要介紹金字塔的后臺(tái)程序化交易,VBA、C+二次開(kāi)發(fā)的編程。目錄目錄2第一章 金字塔的后臺(tái)程序化交易11.1后臺(tái)程序化工作機(jī)理11.2 后臺(tái)程序化交易函數(shù)21.3 后臺(tái)套利模型范例51.4 后臺(tái)程序化的啟用71.5 后臺(tái)程序化的調(diào)試81.6 后臺(tái)程序化注意事項(xiàng)10第二章 圖表交易和后臺(tái)交易的主要區(qū)別和聯(lián)系122.1 圖表、交易函數(shù)的區(qū)別122.11 圖表交易函數(shù)122.12 后臺(tái)交易函數(shù)122.3圖表交易和后臺(tái)交易的主要區(qū)別13第三章 基于VBA的二次開(kāi)發(fā)143.1金字塔VBA與OFFICE VBA區(qū)別和聯(lián)系143.2 VBA 原理的隱喻143.3 VBA 簡(jiǎn)介153.3.1VBA 及其IDE 初步153.3.2模塊、函數(shù)和過(guò)程183.3.3數(shù)據(jù)類(lèi)型和變量203.3.4VBA 語(yǔ)言基礎(chǔ)233.3.5用戶窗體293.4金字塔的對(duì)象模型333.4.1Application 對(duì)象343.4.2Order 對(duì)象363.4.3MarketData 對(duì)象453.4.4 ReportData對(duì)象493.4.5 HistoryData 對(duì)象503.4.6 Document對(duì)象523.4.7 Frame 對(duì)象543.4.8 Grid對(duì)象563.4.9 Formula 對(duì)象623.4.10 NetWork 對(duì)象633.4.11 TestReport 對(duì)象65第四章 VBA實(shí)用范例754.1 跨期套利交易范例754.2 金字塔VBA指標(biāo)調(diào)用數(shù)據(jù)庫(kù)教程764.2.1數(shù)據(jù)庫(kù)的準(zhǔn)備工作(vba使用數(shù)據(jù)庫(kù)首先我們需要連接數(shù)據(jù)庫(kù))764.2.2 數(shù)據(jù)庫(kù)操作方法(具體代碼和注釋?zhuān)?7第五章 基于C+二次開(kāi)發(fā)855.1使用金字塔C+ API開(kāi)發(fā)策略的優(yōu)勢(shì)855.2金字塔的C+ API與主程序的組織結(jié)構(gòu)865.3金字塔的接口范例下載與簡(jiǎn)要說(shuō)明865.3.1 API接口報(bào)價(jià)行情訂閱865.3.2報(bào)價(jià)行情變化通知875.3.3獲取指定市場(chǎng)全部合約報(bào)價(jià)875.3.4歷史數(shù)據(jù)的獲取875.3.5下單委托指令885.3.6訂單狀態(tài)推送回報(bào)885.3.7策略編寫(xiě)調(diào)試與跟蹤895.3.8API接口更多功能信息90第六章 自定義PEL函數(shù)916.1 使用VBA自定義PEL函數(shù)916.1.1自定義函數(shù)的格式916.1.2自定義函數(shù)的兩種工作模式926.2 使用C+DLL擴(kuò)展函數(shù)程序調(diào)用94第一章 金字塔的后臺(tái)程序化交易金字塔提供功能性和擴(kuò)展性更為強(qiáng)大的基于后臺(tái)預(yù)警模式的程序化交易模式(后臺(tái)程序化),可以在不影響用戶前臺(tái)圖形操作的情況下,高效地與預(yù)警系統(tǒng)一起工作,實(shí)現(xiàn)自動(dòng)交易。由于該模式運(yùn)行在后臺(tái),不需要打開(kāi)圖表占用過(guò)多的資源,且只需最后一個(gè)周期的信號(hào),所以原則上公式不做多余計(jì)算,效率高,便于對(duì)多個(gè)品種同一個(gè)策略進(jìn)行輪循監(jiān)控。從某種意義講,后臺(tái)程序化屬于圖表程序的深化,它的優(yōu)點(diǎn)是更注重于策略的高效執(zhí)行,更完美地實(shí)現(xiàn)策略的設(shè)計(jì)初衷。雖然后臺(tái)程序化的功能強(qiáng)大,但用戶切忌直接使用后臺(tái)策略,而跳過(guò)學(xué)習(xí)圖表程序化的過(guò)程。原因是在后臺(tái)程序化中用戶無(wú)法直接在圖表上看到信號(hào)的整個(gè)出現(xiàn)過(guò)程,因此對(duì)用戶的公式編寫(xiě)水平有一定的要求。其次,用戶需要對(duì)金字塔的后臺(tái)交易系統(tǒng)工作機(jī)理有比較深的了解,并且要對(duì)自己的公式系統(tǒng)有清晰的認(rèn)識(shí),這樣一旦遇到問(wèn)題也能及時(shí)找到原因。后臺(tái)交易過(guò)程中,一旦遇到問(wèn)題,需要客戶掌握第八章后臺(tái)程序化交易調(diào)試的技巧。以我們多年的經(jīng)驗(yàn)來(lái)看,用戶先將策略經(jīng)測(cè)評(píng)、優(yōu)化、圖表實(shí)盤(pán)上運(yùn)行后,再轉(zhuǎn)化成后臺(tái)策略,會(huì)取得非常好的效果。1.1后臺(tái)程序化工作機(jī)理在初級(jí)教程中,我們介紹了基于虛擬數(shù)據(jù)技術(shù)的圖表程序化交易。想必經(jīng)過(guò)一段時(shí)間的學(xué)習(xí),大家已將圖表程序化運(yùn)用的相當(dāng)純熟。不過(guò)當(dāng)你進(jìn)行實(shí)盤(pán)的時(shí)候,是否發(fā)現(xiàn)在某些情況下,例如碰到未成交單、未完全成交單、需要進(jìn)行追撤單等更精細(xì)的下單操作時(shí),圖表程序化就束手無(wú)策了。這是由于圖表基于虛擬數(shù)據(jù)的特性,無(wú)法與真實(shí)賬戶進(jìn)行交互,虛擬數(shù)據(jù)的成交并不考慮實(shí)盤(pán)的的流動(dòng)性情況,只要價(jià)格達(dá)到即成交。而實(shí)際情況可能并不是這樣。另一方面,當(dāng)圖表程序化碰上多品種、多策略、或者較復(fù)雜的策略時(shí),有時(shí)系統(tǒng)會(huì)顯得相對(duì)較慢、不流暢。這是由于圖表需要計(jì)算大量以往的歷史數(shù)據(jù)進(jìn)行判斷操作,并在圖表上進(jìn)行輸出。這消耗了相當(dāng)多的資源。但實(shí)盤(pán)并不需要考慮歷史曾經(jīng)如何,實(shí)時(shí)交易需要考慮的是如何高效的執(zhí)行,其實(shí)只需根據(jù)最后一根K線上的數(shù)據(jù),來(lái)確定開(kāi)平倉(cāng)的動(dòng)作。這也就是例如DYNAINFO等這些常數(shù)函數(shù)無(wú)法進(jìn)行測(cè)評(píng)而實(shí)盤(pán)的公式確可以用的主要原因,因?yàn)镈YNAINFO只有最新的一筆行情數(shù)據(jù),而沒(méi)有歷史的序列數(shù)據(jù)。金字塔后臺(tái)程序化也是這個(gè)道理,因?yàn)榻鹱炙暮笈_(tái)程序化只注重交易,因此無(wú)法用來(lái)測(cè)評(píng)??偨Y(jié)一下,金字塔的后臺(tái)程序化交易是金字塔很大的特色。從工作機(jī)制的角度看,后臺(tái)程序化在沿用PEL語(yǔ)言體系的情況下,為用戶創(chuàng)造了近似VB、C+才能達(dá)到的精細(xì)化、高效快捷程序化下單模式。因此它特別適合那些多周期、多策略、多品種的組合交易以及對(duì)效率要求較高的套利交易,為您的交易帶來(lái)無(wú)與倫比的便捷。1.2 后臺(tái)程序化交易函數(shù)金字塔的后臺(tái)程序化交易只能在專(zhuān)業(yè)版及更高級(jí)的版本中使用,它可以運(yùn)行在序列和逐K線兩種模式,但是推薦序列模式運(yùn)行,這樣可以極大提高后臺(tái)執(zhí)行的效率。為了讓用戶更快的編寫(xiě)和熟悉金字塔的后臺(tái)程序化交易,金字塔的程序化交易函數(shù),前面都在交易系統(tǒng)函數(shù)名稱(chēng)前加 T 字母,比如BUY改為T(mén)BUY, 使用方法大致相同,用戶仔細(xì)注意查看函數(shù)的使用說(shuō)明。與圖表交易系統(tǒng)函數(shù)不同的是,后臺(tái)程序化交易的函數(shù)都使用實(shí)際的用戶持倉(cāng)和資金。讓我們通過(guò)案例來(lái)學(xué)習(xí)后臺(tái)程序化交易函數(shù)。例1:MA指標(biāo)后臺(tái)公式/中間變量MA3:MA(C,3);MA5:MA(C,5);/交易系統(tǒng)TBUY(CROSS(MA3,MA5),1,LMT,C); /按照最新價(jià)限價(jià)開(kāi)多TSELL(CROSS(MA5,MA3),0,LMT,C);/按照最新價(jià)限價(jià)平多,0表示平掉全部持倉(cāng)請(qǐng)注意TBUY和TSELL函數(shù)的參數(shù)出現(xiàn)了變化,真正的下單時(shí),需要指定下單類(lèi)型和價(jià)格的,否則系統(tǒng)會(huì)按照市價(jià)進(jìn)行交易。 用以模擬交易的函數(shù)和真實(shí)交易的函數(shù),大部分只是有了前面T字母差別,大部分的用以交易評(píng)測(cè)的交易系統(tǒng),只要將交易函數(shù)部分前面加T字母即可解決,唯一區(qū)別最大的就是TBUY,TSELL,TBUYSHORT,TSELLSHORT 這4個(gè)函數(shù)與模擬交易用的函數(shù)區(qū)別較大,請(qǐng)仔細(xì)辨別。請(qǐng)注意后臺(tái)程序化交易不能使用圖表交易功能,且圖表交易和后臺(tái)交易的函數(shù)不能混用。交易控制符 THISCLOSE 在真實(shí)交易中被 LMT 等真實(shí)交易控制符所取代,金字塔的模擬交易控制符和真實(shí)交易控制符兩者不能通用。金字塔的真實(shí)下單函數(shù)只支持LMT限價(jià) MKT市價(jià) STP止損 STPLMT限價(jià)止損 這4個(gè)交易控制符。真實(shí)下單交易函數(shù),下單數(shù)量不再支持百分比模式。程序化交易的函數(shù)介紹:程序化交易系統(tǒng)之開(kāi)多操作:用法:TBUY(COND,V,Type,P1,P2,AC,STOCK);表示當(dāng)COND條件成立時(shí),買(mǎi)入V股(手)當(dāng)前品種,TYPE表示開(kāi)倉(cāng)類(lèi)型,LMT限價(jià) MKT市價(jià) STP止損 STPLMT限價(jià)止損P1表示開(kāi)倉(cāng)價(jià)格,當(dāng)TYPE為L(zhǎng)MT和STP,STPLMT時(shí)為指定限價(jià)和止損價(jià)格,其他情況填0P2為止損限價(jià),當(dāng)TYPE為STPLMT時(shí),必須指定P2的止損限價(jià),其他情況填0,當(dāng)P1止損價(jià)觸發(fā)時(shí)按照P2價(jià)格止損操作.當(dāng)TYPE參數(shù)省略時(shí),為市價(jià)開(kāi)倉(cāng)。AC為帳戶ID,為空時(shí)為系統(tǒng)默認(rèn)帳戶,否則將下單到指定帳戶中STOCK為品種代碼,比如SH600215,為空或者不填時(shí)為當(dāng)前品種后臺(tái)程序化交易不能使用圖表交易功能,且圖表交易和后臺(tái)交易的函數(shù)不能混用。例如,限價(jià)在圖表中函數(shù)為L(zhǎng)imit,后臺(tái)為L(zhǎng)mt。市價(jià)在圖表是函數(shù)Market,在后臺(tái)是Mkt。例如:TBUY(CO ,1000,LMT,C);表示收陽(yáng)線則在本周期收盤(pán)價(jià)上買(mǎi)入1000股(手)。TBUY(C0,1000,STP,CLOSE+0.2);表示收陽(yáng)線則在本周期收盤(pán)價(jià)高于0.2元下1000股(手)止損單,當(dāng)盤(pán)中價(jià)格到了觸發(fā)價(jià)時(shí)按市價(jià)開(kāi)倉(cāng)止損.TBUY(C0,1000,STPLMT,CLOSE+0.2,CLOSE);表示收陽(yáng)線則在本周期收盤(pán)價(jià)高于0.2元下1000股(手)止損單,當(dāng)盤(pán)中價(jià)格到了觸發(fā)價(jià)時(shí)按CLOSE價(jià)格開(kāi)倉(cāng)止損。程序化交易系統(tǒng)之平多操作:TSELL(COND,V,Type,P1,P2,AC,STOCK); 用法同上程序化交易系統(tǒng)之開(kāi)空操作:TBUYSHORT(COND,V,Type,P1,P2,AC,STOCK); 用法同上程序化交易系統(tǒng)之平空操作:TSELLSHORT(COND,V,Type,P1,P2,AC,STOCK); 用法同上注意:程序化交易系統(tǒng)的函數(shù)中交易類(lèi)型Type與交易測(cè)試系統(tǒng)的差別例2:唐奇安通道模型/中間變量input:N(20,5,100,1),NS(10,0,60,1);Price:=AVGENTERPRICE;/持倉(cāng)價(jià)位/交易條件開(kāi)多平空條件:=CROSS(H, hhv(ref(h,1),N);開(kāi)空平多條件:=CROSS(llv(ref(l,1), N),L);/交易系統(tǒng)SELLSHORT(開(kāi)多平空條件 and 持倉(cāng)0,持倉(cāng),market);SELLSHORT(持倉(cāng)0,持倉(cāng),market);SELL(持倉(cāng)0,持倉(cāng),Stopr,Price-NS);/止損BUYSHORT(開(kāi)空平多條件 and 持倉(cāng)=0,30%,market);/其他資產(chǎn):asset,noaxis,colorgreen;持倉(cāng):HOLDING,LINETHICK0;總次數(shù): TOTALTRADE,LINETHICK0;盈利:NUMWINTRADE,LINETHICK0;勝率:ROUNDS(100*PERCENTWIN,1),LINETHICK0;連虧:MAXSEQLOSS,LINETHICK0;連盈:MAXSEQWIN,LINETHICK0;將交易模型轉(zhuǎn)換成程序化交易系統(tǒng),主要是涉及交易系統(tǒng)函數(shù)的轉(zhuǎn)化,即在交易系統(tǒng)函數(shù)前加“t”,以及交易類(lèi)型的改動(dòng);并且程序化交易函數(shù)都是在后臺(tái)運(yùn)行,不能在圖表中顯示;交易數(shù)量不能用30%的寫(xiě)法,只能用具體數(shù)量。因此,唐奇安通道模型轉(zhuǎn)化為可程序化交易的系統(tǒng):/中間變量input:N(20,0,60,1) ,NS(30,0,100,1);持倉(cāng):=tHOLDING,LINETHICK0;KCS:= intpart(tasset*0.3/(close*multiplier);/也表示30%的開(kāi)倉(cāng)數(shù)BUY1:=hhv(ref(h,1),N);SELL1:=llv(ref(l,1),N);Price:=tAVGENTERPRICE; /持倉(cāng)價(jià)位/交易條件開(kāi)多平空條件:=CROSS(H,BUY1);開(kāi)空平多條件:=CROSS(SELL1,L);/交易系統(tǒng)TSELLSHORT(開(kāi)多平空條件 and 持倉(cāng)0,t持倉(cāng),mkt);TSELLSHORT(持倉(cāng)0,持倉(cāng),mkt);TSELL(持倉(cāng)0,持倉(cāng),Stp,Price-NS);TBUYSHORT(開(kāi)空平多條件 and 持倉(cāng)=0, KCS,mkt);若想與交易模型完全一樣,后句則需這樣寫(xiě):tSELLSHORT(ref(開(kāi)多平空條件,1) and 持倉(cāng)0,t持倉(cāng),mkt);tSELLSHORT(持倉(cāng)0,t持倉(cāng),mkt);tSELL(持倉(cāng)0,持倉(cāng),Stp,Price-NS);tBUYSHORT(ref(開(kāi)空平多條件,1) and 持倉(cāng)=0, KCS,mkt);注意:在公式編輯中,點(diǎn)擊 0; 平多開(kāi)空條件 :=MACD0; /交易系統(tǒng)TSELLSHORT(平多開(kāi)空條件,10, mkt, 0,0, , SQRB03); /平空TBUY(平空開(kāi)多條件,10,mkt, 0,0, SQRB05);/開(kāi)多TSELL(平多開(kāi)空條件,10, mkt, 0,0, SQRB05); /平多TBUYSHORT(平空開(kāi)多條件,10,mkt, 0,0, , SQRB03); /開(kāi)空(3)如何編制技術(shù)指標(biāo)的多賬戶模型:賬戶1:16801賬戶2:16802/中間變量DIFF := EMA(C,12) - EMA(C,26); DEA := EMA(DIFF,9); MACD:=2*(DIFF-DEA); /交易系統(tǒng)IF THOLDING0 and THOLDING0,10, mkt, 0,0, 16802); /平空ENDIF THOLDING=0 THEN BEGINTBUY(MACD0 and THOLDING=0,10,mkt, 0,0, 16801);/開(kāi)多TBUY(MACD0,10,mkt, 0,0, 16802);/開(kāi)多ENDIF THOLDING0 THEN BEGINTSELL(MACD0, THOLDING,10, mkt, 0,0,16801); /平多TSELL(MACD0,10, mkt, 0,0,16802); /平多ENDIF THOLDING=0 THEN BEGINTBUYSHORT(MACD0 and THOLDING=0,10,mkt, 0,0,16801); /開(kāi)空TBUYSHORT(MACD下單設(shè)置-程序化交易-將“記錄下單日志”打勾。打勾的同時(shí),會(huì)提醒您日志所保存的文件路徑。在圖表交易和后臺(tái)自動(dòng)交易的甚至手工下單的過(guò)程中,金字塔會(huì)將與交易有關(guān)的動(dòng)作記錄在內(nèi),便于用戶查找和分析問(wèn)題原因。1.6 后臺(tái)程序化注意事項(xiàng)(1) 圖表BUY等顯示函數(shù)是不能放在后臺(tái)做監(jiān)控交易的,但是將允許程序化交易勾去掉后單獨(dú)做預(yù)警是可以的。(2)只有少數(shù)的帶T的后臺(tái)交易函數(shù)允許使用在BUY前臺(tái)圖表交易策略中. Tholding, TAVGENTERPRICE,Taccount,Tasset,但是金字塔強(qiáng)烈不建議使用,因?yàn)檫@樣會(huì)造成圖表上的交易信號(hào)與實(shí)際的下單記錄不符。(3)金字塔的后臺(tái)交易部分,使用手工閃電下單的記錄,將無(wú)法通過(guò)比如TENTERPRICE等與交易記錄有關(guān)函數(shù)中得到結(jié)果,但可以通過(guò)程序化交易監(jiān)控中的手工下單干預(yù)功能完成此項(xiàng)目的。(4)金字塔的后臺(tái)交易,查詢持倉(cāng)和資產(chǎn)均為用戶當(dāng)前的實(shí)際數(shù)值,如果多個(gè)策略同時(shí)多一個(gè)品種或通一個(gè)帳戶進(jìn)行操作會(huì)產(chǎn)生相互干擾現(xiàn)象,解決辦法就是通過(guò)使用交易系統(tǒng)使用虛擬持倉(cāng)和資金,這樣就完全可以避免這種共振現(xiàn)象,但是推薦高級(jí)用戶使用,因?yàn)樾枰芏嗉记尚枰幚怼#?)用以圖表顯示的交易系統(tǒng)和后臺(tái)程序化交易的交易指令函數(shù),參數(shù)有明顯的不同,用戶不能簡(jiǎn)單的將BUY函數(shù)加個(gè)T就可以直接后臺(tái)交易,使用前應(yīng)該將鼠標(biāo)放在TBUY函數(shù)上認(rèn)真看看函數(shù)說(shuō)明。同名交易系統(tǒng)函數(shù)與程序化交易函數(shù)的差別:函數(shù)意義前臺(tái)圖表交易模型后臺(tái)交易系統(tǒng)開(kāi)多BUYTBUY平多SELLTSELL開(kāi)空BUYSHORTTBUYSHORT平空SELLSHORTTSELLSHORT其中TYPE:次周期限價(jià)LIMITREF(條件,1),LMTTYPE:本周期限價(jià)LIMITRLMTTYPE:次周期停損STOPREF(條件,1),STPTYPE:本周期停損STOPRSTPTYPE:次周期市價(jià)MARKETREF(條件,1),MKTTYPE:本周期市價(jià)MARKETRMKT開(kāi)倉(cāng)百分比30%KCS:= intpart(tasset*0.3/MULTIPLIER/close);語(yǔ)句語(yǔ)句T語(yǔ)句函數(shù)可在圖表上顯示不能在圖表上顯示總之,通過(guò)函數(shù)列表,了解他們的細(xì)微差別。第二章 圖表交易和后臺(tái)交易的主要區(qū)別和聯(lián)系2.1 圖表、交易函數(shù)的區(qū)別2.11 圖表交易函數(shù)BUY 開(kāi)多BUYSHORT 開(kāi)空SELL 平多SELLSHORT 平空適用于圖表程序式交易模式,本函數(shù)中可以設(shè)置下單條件、下單手?jǐn)?shù)、下單價(jià)格等參數(shù)。這種交易函數(shù)優(yōu)點(diǎn)在于可以將本交易函數(shù)套用到若干個(gè)循環(huán)邏輯判斷語(yǔ)句中,對(duì)下單手?jǐn)?shù)靈活設(shè)置,對(duì)下單價(jià)格靈活的掌控,與之配套使用的各類(lèi)函數(shù)較多,因此能夠用于實(shí)現(xiàn)較為復(fù)雜的交易模型;缺點(diǎn)是沒(méi)有參數(shù)設(shè)置賬戶名、下單品種、只能運(yùn)行在逐K線模式等。例2.1: BUY(vol/ref(vol,1)3 AND CLOSEOPEN , 1 ,LIMIT ,CLOSE );SELL(vol/ref(vol,1)3 AND CLOSE3 THEN BEGINBUY(CLOSEOPEN , 1 ,LIMIT ,CLOSE );SELL(CLOSE3 AND CLOSEOPEN ,1,LMT ,CLOSE ,0,351579 ,al02);TSELL(vol/ref(vol,1)3 AND CLOSE圖表程序化交易”選項(xiàng)。后臺(tái)程序化交易的設(shè)置和啟用界面位于菜單欄的“交易后臺(tái)程序化交易”選項(xiàng)。 (4)虛擬和真實(shí)的區(qū)別圖表程序化交易采用的是虛擬持倉(cāng)、虛擬資金等概念,各個(gè)買(mǎi)賣(mài)點(diǎn)以及中間過(guò)程返回給用戶的持倉(cāng)和資金是根據(jù)歷史交易信號(hào)和相關(guān)初始化的數(shù)據(jù)計(jì)算得來(lái),資金、費(fèi)率等初始化數(shù)據(jù)是在指標(biāo)編輯器中的“費(fèi)率設(shè)置”中進(jìn)行設(shè)置。后臺(tái)程序化交易采用的是真實(shí)持倉(cāng)、真實(shí)資金的概念,它們調(diào)用的是賬戶欄中真實(shí)的賬戶數(shù)據(jù)。 第三章 基于VBA的二次開(kāi)發(fā)一個(gè)優(yōu)秀的程序化交易軟件不僅需要滿足個(gè)人個(gè)性化的策略實(shí)現(xiàn)外,策略的執(zhí)行也至關(guān)重要,俗話說(shuō):細(xì)節(jié)決定成敗,前面章節(jié)我們都是介紹的使用金字塔內(nèi)置的PEL腳本語(yǔ)言作為程序化交易使用,但是PEL終歸還是為普通非計(jì)算機(jī)專(zhuān)業(yè)投資者準(zhǔn)備的腳本語(yǔ)言,方便投資者學(xué)習(xí)和使用的同時(shí),也帶來(lái)了其自身存在的格式固化,運(yùn)行不夠靈活,效率不足等問(wèn)題,是無(wú)法滿足具有更多想法更多需求的程序化交易者的。在各種高級(jí)語(yǔ)言中,熟悉和精通VB的人無(wú)疑是最多的。著名的微軟OFFICE辦公軟件中的二次開(kāi)發(fā)也是使用的VBA。但是金字塔不僅僅是一個(gè)被廣泛應(yīng)用的金融分析軟件,除了具有一般軟件的數(shù)據(jù)處理、統(tǒng)計(jì)分析、圖表功能外,最大的特點(diǎn)是集成了VBA 環(huán)境。并提供了VBA 的IDE 環(huán)境??梢詰?yīng)用金字塔的所有現(xiàn)有功能,例如其數(shù)據(jù)處理、圖表繪制、數(shù)據(jù)庫(kù)連接、內(nèi)置函數(shù)等等。利用這些接口將極大的發(fā)揮我們專(zhuān)業(yè)程序化交易投資者的編程空間,使我們的交易系統(tǒng)具有強(qiáng)大的計(jì)算能力、擴(kuò)展能力和生命力。3.1金字塔VBA與OFFICE VBA區(qū)別和聯(lián)系盡管金字塔VBA與OFFICE VBA都是VBA,但是它們2個(gè)還是有些不同的地方,這里假設(shè)讀者是熟悉OFFICE VBA的用戶,如果你是VBA的初學(xué)者,那么可以不必理會(huì)這里的差別。金字塔的腳本引擎是VBS,與OFFICE的VBA主要區(qū)別在于變量無(wú)需聲明就可以使用。金字塔軟件的VBA系統(tǒng)是介于傳統(tǒng)VBS與VBA之間的系統(tǒng),支持VBA系統(tǒng)中才有的窗體,框架等等更多的對(duì)象,另外,語(yǔ)法上又兼容VBS。除了類(lèi)模塊外,所有的框架和窗體對(duì)象模塊的數(shù)據(jù)都是公用的,框架和窗體之所以獨(dú)立是因?yàn)榉奖阌脩艟庉嫼凸芾?,?shí)際運(yùn)行代碼是合在一起的。比如你在框架或者窗體中定義了一個(gè)函數(shù)過(guò)程外的全局變量,實(shí)際上是所有VBS代碼都可以調(diào)用的,在窗體框架對(duì)象中的過(guò)程名在其他窗體中調(diào)用也無(wú)需使用 窗體.過(guò)程名 這種方式,可以直接使用過(guò)程名。金字塔中的窗體與OFFICE其他組件的窗體在訪問(wèn)其內(nèi)部控件時(shí)稍有不同,例如訪問(wèn)UserForm1窗體的Text1編輯控件,使其隱藏。代碼如下: UserForm1_Text1.Visible = False除此之外,金字塔VBA與OFFICE VBA在IDE界面,使用方法和布局上,完全一致,如果讀者熟悉OFFICE VBA的開(kāi)發(fā),那么就應(yīng)該很快掌握金字塔VBA的開(kāi)發(fā)。3.2 VBA 原理的隱喻VBA 的基本原理可通過(guò)下圖做示意性解釋。金字塔對(duì)象VBA代碼VBAVBA 作為應(yīng)用VBA 編寫(xiě)的代碼和金字塔對(duì)象之間的一個(gè)橋梁,為2 者之間的調(diào)用提供支持,這種調(diào)用是通過(guò)COM 自動(dòng)化實(shí)現(xiàn)的。例如我們的代碼中一句代碼,調(diào)用金字塔中一個(gè)對(duì)象的一個(gè)屬性,那么這個(gè)過(guò)程大概是類(lèi)似這樣的:VBA 環(huán)境解釋執(zhí)行這句代碼,如果發(fā)現(xiàn)對(duì)金字塔對(duì)象的調(diào)用,就通過(guò)COM 的方式調(diào)用這個(gè)對(duì)象,獲取其屬性,這樣VBA 代碼就可以和金字塔對(duì)象進(jìn)行交互。3.3 VBA 簡(jiǎn)介要使用 VBA 進(jìn)行數(shù)據(jù)處理,第一要熟悉VBA 的IDE 環(huán)境,知道如何進(jìn)行代碼書(shū)寫(xiě),如何編寫(xiě)代碼,設(shè)計(jì)窗體,創(chuàng)建類(lèi)模塊(對(duì)象),第二要熟悉VBA 的基本語(yǔ)法和。二者都是VBA 程序設(shè)計(jì)的基礎(chǔ),需要認(rèn)真學(xué)習(xí)。VBA 語(yǔ)法不是一章就可以全部介紹完全的,本章介紹的內(nèi)容是最基本和應(yīng)該熟練掌握的內(nèi)容,對(duì)于不熟悉或者不理解的內(nèi)容可以在學(xué)習(xí)了后面的內(nèi)容后再反過(guò)頭來(lái)學(xué)習(xí)。有些內(nèi)容需要反復(fù)練習(xí)和熟悉。對(duì)于VBA 語(yǔ)法和用法的很多內(nèi)容可以隨時(shí)通過(guò)查看幫助來(lái)獲得相關(guān)信息。本章和下一章(金字塔 對(duì)象模型)的部分內(nèi)容,特別是表格內(nèi)的一些內(nèi)容,沒(méi)有必要完全記住,可以作為參考手冊(cè)來(lái)使用。3.3.1VBA 及其IDE 初步本部分將對(duì) VBA 及其開(kāi)發(fā)環(huán)境IDE(集成開(kāi)發(fā)環(huán)境)作一概略的介紹。VBA IDE 是進(jìn)行程序設(shè)計(jì)和代碼編寫(xiě)的地方,同一個(gè)金字塔共享同一IDE。文中會(huì)涉及到一些諸如對(duì)象、事件等部分讀者可能不熟悉或不清楚的概念,對(duì)于此類(lèi)問(wèn)題可直接忽略之,因?yàn)樵诤竺鏁?huì)有詳細(xì)介紹。本部分也不是一個(gè)VBA 的參考文檔,只是其語(yǔ)法、特征的快速瀏覽和介紹。(1)VBA 集成開(kāi)發(fā)環(huán)境(IDE)的組成VBA 代碼和金字塔文檔文件是保存在一起的,可以通過(guò)點(diǎn)擊“工具 宏 Visual Basic工程”打開(kāi)VBA 的IDE 環(huán)境,進(jìn)行程序設(shè)計(jì)和代碼編寫(xiě)。圖3-1Visual Basic IDE 環(huán)境圖 3-1 為金字塔 VBA 的IDE 環(huán)境,缺省情況下,VBA IDE 環(huán)境上方為菜單和工具條(圖 3-1),左側(cè)窗口為工程資源管理器窗口,右側(cè)最大的窗口為代碼窗口。每一個(gè)金字塔文檔文件,對(duì)應(yīng)的VBA 工程都有4 類(lèi)對(duì)象,包括:框架、窗體、模塊和類(lèi)模塊(圖 3-2)。這里的框架主要是金字塔運(yùn)行時(shí)的技術(shù)分析圖表,例如我們常見(jiàn)的K線走勢(shì)分析圖的框架對(duì)象,雙擊這些對(duì)象會(huì)打開(kāi)代碼窗口(圖3-1 右側(cè)窗口),在此窗口中可輸入相關(guān)的代碼,響應(yīng)事件,例如框架的打開(kāi)、關(guān)閉,窗格的激活、品種顯示的修改、選擇等(有關(guān)事件、金字塔 對(duì)象模型見(jiàn)后)。窗體對(duì)象代表了自定義對(duì)話框或界面,模塊為自定義代碼的載體,類(lèi)模塊則是以類(lèi)或?qū)ο蟮姆绞骄帉?xiě)代碼的載體,關(guān)于各對(duì)象的具體含義和使用見(jiàn)后。在工程資源管理器窗口的右鍵菜單下,有添加用戶窗體、模塊、類(lèi)模塊的選項(xiàng),也可以將已有的模塊移除、導(dǎo)入和導(dǎo)出。注意:建議用戶新建一個(gè)VBA工程來(lái)完成你的個(gè)性化VBA代碼,盡量不要在默認(rèn)的工程中添加,防止多個(gè)不同工程的代碼相互干擾,您可以點(diǎn)擊左側(cè)工程資源窗口上的工具欄來(lái)新建一個(gè)VBA工程。(2)在 VBA IDE 下進(jìn)行開(kāi)發(fā)熟悉了 VBA 的IDE 環(huán)境后,我們來(lái)開(kāi)發(fā)VBA 之旅的第一個(gè)程序。首先我們雙擊左側(cè)工程資源管理器上的窗口的模塊分類(lèi),然后雙擊“Macro”模塊,打開(kāi)宏模塊代碼編輯窗口(圖3-3),然后選擇“插入”菜單-過(guò)程,再隨后彈出的宏名稱(chēng)編輯窗口里輸入“MyFirstVBAProgram”,然后單擊確定,這樣系統(tǒng)會(huì)自動(dòng)將MyFirstVBAProgram這個(gè)過(guò)程函數(shù)插入到代碼編輯窗口中,我們只要在打開(kāi)窗口中輸入以下代碼:Sub MyFirstVBAProgram()MsgBox “我的第一個(gè)自編程序?!盓nd Sub通過(guò)“運(yùn)行”菜單-宏,或者按Alt+F8快捷鍵,彈出宏運(yùn)行窗口,下拉框中選擇我們前面建立的“MyFirstVBAProgram”宏,然后就能看到運(yùn)行的結(jié)果了。圖3-2注意:與其他程序設(shè)計(jì)語(yǔ)言不同,VBA 程序是事件驅(qū)動(dòng)的,沒(méi)有Main 函數(shù)之類(lèi)的入口的概念。本質(zhì)上,VBA 代碼應(yīng)該只是一些完成具體工作的集合,而通過(guò)界面元素或者金字塔 的事件驅(qū)動(dòng)執(zhí)行,你可以通過(guò)自定義按鈕、菜單,并指定一個(gè)宏(VBA 過(guò)程,自定義界面也可以通過(guò)編程手段完成此類(lèi)工作),通過(guò)單擊此按鈕即可調(diào)用相應(yīng)的VBA代碼,或者將調(diào)用綁定在金字塔的某個(gè)事件下。下面我們簡(jiǎn)單看一下這段代碼的組成,代碼第1 行表示這是一個(gè)新的過(guò)程,名稱(chēng)為“MyFirstVBAProgram” 第2行調(diào)用MsgBox 這個(gè)函數(shù),顯示一個(gè)對(duì)話框,第3 行表示過(guò)程結(jié)束。VBA 程序由不同的模塊組成,在模塊內(nèi)部,可以定義不同的變量、過(guò)程或函數(shù),由此組成一個(gè)完整的程序。(3)善用工具及其他VBA 集成開(kāi)發(fā)環(huán)境,提供了很多便利的工具可以幫助或輔助我們寫(xiě)出好的程序,其中的方便必須親自使用才可以體會(huì),因此,一定要善用工具。VBA 的代碼編輯器提供了幾項(xiàng)非常有用的功能,代碼即時(shí)提示可以使我們不必記憶太多的東西,輸入對(duì)象后會(huì)自動(dòng)列出其屬性、方法等內(nèi)容。在實(shí)際的編程過(guò)程中,一定要善于利用在線幫助,VBA 的在線幫助包含了大量對(duì)編程有用的參考信息,任何人都不可能記得住所有的函數(shù)、對(duì)象的用法和程序語(yǔ)言的語(yǔ)法,所以一定要利用好幫助。幫助的使用可以在“幫助”菜單-VBA編程信息 處獲得。可以通過(guò)幫助目錄瀏覽,或者通過(guò)查找輸入關(guān)鍵字查找相關(guān)內(nèi)容。圖3-3在代碼書(shū)寫(xiě)中,如果一句代碼過(guò)長(zhǎng),應(yīng)該使用接行字符(“-”)將其分為幾行,而不是書(shū)寫(xiě)為一行,一般來(lái)說(shuō),代碼的長(zhǎng)度不要超過(guò)80 個(gè)字符為宜,這樣閱讀方便,不需要橫向拉動(dòng)滾動(dòng)條,也不容易出錯(cuò)。例如上面第一個(gè)例子我們可以將對(duì)話框文字輸出分成2行:MsgBox _“我的第一個(gè)自編程序?!睂?duì)于代碼格式,一定要養(yǎng)成縮進(jìn)的習(xí)慣,在過(guò)程之后,循環(huán)語(yǔ)句、判斷語(yǔ)句之內(nèi),如本書(shū)的例子樣子,縮進(jìn)4 個(gè)字符,便于閱讀。代碼中,在一個(gè)邏輯或者操作完成之后,應(yīng)該空一行,以表示其邏輯關(guān)系,在過(guò)程與過(guò)程之間,也應(yīng)該空一行。VBA 中,使用單引號(hào)“”表示注釋?zhuān)帉?xiě)程序時(shí),一定要養(yǎng)成注釋的習(xí)慣。注釋不是所有代碼都要注釋?zhuān)灰话銇?lái)說(shuō),對(duì)一個(gè)模塊、過(guò)程、函數(shù),要大概說(shuō)明其功能,參數(shù);對(duì)于一個(gè)過(guò)程,如果涉及較復(fù)雜的算法,要說(shuō)明其使用的算法或流程。在過(guò)程和函數(shù)中,對(duì)關(guān)鍵代碼,說(shuō)明其操作的目的、算法或流程。3.3.2模塊、函數(shù)和過(guò)程(1)模塊模塊是自定義的過(guò)程、函數(shù)保存的地方有兩種基本類(lèi)型的模塊:類(lèi)模塊和標(biāo)準(zhǔn)模塊,本節(jié)介紹標(biāo)準(zhǔn)模塊,類(lèi)模塊將在專(zhuān)門(mén)介紹。模塊可以通過(guò)右鍵單擊工程資源管理器的工程名,選擇“插入 模塊”來(lái)新建,新建的模塊缺省的名稱(chēng)為“模塊 1”,“模塊2”,建議在模塊右鍵-重命名中更改為有意義的名稱(chēng)。模塊有2 個(gè)任務(wù):(1)保存過(guò)程和函數(shù);(2)定義類(lèi)模塊內(nèi)的私有變量或整個(gè)工程的公有變量。在模塊中可以聲明變量(包括對(duì)象),定義過(guò)程和函數(shù)。過(guò)程和函數(shù)的定義見(jiàn)下文,變量的聲明如下。變量的聲明:Dim I Dim 表示聲明變量i注意:要求變量聲明VBA 缺省可以不聲明變量,在第一次使用的時(shí)候自動(dòng)聲明,但此功能也是VBA 代碼(包括其他Basic 代碼)的一個(gè)主要錯(cuò)誤之源。試想第一次使用了一個(gè)變量strMyFirstName,之后又通過(guò)strMyFirstNme(少一個(gè)a)來(lái)使用它,但由于拼寫(xiě)不同,VBA 以為是一個(gè)新的變量,于是會(huì)新聲明一個(gè)變量,這樣的錯(cuò)誤極其難以發(fā)現(xiàn)??梢酝ㄟ^(guò)“工具 選項(xiàng)”對(duì)話框,在“其他”頁(yè),選中“VBA變量名必須顯式聲明所有變量”,則在使用變量前,都必須先通過(guò)Dim 語(yǔ)句聲明。(2)過(guò)程過(guò)程是最基本的運(yùn)行單位。一個(gè)完整的過(guò)程一般類(lèi)似如下格式:Sub Test(參數(shù)列表) End Sub在以上程序中,Sub 代表過(guò)程種類(lèi),表示運(yùn)行指定的操作,但不返回運(yùn)行結(jié)果;Test表示過(guò)程名稱(chēng),最后以End Sub 結(jié)束。其中按值按地址傳遞參數(shù)指一種將參數(shù)地址而不是將值傳遞給過(guò)程的方式,這就使過(guò)程訪問(wèn)到實(shí)際的變量。結(jié)果,過(guò)程可改變變量的真正值。VBA 缺省按地址傳遞參數(shù)。Sub MyTest()dim V1,V2V1 = 1V2 = 2MyTestCall (v1,v2) v1,v2是參數(shù)MsgBox v1MsgBox v2End SubSub MyTestCall(V1,V2) V1=5 V2=.6End Sub調(diào)用的方法是:運(yùn)行結(jié)束后,你會(huì)發(fā)現(xiàn)V1和V2值都被改變了。所有的可執(zhí)行代碼都必須屬于某個(gè)過(guò)程。不能在別的過(guò)程中定義 Sub 過(guò)程。Exit Sub 語(yǔ)句使執(zhí)行立即從一個(gè) Sub 過(guò)程中退出。程序接著從調(diào)用該 Sub 過(guò)程的語(yǔ)句下一條語(yǔ)句執(zhí)行。在 Sub 過(guò)程的任何位置都可以有 Exit Sub 語(yǔ)句。在 Sub 過(guò)程中使用的變量分為兩類(lèi):一類(lèi)是在過(guò)程內(nèi)顯式定義的,另一類(lèi)則不是。在過(guò)程內(nèi)顯式定義的變量(使用 Dim 方法)都是局部變量。過(guò)程(包括函數(shù)等)的創(chuàng)建可以通過(guò)在代碼窗口直接鍵入“Sub”來(lái)創(chuàng)建,也可以使用菜單的“插入 過(guò)程”對(duì)話框來(lái)創(chuàng)建。(3)函數(shù)函數(shù)是包含在 Function 和 End Function 語(yǔ)句之間的一組語(yǔ)句。Function 過(guò)程與 Sub 過(guò)程類(lèi)似,但是 Function 過(guò)程可以返回值。Function 過(guò)程可以使用參數(shù)(由調(diào)用過(guò)程傳遞的常數(shù)、變量或表達(dá)式)。如果 Function 過(guò)程無(wú)任何參數(shù),則 Function 語(yǔ)句必須包含空括號(hào) ()。Function 過(guò)程通過(guò)函數(shù)名返回一個(gè)值,這個(gè)值是在過(guò)程的語(yǔ)句中賦給函數(shù)名的。Function 返回值的數(shù)據(jù)類(lèi)型總是 Variant。 在下面的示例中,Celsius 函數(shù)將華氏度換算為攝氏度。Sub 過(guò)程 ConvertTemp 調(diào)用此函數(shù)時(shí),包含參數(shù)值的變量被傳遞給函數(shù)。換算結(jié)果返回到調(diào)用過(guò)程并顯示在消息框中。 Sub ConvertTemp() temp = InputBox(請(qǐng)輸入華氏溫度。, 1) MsgBox 溫度為 & Celsius(temp) & 攝氏度。 End Sub Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End FunctionVBA 中有大量?jī)?nèi)置函數(shù),例如前邊例子里使用過(guò)的MsgBox,InputBox。VBA 的函數(shù)主要包括數(shù)學(xué)函數(shù)(包括三角函數(shù)、隨機(jī)數(shù)等)、字符串函數(shù)等等,熟悉VBA 的內(nèi)置函數(shù)可以提高工作效率,更好的完成工作。對(duì)于VBA 的函數(shù),可以參考VBA幫助文檔。(4)在代碼中使用 Sub 和 Function 過(guò)程調(diào)用 Function 過(guò)程時(shí),函數(shù)名必須用在變量賦值語(yǔ)句的右端或表達(dá)式中。例如: Temp = Celsius(fDegrees)或 MsgBox 溫度為 & Celsius(fDegrees) & 攝氏度。調(diào)用 Sub 過(guò)程時(shí),只需輸入過(guò)程名及所有參數(shù)值,參數(shù)值之間使用逗號(hào)分隔。不需使用 Call 語(yǔ)句,但如果使用了此語(yǔ)句,則必須將所有參數(shù)包含在括號(hào)之中。 下面的示例顯示了調(diào)用 MyProc 過(guò)程的兩種方式。一種使用 Call 語(yǔ)句;另一種則不使用。兩種方式效果相同。 Call MyProc(firstarg, secondarg) MyProc firstarg, secondarg請(qǐng)注意當(dāng)不使用 Call 語(yǔ)句進(jìn)行調(diào)用時(shí),括號(hào)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論