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