B編程基礎和策略實現示例.ppt_第1頁
B編程基礎和策略實現示例.ppt_第2頁
B編程基礎和策略實現示例.ppt_第3頁
B編程基礎和策略實現示例.ppt_第4頁
B編程基礎和策略實現示例.ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1,TB編程基礎和策略實現示例,蔡云華 深圳開拓者科技有限公司,內容安排,TB 程序化交易的設置和使用(演示) TB 程序化交易編程基本知識 TB 技術指標和交易策略編寫示例,2,TB公式如何使用?,TB公式類型 用戶函數 公式應用(包括技術指標、交易指令等) 如何使用一個交易模型? 或新建公式應用,粘貼代碼,校驗保存公式(編譯) 打開超級圖表,選擇交易品種,插入公式應用 修改公式應用設置 投資組合性能測試和參數優(yōu)化 啟動自動策略交易系 TB公式的導入導出,3,4,5,6,公式源代碼,Params Numeric Length(10); Numeric Lots(1); Vars Numeri

2、cSeries MA; Begin MA = AverageFC(Close,Length); PlotNumeric(MA,MA); If (Close1 MA1) Buy(Lots, Open); If (Close1 MA1) SellShort(Lots,Open); End,TB公式的結構,TB的公式一般由三段組成。 Params Numeric Length(10); 公式參數段 Vars NumericSeries MA; 公式變量段 Begin MA = AverageFC(Close, Length); 公式腳本段 End,8,Bar數據(K線數據),當前時間周期下所有K線的

3、相關數據,按照時間從先到后的順序排列而成的序列數據。每根K線中包含的數據如下:,9,序列數據,10,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,序列變量,N N-1 2 1 0,非序列變量(簡單變量),11,非序列變量,Bar數據的使用,Bar數據是TB公式運行的基礎。 Bar數據是序列數據,可以回溯讀取。 舉例: 比較今天的最高價是否突破了昨天的最高價 表達式為:High High1 比較今天的最高價是否突破了前兩天的最高價 表達式為:High High1 and HighHigh2 或者:High High1 End,公式運

4、行結果,大家都知道每個Hello World! 都是怎么產生的嗎?,注釋語句- Commentary,TB的信息輸出,除了可以通過FileAppend輸出到文件外,也可以將信息輸出顯示到圖表上; Commentary的用法: 在超級圖表的當前BAR添加一行注釋信息; 參數:String strTip; / 提示的信息,信息輸出函數的作用,調試和診斷TB公式的代碼錯誤; 檢驗TB公式的運行結果是否符合設計邏輯; 學習TB的運行機制,熟悉TB內建函數的用法;,例2:輸出BAR數據,Sample2: Begin FileAppend(c:tbsample2.txt,Date= +text(Date)

5、 + Time= +text(time) + Open= +Text(Open) + High= +Text(High) + Low= +Text(Low) + Close=+Text(Close) + CurrentBar= +Text(CurrentBar) + Barstatus= +Text(BarStatus); End,例2 運行結果,參數與變量,簡單地說,參數和變量都是代號,代表一個某一類型的數據,變量還可以代表一個表達式的運算結果; 參數的作用是給用戶一個不需修改代碼即可改變公式運行結果的一個外部接口; 參數的值在公式的內部不能夠被修改; 變量的作用是保存數據或是計算結果,便于

6、以后調用; 參數和變量都需要聲明。,參數的作用,假如我們要寫一個均線指標,現在是用10天做周期。代碼如下: Begin PlotNumeric(MA,AverageFC(Close,10); End 那如果要改用20天做周期,我們必須改程序,把10改成20,然后編譯。下次想用別的周期,還得改,非常麻煩。 如果使用參數,就方便多了。程序寫好,使用時改參數就好了。代碼如下: Params Numeric Length(10); Begin PlotNumeric(MA,AverageFC(Close,Length); End,數據類型,TB公式中有三種基本的數據類型 數值型(Numeric) 字符

7、型(String) 布爾型(Bool) 為了對變量、參數進行回溯,又增加了序列類型 數值型序列變量/參數(NumericSeries) 字符型序列變量/參數(StringSeries) 布爾型序列變量/參數(BoolSeries) 為了通過用戶函數返回多個值,又增加了引用類型 NumericRef、StringRef、BoolRef 變量(或參數)申明方法: 數據類型 變量名或參數名 (初始值);,控制語句,條件語句(If-Else) if 語句 if - else 語句 if - Else if 語句 if - Else 嵌套 循環(huán)語句(ForWhile) For 循環(huán)變量 = 初始值 TO

8、 結束值 For 循環(huán)變量 = 初始值 Downto 結束值 While 循環(huán),條件語句-IF Else語句,語法如下: If (Condition) TB公式語句1; Else TB公式語句2; 如果TB公式語句是單條,您可以省略,二條或者二條以上的語句必須使用。,25,技術指標輸出函數,PlotNumeric 在當前BAR輸出一個數值 參數:String Name - 輸出值的名稱; Numeric Number - 輸出的數值; Numeric Locator=0 - 輸出值的定位點; Integer Color=-1 - 輸出值的顏色; Integer BarsBack=0 - 從當前

9、BAR回溯的 BAR數 舉例: PlotNumeric(“MA”,AverageFC(Close,10); 輸出均線指標值 PlotNumeric (“OpenToClose”,open,close); 輸出開盤價與收盤價的連線(線型選擇柱狀圖),26,技術指標輸出函數(2),PlotString 在當前BAR輸出一個字符串 參數:String Name - 輸出值的名稱 String str - 輸出的字符串; Numeric Locator=0 - 輸出值的定位點; Integer Color=-1 - 輸出值的顏色; Integer BarsBack=0 - 從當前BAR回溯的 BAR數

10、 舉例: PlotString(CandleStick,陽線,Low,Red); 在Bar的最低價位置輸出字符串“陽線”,并顯示為紅色,27,技術指標輸出函數(3),PlotBool 在當前BAR輸出一個布爾值 參數:String Name - 輸出值的名稱 Bool bPlot - 輸出的布爾值; Numeric Locator=0 - 輸出值的定位點; Integer Color=-1 - 輸出值的顏色; Integer BarsBack=0 - 從當前BAR回溯的 BAR數 舉例: PlotString(“con,con,High); 在Bar的最高價位置輸出布爾變量con的值,如果co

11、n為真, 則顯示“笑臉”圖標,否則顯示為“哭臉”圖標,28,例3:技術指標的編寫,Sample3: 單均線加通道指標 Params Numeric Length(10);/ 均線周期 Numeric FilterPercent(20);/ 通道幅度比例(%) Vars NumericSeries MA; NumericSeries UpperBand; NumericSeries LowerBand; Bool ConBuy(False); Bool ConSell(False); Begin MA = AverageFC(Close,Length); UpperBand = MA * ( 1

12、 + FilterPercent / 10000 ); LowerBand = MA * ( 1 - FilterPercent / 10000 );,29,PlotNumeric(MA,MA,0,Yellow); PlotNumeric(UpperBand,UpperBand,0,Red); PlotNumeric(LowerBand,LowerBand,0,Green); ConBuy = CrossOver(Close,UpperBand); ConSell = CrossUnder(Close, LowerBand); if (ConBuy) PlotBool(ConBuy,ConBu

13、y,High+(High-Low)*0.3); PlotString(BS,多頭突破,High+(High-Low)*0.6,red); if (ConSell) PlotBool(ConSell,!ConSell,Low-(High-Low)*0.3); PlotString(SS,空頭突破,Low-(High-Low)*0.6,Green); End,30,指標編寫常見問題,指標編寫完成后,還要注意在屬性設置中進行相應的設置; 指標是在主圖顯示還是在子圖顯示; 指標的線型; 從V3轉到V4的客戶注意參數的位置 另外學習的例子可以參考: MACD指標的寫法(柱狀圖) SAR指標(點圖),31

14、,運行結果,32,交易指令 Buy/Sell,Buy - 平掉所有空頭持倉,開多頭倉位; sell - 平掉指定多頭持倉; Sellshort - 平掉所有多頭持倉,開空頭倉位; Buytocover - 平掉指定空頭持倉。 參數: Numeric Share 買入數量,默認=0時,使用系統(tǒng)設置參數 Numeric Price 買入價格,為浮點數,默認=0時為使用現價(非最后Bar為Close)。,33,交易指令 A_SendOrder,針對當前公式應用的帳戶、商品發(fā)送委托單。 該函數直接發(fā)單,不經過任何確認,并會在每次公式計算時發(fā)送,一般需要配合著倉位頭寸進行條件處理,在不清楚運行機制的情況

15、下慎用。 不能使用于歷史測試,僅適用于實時行情交易。 參數: BuyOrSell :買賣類型,買Enum_Buy/賣Enum_Sell; EntryOrExit: 開平倉類型, 開倉 Enum_Entry / 平倉Enum_Exit / 平今 Enum_ExitToday; fLot 委托單的交易數量; fPrice 委托單的交易價格。,疊加多個商品合約進行交易,TB可以在一個圖表中插入多個商品合約,支持同時對多個商品合約數據源編寫公式應用。具體的方法是在交易指令、BAR數據及系統(tǒng)函數前加上數據源。TB中數據源的命名規(guī)則如下: Data0:圖表中最開始選擇的商品合約 Data1:第一個插入的商

16、品合約 Data2:第二個插入的商品合約 一個圖表最多支持50個數據源; 調用方法: Data1.A_SendOrder() Data2.Buy(.) Data3.Close Data4.MarketPosition,34,盤中和盤后公式運行的差別,盤后公式的執(zhí)行情況分析 K線是確定的,不存在信號消失問題 公式在每根K線上只執(zhí)行一遍 符合開倉條件和平倉條件會標出買賣信號(使用Buy、Sell指令),但并不真正發(fā)單 盤中公式的執(zhí)行情況分析 K線是變化的,如用最新價或基于最新價計算出的指標來作為入場或出場條件會出現信號消失問題 每當分筆交易數據(tick)傳來時,公式都會執(zhí)行一遍 符合開倉條件和平

17、倉條件除標出買賣信號,還會真正發(fā)單,信號消失問題(1),產生原因:使用變化的價格(如Close)或是基于最新價Close計算的技術指標,來作為交易的進場、出場或止損條件時,就會產生信號消失問題。 如果編寫的公式策略中存在信號閃爍問題,在歷史測試中會得出失真的測試結果,在實盤交易時,更會因為重復發(fā)單造成嚴重損失。 信號消失問題的一般解決辦法: 延遲發(fā)單或用前一根K線的數據來做為判斷條件 用能保持得住的價格來做為判斷條件,信號消失問題(2),延遲發(fā)單舉例: condition = 交易條件 If (condition) Buy(1, NextOpen, true); 用前一根K線做判斷舉例: co

18、ndition = 交易條件 If (condition1) Buy(1, Open); 用High,Low,Open等做判斷 If (HighHigh1) buy(1,High1); ,例4:單均線系統(tǒng),Params Numeric Length(10); Numeric Lots(1); Vars NumericSeries MA; Begin MA = AverageFC(Close,Length); PlotNumeric(MA,MA); If (MarketPosition 1 and Close1 MA1) Buy(Lots, Open); If (MarketPosition -

19、1 and Close1 MA1) SellShort(Lots,Open); End,連續(xù)建倉的控制,原來的公式中,理論上任何一根收盤高于均線的K線,都會開多倉,形成連續(xù)建倉,但實際上交易設置中可控制,如果允許連續(xù)建倉,代碼中限制連續(xù)建倉,持倉函數Marketposition的用法: 獲得當前持倉狀態(tài),返回值為整型。返回值定義如下:1 當前位置為持多倉 -1 當前位置為持空倉0 當前位置為持平 代碼修改如下:If (MarketPosition!=1 and Close1 MA1) Buy(Lots, Open); If (MarketPosition!=-1 and Close1 MA1)

20、 SellShort(Lots,Open); ,止盈止損策略的實現,止盈止損的設置有多種方法,常見的有: 固定點數 價格百分比 進場價的一定比例; 平均波動范圍的一定比例; 形態(tài)判斷 下面以固定點數止損,進場價的一定比例止盈為例,分別舉個例子。,42,止盈止損的代碼,(不包含進場部分) Params Numeric TakeProfit(1); / 百分比 Numeric StopLoss(20); Vars Numeric MinPoint; Numeric MyEntryPrice; Numeric MyExitPrice; Begin MinPoint = MinMove * Price

21、Scale; MyEntryPrice = AvgEntryPrice; if (MarketPosition=1) if (High = MyEntryPrice * (1 + TakeProfit * 0.01) MyExitPrice = MyEntryPrice * (1 + TakeProfit * 0.01); if (open MyExitPrice) MyExitPrice = Open; Sell(0,MyExitPrice);,43, Else if ( Low MyEntryPrice + Stoploss * MinPoint) MyExitPrice = MyEntr

22、yPrice + Stoploss * MinPoint; if (Open MyExitPrice) MyExitPrice = Open; BuyToCover(0,MyExitPrice); End,44,追蹤止盈策略的實現,追蹤止盈的設置也有多種方法,常見的有: 峰值價回落固定點數 峰值價回落一定的百分比 峰值價的一定比例; 平均波動范圍的一定比例; 開盤價的一定比例。 是否盈利達到一定幅度才啟用追蹤止盈; 動態(tài)的回落點數或比例。 下面以峰值價回落一定比例為例,來實現它。,45,追蹤止盈的代碼,(不包含進場部分) Params Numeric TrailingStop(1); / 跟蹤

23、止損百分比 Vars Numeric MinPoint; Numeric MyExitPrice; NumericSeries HigherAfterEntry; NumericSeries LowerAfterEntry; Numeric StopLine(0); Begin if (BarsSinceEntry = 1) HigherAfterEntry = AvgEntryPrice; LowerAfterEntry = AvgEntryPrice; Else If(BarsSinceEntry 1) HigherAfterEntry = Max(HigherAfterEntry1,Hi

24、gh1); LowerAfterEntry = Min(LowerAfterEntry1,Low1); ,46,Else HigherAfterEntry = HigherAfterEntry1; LowerAfterEntry = LowerAfterEntry1; MinPoint = MinMove * PriceScale; If(MarketPosition=1) StopLine = HigherAfterEntry * (1 - TrailingStop * 0.01); If(Low = StopLine) MyExitPrice = StopLine + MinPoint;

25、If(Open MyExitPrice) MyExitPrice = Open; BuyToCover(0,MyExitPrice); End,47,48,應注意的問題,如果單根K線的最高價和最低價相差很大,有可能出現止盈和止損同時滿足的情況,解決辦法: 切換到更小的時間周期上進行交易; 擴大止盈和止損的幅度 在開倉BAR,因無法判斷開倉價和最高價最低價的先后順序,因此一般是在開倉BAR的后一根BAR才開始判斷是否滿足止盈止損或跟蹤止盈的的條件。如交易策略需要及時的止損,同樣需要切換到更小的時間周期上進行交易。,進場位置和盈利峰值價計算,開盤價,最低價,追蹤止損價,盈利峰值價,止損,沒 被 止

26、 損,再進場策略的設計,使用止損止盈或追蹤止盈出場后,如果趨勢沒有改變,我們仍然需要再進場的策略以避免錯失大的波段趨勢; 可以考慮的再入場的方法有: 價格創(chuàng)出新高或新低,再次入場; 出場后一定時間后,大趨勢仍未改變則再次入場; 出場后大趨勢未改變,其他輔助指標出現和大趨勢一致的進場信號時再次入場。 下面以出場后一定時間后大趨勢仍未改變即再次入場的方法來舉例。,50,跟蹤止盈后,我們要設個標志,表示曾經出場過,因此要增加兩個布爾型序列變量; BoolSeries bLongStoped(false); BoolSeries bShortStoped(false); 跟蹤止盈后,設置這兩個變量;

27、/ 多頭跟蹤止盈后 If(Low = StopLine ) BuyToCover(0,MyExitPrice); bShortStoped = true; ,51,這兩個序列變量值必須往下傳遞(V4中可以免寫) if (BarStatus 0) bLongStoped = bLongStoped1; bShortStoped = bShortStoped1; 多頭或空頭初次進場和再次進場后,都要將這兩個變量復位; bLongStoped = false; bShortStoped = false; 為了配合再進場,我們需要記錄當前的趨勢方向。,52,追蹤止盈后的等待時間,我們可用止盈后的K線根

28、數來衡量。因為我們止盈后bLongStoped或bShortStoped會被置為True,因此我們可通過一個函數NthCon來尋找跟蹤止盈的那根BAR到現在的BAR數。 具體止盈后多少根BAR后趨勢還在持續(xù)再進場,我們可以設置為一個參數:BarsReEntry。多頭再進場部分的代碼如下 BarsAfterLongExit = NthCon(!bLongStoped,1); Commentary(BarsAfterLongExit=+text(BarsAfterLongExit); If(bLongStoped and MarketPosition = 0 and condBuy1 = true

29、 and BarsAfterLongExit = BarsReEntry) Buy(Lots,Open); bLongStoped = False; HigherAfterEntry = Open; ,53,例6:雙均線系統(tǒng),加上跟蹤止盈和再進場策略 Params Numeric Length1(10); Numeric Length2(20); Numeric Lots(1); Numeric TrailingStop(1); / 跟蹤止損百分比 Numeric BarsReEntry(5);/ 出場后趨勢維持多少根Bar后再進場 Vars NumericSeries MA1; Numeri

30、cSeries MA2; BoolSeries condBuy(false); BoolSeries condSell(false); Numeric MinPoint; Numeric MyExitPrice; NumericSeries HigherAfterEntry; NumericSeries LowerAfterEntry; Numeric StopLine(0); BoolSeries bLongStoped(false); BoolSeries bShortStoped(false); Numeric BarsAfterLongExit(0); Numeric BarsAfte

31、rShortExit(0); Begin,/*if (BarStatus 0) / V4中可以省略的序列變量傳遞部分 bLongStoped = bLongStoped1; bShortStoped = bShortStoped1; */ Commentary(bLongStoped=+IIFString(bLongStoped,true,false); Commentary(bShortStoped=+IIFString(bShortStoped,true,false); if (BarsSinceEntry = 1) HigherAfterEntry = AvgEntryPrice; Lo

32、werAfterEntry = AvgEntryPrice; Else If(BarsSinceEntry 1) HigherAfterEntry = Max(HigherAfterEntry1,High1); LowerAfterEntry = Min(LowerAfterEntry1,Low1); Else HigherAfterEntry = HigherAfterEntry1; LowerAfterEntry = LowerAfterEntry1; ,MA1 = AverageFC(Close,Length1); MA2 = AverageFC(Close,Length2); Plot

33、Numeric(MA1,MA1); PlotNumeric(MA2,MA2); condBuy = CrossOver(MA1,MA2); condSell = CrossUnder(MA1,MA2); if ( condBuy = false and condSell = false ) condBuy = condBuy1; condSell = condSell1; If ( MarketPosition 1 and condBuy1 = true and bLongStoped = false) Buy(Lots,Open); HigherAfterEntry = Open; bLongStoped = false; bShortStoped = false; If ( MarKetPosition -1 and condSell1 = true and bShortStoped = false) SellShort(lots,Open); LowerAfterEntry = Open; bLongSt

溫馨提示

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

評論

0/150

提交評論