TB編程從入門到進階_第1頁
TB編程從入門到進階_第2頁
TB編程從入門到進階_第3頁
TB編程從入門到進階_第4頁
TB編程從入門到進階_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1TB編程從入門到進階

2公式基礎(chǔ)知識1交易策略實現(xiàn)4技術(shù)指標(biāo)編寫2TB編程進階5

TB公式基本概念什么是TB公式?

TB公式類型用戶函數(shù)公式應(yīng)用(包括技術(shù)指標(biāo)、交易指令等)如何創(chuàng)建和應(yīng)用公式?公式導(dǎo)入(*.fbk)

或新建公式應(yīng)用,粘貼代碼,校驗保存公式(編譯)打開超級圖表,選擇交易品種,插入公式應(yīng)用

修改公式應(yīng)用設(shè)置啟動自動策略交易系統(tǒng)3

Bar數(shù)據(jù)(K線數(shù)據(jù))當(dāng)前時間周期下所有K線的相關(guān)數(shù)據(jù),按照時間從先到后的順序排列而成的序列數(shù)據(jù)。每根K線中包含的數(shù)據(jù)如下:4Bar數(shù)據(jù)含義Date當(dāng)前K線的日期Time當(dāng)前K線的開始時間Open當(dāng)前K線的開盤價High當(dāng)前K線的最高價Low當(dāng)前K線的最低價Close當(dāng)前K線的收盤價(最新價)Vol當(dāng)前K線成交量OpenInt當(dāng)前K線持倉量CurrentBar當(dāng)前K線的索引值(K線的編號,從0開始)BarStatus當(dāng)前K線的狀態(tài)值(0—第一根K線、2—最后即最新一根K線、1—其他K線)

Bar數(shù)據(jù)的使用Bar數(shù)據(jù)是TB公式運行的基礎(chǔ)。Bar數(shù)據(jù)是序列數(shù)據(jù),可以回溯讀取(圖示)。舉例:

比較今天的最高價是否突破了昨天的最高價

表達式為:High>High[1]比較今天的最高價是否突破了前兩天的最高價

表達式為:High>High[1]andHigh>High[2]

或者:High>High[1]&&High>High[2]5

序列數(shù)據(jù)6序列變量序列變量序列變量序列變量序列變量序列變量序列變量序列變量序列變量序列變量序列變量序列變量NN-1…210

非序列變量(簡單變量)7

非序列變量

TB公式運行機制從左到右,從上到下

8

盤中和盤后公式運行的差別盤后公式的執(zhí)行情況分析

K線是確定的,不存在信號消失問題;公式在每根K線上只執(zhí)行一遍;

符合開倉條件和平倉條件會標(biāo)出買賣信號(使用Buy、Sell指令),但并不真正發(fā)單;盤中公式的執(zhí)行情況分析K線是變化的,如用最新價或基于最新價計算出的指標(biāo)來作為入場或出場條件會出現(xiàn)信號消失問題;每當(dāng)分筆交易數(shù)據(jù)(tick)傳來時,公式都會執(zhí)行一遍;

符合開倉條件和平倉條件除標(biāo)出買賣信號,還會真正發(fā)單;

有些函數(shù)和數(shù)據(jù)只有盤中才能支持,盤后不支持。

TB公式的結(jié)構(gòu)TB的公式一般由三段組成。Params NumericLength(10);公式參數(shù)段 ……Vars

NumericSeriesMA;公式變量段 ……Begin MA=AverageFC(Close,Length);公式腳本段 ……End10例1:HelloWorldSample1:Begin FileAppend("c:\\tb\\sample1.txt","HelloWorld!");End實驗1:Sample1實驗?zāi)繕?biāo):通過學(xué)習(xí),掌握在TB中如何新建公式應(yīng)用,如何編譯和使用公式。實驗步驟:TB公式

新建公式應(yīng)用

輸入公式簡稱

選擇適當(dāng)?shù)哪0?;在公式編輯器中,輸入sample1的代碼;點擊工具欄中的“校驗保存公式”進行代碼編譯;新建超級圖表,鼠標(biāo)右鍵

插入公式應(yīng)用;到指定文件路徑,查看文件內(nèi)容。公式運行結(jié)果大家都知道每個HelloWorld!都是怎么產(chǎn)生的嗎?例2:輸出BAR數(shù)據(jù)Sample2:Begin FileAppend(“c:\\tb\\sample2.txt","Date="+DateToString(Date) +"Time="+TimeToString(time) +"Close="+Text(Close) +"CurrentBar="+Text(CurrentBar) +"Barstatus="+Text(BarStatus));End例2運行結(jié)果

參數(shù)的作用

假如我們要寫一個均線指標(biāo),現(xiàn)在是用10天做周期。代碼如下: Begin PlotNumeric("MA",AverageFC(Close,10)); End那如果要改用20天做周期,我們必須改程序,把10改成20,然后編譯。下次想用別的周期,還得改,非常麻煩。如果使用參數(shù),就方便多了。程序?qū)懞茫褂脮r改參數(shù)就好了。代碼如下:

Params NumericLength(10); Begin

PlotNumeric("MA",AverageFC(Close,Length)); End數(shù)據(jù)類型TB公式中有三種基本的數(shù)據(jù)類型

數(shù)值型(Numeric)

字符型(String)

布爾型(Bool)為了對變量、參數(shù)進行回溯,又增加了序列類型

數(shù)值型序列變量/參數(shù)(NumericSeries)

字符型序列變量/參數(shù)(StringSeries)

布爾型序列變量/參數(shù)(BoolSeries)為了通過用戶函數(shù)返回多個值,又增加了引用類型

數(shù)值型引用(NumericRef)

字符型引用(StringRef)

布爾型引用(BoolRef)

參數(shù)的聲明和使用參數(shù)在使用前必須進行聲明,聲明方法如下:Params NumericLength(10); StringFilename("D:\\sample2.log");

bool

OutputToFile(false);公式應(yīng)用和用戶函數(shù)的參數(shù)略有不同:公式應(yīng)用的參數(shù)只支持三種基本類型,用戶函數(shù)的參數(shù)支持全部九種類型;公式應(yīng)用的參數(shù)一定要有初始值,而用戶函數(shù)的參數(shù)可以沒有默認(rèn)值;參數(shù)的值在公式的腳本段中只能引用,不能修改;

變量變量的主要用處在于它可以存放計算或比較的結(jié)果,以方便在之后的腳本中直接引用運算的值,而無需重現(xiàn)計算過程。變量在使用前必須進行聲明,聲明方法如下:

Vars

NumericSeriesMA; NumericStopline(30);變量的賦值(變量類型和表達式的類型要一致)

變量名稱=表達式;

例如:MA=AverageFC(Close,10);

常用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)(1)數(shù)值型轉(zhuǎn)字符型:StringText(Numericvalue)

例如:Text(1.2345)返回值為"1.2345"字符型轉(zhuǎn)數(shù)值型:NumericValue(String

str)

例如:Value("1.2345")返回值為1.2345根據(jù)布爾型值返回轉(zhuǎn)字符型或數(shù)值型:NumericIIF(Bool

Conditon,Numeric

TrueValue,Numeric

FalseValue)

例如:IIF(Close>Open,Close,Open);StringIIFString(Bool

Conditon,String

TrueValue,String

falseValue)

例如:IIFString(Close>Open,"陽線","陰線");

常用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)(2)日期時間值轉(zhuǎn)字符型:

StringDateTimeToString(Numeric

dtDateTime)

例如:

DateTimeToString(20040612.114323)="2004-06-1211:43:23"

日期值轉(zhuǎn)字符型:StringDateToString(Integer

nDate)時間值轉(zhuǎn)字符型:StringTimeToString(Numeric

fTime)將字符串轉(zhuǎn)化為日期時間:

NumericStringToDateTime(String

str)例如:StringToDateTime("2003-02-2312:24:55")=20030223.122455將字符串轉(zhuǎn)化為日期:IntegerStringToDate(String

str)將字符串轉(zhuǎn)化為時間:IntegerStringToTime(String

str)例3:使用參數(shù)和變量Sample3:Params StringFilename("c:\\tb\\sample3.txt");Vars Numericchange;Begin change=Close-Close[1];

FileAppend(Filename,"Date="+DateToString(Date) +"Time="+TimeToString(time) +"Close="+Text(Close) +"漲跌:"+text(change));End例3運行結(jié)果

變量的存續(xù)周期簡單變量在每次公式運行時,被賦默認(rèn)值,公式運行過程中存在,公式運行完后不再存在;序列變量的生存周期V3和V4略有區(qū)別:V3:每次公式運行時,序列變量被賦默認(rèn)值,公式運行完后仍然存在,但下次如果還是同一根Bar運行公式的話,變量值又會被賦成默認(rèn)值;V4:每次公式運行時,除了第一根BAR會被賦默認(rèn)值,其他BAR會自動傳遞上一根BAR的值,公式運行完后仍然存在,但下次如果還是同一根BAR運行公式的話,變量值又會傳遞上一根BAR的值;只有一根BAR的最后一個Tick公式運行完后,序列變量的值才能保留下來。24例4:變量的存續(xù)周期差別Sample4:Vars Numericjdbl;

NumericSeries

xlbl;Begin FileAppend("c:\\tb\\sample4.txt","Bartime=" +DateTimeToString(date+time) +"\tCurrentTime="+TimeToString(Currenttime) +"\t公式運行前Jdbl="+Text(jdbl) +"xlbl="+Text(xlbl));

jdbl=jdbl+1;

xlbl=xlbl+1; FileAppend("c:\\tb\sample4.txt","Bartime=" +DateTimeToString(date+time) +"\tCurrentTime="+TimeToString(Currenttime) +"\t公式運行后Jdbl="+Text(jdbl) +"xlbl="+Text(xlbl));End實驗2:Sample4實驗?zāi)繕?biāo):通過實驗,理解TB中簡單變量和序列變量的區(qū)別,了解簡單變量和序列變量的存續(xù)周期;學(xué)習(xí)如何設(shè)置圖表的K線樣本數(shù)。實驗步驟:新建公式應(yīng)用,在公式編輯器中,輸入Sample4的代碼;新建超級圖表,任意選擇一個交易品種,

設(shè)置時間周期,鼠標(biāo)右鍵點擊圖表,進入“商品設(shè)置”,選擇商品合約后,點“屬性”,修改樣本數(shù)為“10”后確定返回;插入公式應(yīng)用Sample4;打開Sample4.txt,分析和思考在盤后K線和實時K線中簡單變量和序列變量值的變化過程以及產(chǎn)生的原因。

Sample4運行結(jié)果1

Sample4運行結(jié)果2(實時)注釋語句--CommentaryTB的信息輸出,除了可以通過FileAppend輸出到文件外,也可以將信息輸出顯示到圖表上;Commentary的用法:

在超級圖表的當(dāng)前BAR添加一行注釋信息;參數(shù):String

strTip;//提示的信息例5:改寫例2Sample5:Begin

Commentary("Date="+DateToString(Date));

Commentary("Time="+TimeToString(time));

Commentary("Open="+Text(Open));

Commentary("High="+Text(High));

Commentary("Low="+Text(Low));

Commentary("Close="+Text(Close));

Commentary("CurrentBar="+Text(CurrentBar));

Commentary("Barstatus="+Text(BarStatus));End例5運行結(jié)果

控制語句條件語句(If-Else)if語句if-else語句if-Elseif語句if-Else嵌套循環(huán)語句(For\While)For循環(huán)變量=初始值TO結(jié)束值For循環(huán)變量=初始值Downto

結(jié)束值While循環(huán)條件語句----IFElse語句語法如下:If(Condition){

TB公式語句1;}Else{

TB公式語句2;}如果TB公式語句是單條,您可以省略{},二條或者二條以上的語句必須使用{}。For語句1For語句是一個循環(huán)語句,重復(fù)執(zhí)行某項操作,直到循環(huán)結(jié)束。語法如下:For循環(huán)變量=初始值To結(jié)束值{

TradeBlazer公式語句;}For循環(huán)的執(zhí)行是從循環(huán)變量從初始值到結(jié)束值,按照步長為1遞增,依次執(zhí)行TradeBlazer公式語句,結(jié)束值必須大于或等于初始值才有意義。For語句2如果希望For語句從大到小進行循環(huán),可以使用以下的語法:For循環(huán)變量=初始值DownTo

結(jié)束值

{

TradeBlazer公式語句;}For-DownTo讓循環(huán)變量從結(jié)束值每次遞減1直到等于結(jié)束值,依次調(diào)用TradeBlazer公式語句執(zhí)行,初始值必須大于或等于結(jié)束值才有意義。

例6:For語句求和及均線Sample6:Params NumericLength(10);Vars NumericSumValue(0); NumericMA; Numerici;Begin

SumValue=0; fori=0toLength-1 {

SumValue=SumValue+Close[i]; } MA=SumValue/Length;

Commentary("SumValue="+text(SumValue));

Commentary("MA="+Text(MA));EndWhile循環(huán)While語句在條件為真的時候重復(fù)執(zhí)行某一項操作。即,只要條件表達式的值為真(True)時,就重復(fù)執(zhí)行某個動作。直到行情信息改變以致條件為假(False)時,循環(huán)才結(jié)束。

語法如下:While(Condition){

TradeBlazer公式語句;}Continue和Break

例7:BarsSinceTodaySample7:(求當(dāng)天第一根Bar到現(xiàn)在的BAR數(shù))Vars NumericTodayBars;Begin

TodayBars=0; While(CurrentBar>TodayBarsand

date[TodayBars]==date[TodayBars+1]) {

TodayBars=TodayBars+1; }

Commentary("TodayBars="+text(TodayBars));End

BarsSinceToday的算法Vars

NumericSeries

ReBars;Begin

If(CurrentBar==0||Date!=Date[1]) {

ReBars=0; }Else {

ReBars=ReBars+1; } ReturnReBars;End40公式基礎(chǔ)知識1交易策略實現(xiàn)4技術(shù)指標(biāo)編寫2TB編程進階541技術(shù)指標(biāo)輸出函數(shù)(1)

PlotNumeric–在當(dāng)前BAR輸出一個數(shù)值

參數(shù):StringName-----輸出值的名稱;

NumericNumber-----輸出的數(shù)值;

NumericLocator=0-----輸出值的定位點;

IntegerColor=-1-----輸出值的顏色;

IntegerBarsBack=0-----從當(dāng)前BAR回溯的BAR數(shù)舉例: PlotNumeric(“MA”,AverageFC(Close,10));

輸出均線指標(biāo)值

PlotNumeric(“OpenToClose”,open,close);

輸出開盤價與收盤價的連線(線型選擇柱狀圖)42技術(shù)指標(biāo)輸出函數(shù)(2)

PlotString–在當(dāng)前BAR輸出一個字符串

參數(shù):StringName-----輸出值的名稱

Stringstr-----輸出的字符串;

NumericLocator=0-----輸出值的定位點;

IntegerColor=-1-----輸出值的顏色;

IntegerBarsBack=0-----從當(dāng)前BAR回溯的BAR數(shù)舉例:

PlotString("CandleStick","陽線",Low,Red);

在Bar的最低價位置輸出字符串“陽線”,并顯示為紅色43技術(shù)指標(biāo)輸出函數(shù)(3)

PlotBool–在當(dāng)前BAR輸出一個布爾值

參數(shù):StringName-----輸出值的名稱

Bool

bPlot-----輸出的布爾值;

NumericLocator=0-----輸出值的定位點;

IntegerColor=-1-----輸出值的顏色;

IntegerBarsBack=0-----從當(dāng)前BAR回溯的BAR數(shù)舉例:

PlotString(“con",con,High);

在Bar的最高價位置輸出布爾變量con的值,如果con為真,則顯示“笑臉”圖標(biāo),否則顯示為“哭臉”圖標(biāo)實驗3:Sample8實驗?zāi)繕?biāo):通過實驗,學(xué)習(xí)TB中技術(shù)指標(biāo)的編寫;掌握PlotNumeric、PlotString和PlotBool函數(shù)的用法;掌握正確設(shè)置技術(shù)指標(biāo)的屬性。實驗步驟:新建公式應(yīng)用,在公式編輯器中,輸入Sample8的代碼;點擊“文件”-》“屬性設(shè)置”-》在“常規(guī)”中選擇“主圖顯示”,在線型中針對不同的線選擇適當(dāng)?shù)木€型、粗細(xì)和顏色等等,然后“校驗保存公式”;新建超級圖表,選擇交易品種和時間周期,插入公式應(yīng)用;觀察指標(biāo)的輸出結(jié)果。45例8:自編指標(biāo)的輸出Sample8:

單均線加通道指標(biāo)Params NumericLength(10); //均線周期

NumericFilterPercent(20); //通道幅度比例(%%)Vars

NumericSeriesMA;

NumericSeries

UpperBand;

NumericSeries

LowerBand;

Bool

ConBuy(False);

Bool

ConSell(False);Begin MA=AverageFC(Close,Length);

UpperBand=MA*(1+FilterPercent/10000);

LowerBand=MA*(1-FilterPercent/10000);46

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",ConBuy,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); }End47

Sample8運行結(jié)果

48指標(biāo)編寫常見問題指標(biāo)編寫完成后,還要注意在屬性設(shè)置中進行相應(yīng)的設(shè)置;指標(biāo)是在主圖顯示還是在子圖顯示;指標(biāo)的線型;從V3轉(zhuǎn)到V4的客戶注意參數(shù)的位置另外學(xué)習(xí)的例子可以參考:MACD指標(biāo)的寫法(柱狀圖)SAR指標(biāo)(點圖)49公式基礎(chǔ)知識1交易策略實現(xiàn)4技術(shù)指標(biāo)編寫2TB編程進階5

TB用戶函數(shù)

用戶函數(shù)是可以通過名稱進行調(diào)用的一組語句的集合,實際應(yīng)用中一般將某些經(jīng)常需要用到的功能做成用戶函數(shù)以方便以后編程時調(diào)用;用戶函數(shù)一般有一個返回值,類型可以是三種基本類型之一;用戶函數(shù)通過參數(shù)傳入數(shù)據(jù),通過返回值或引用型變量返回值;用戶函數(shù)間可以相互調(diào)用,也可以遞歸調(diào)用;用戶函數(shù)分為內(nèi)建用戶函數(shù)和其他用戶函數(shù),內(nèi)建用戶函數(shù)可以查看和調(diào)用,不能修改;

例9:求平均值

Sample9:這是求平均值的內(nèi)建用戶函數(shù),其中就調(diào)用了summation函數(shù)Params

NumericSeriesPrice(1); NumericLength(10);Vars NumericAvgValue;Begin

AvgValue=Summation(Price,Length)/Length; ReturnAvgValue;End

例10:求極值

Sample10:這是求極值的內(nèi)建用戶函數(shù),其中就用到了引用參數(shù)Params

NumericSeriesPrice(1); NumericLength(10);

Bool

bMax(True);

NumericRef

ExtremeBar; Vars

NumericSeries

MyVal;

NumericSeries

MyBar; Numerici;Begin

MyVal=Price;

MyBar=0;

If(CurrentBar<=Length-1||MyBar[1]==Length-1) { fori=1toLength-1 { If(bMax)

{ If(Price[i]>MyVal) {

MyVal=Price[i];

MyBar=i; } }Else { If(Price[i]<MyVal) {

MyVal=Price[i];

MyBar=i; } } } }Else { If(bMax) { If(Price>=MyVal[1]) {

MyVal=Price;

MyBar=0; }Else

{

MyVal=MyVal[1];

MyBar=MyBar[1]+1; } }Else { If(Price<=MyVal[1]) {

MyVal=Price;

MyBar=0; }Else {

MyVal=MyVal[1];

MyBar=MyBar[1]+1; } } }

ExtremeBar=MyBar; ReturnMyVal;End序列函數(shù)序列函數(shù)是一種特殊的用戶函數(shù),當(dāng)它的參數(shù)或變量中使用了序列變量時,我們就稱之為序列函數(shù);序列數(shù)據(jù)作為普通計算機語言和TB語言的重要區(qū)別,是進行金融序列數(shù)據(jù)計算的的核心;為保證序列數(shù)據(jù)的正確計算,序列函數(shù)需要每個BAR都調(diào)用,否則序列函數(shù)中的序列數(shù)據(jù)會不正確;除非算法需要,否則建議不要在條件語句內(nèi)、循環(huán)語句內(nèi)以及包含邏輯運算符的條件表達式中使用序列函數(shù)。56公式基礎(chǔ)知識1交易策略實現(xiàn)4技術(shù)指標(biāo)編寫2TB編程進階557交易指令–Buy/Sell

Buy--平掉所有空頭持倉,開多頭倉位;sell--平掉指定多頭持倉;

Sellshort--平掉所有多頭持倉,開空頭倉位;

Buytocover--平掉指定空頭持倉。

參數(shù):NumericShare買入數(shù)量,默認(rèn)=0時,使用系統(tǒng)設(shè)置參數(shù)NumericPrice買入價格,為浮點數(shù),默認(rèn)=0時為使用現(xiàn)價(非最后Bar為Close)。58交易指令

A_SendOrder針對當(dāng)前公式應(yīng)用的帳戶、商品發(fā)送委托單。該函數(shù)直接發(fā)單,不經(jīng)過任何確認(rèn),并會在每次公式計算時發(fā)送,一般需要配合著倉位頭寸進行條件處理,在不清楚運行機制的情況下慎用。不能使用于歷史測試,僅適用于實時行情交易。參數(shù):BuyOrSell

:買賣類型,買Enum_Buy/賣Enum_Sell;EntryOrExit:開平倉類型,開倉Enum_Entry/平倉Enum_Exit /平今Enum_ExitToday;fLot

委托單的交易數(shù)量;fPrice

委托單的交易價格。

疊加多個商品合約進行交易TB可以在一個圖表中插入多個商品合約,支持同時對多個商品合約數(shù)據(jù)源編寫公式應(yīng)用。具體的方法是在交易指令、BAR數(shù)據(jù)及系統(tǒng)函數(shù)前加上數(shù)據(jù)源。TB中數(shù)據(jù)源的命名規(guī)則如下:Data0:圖表中最開始選擇的商品合約Data1:第一個插入的商品合約Data2:第二個插入的商品合約……一個圖表最多支持50個數(shù)據(jù)源;調(diào)用方法:

Data1.A_SendOrder(…)Data2.Buy(….) Data3.CloseData4.MarketPosition

59

交易常用系統(tǒng)函數(shù)介紹IntegerMarketPosition()---獲得當(dāng)前的持倉狀態(tài)返回值為整型。返回值定義如下: -1當(dāng)前位置為持空倉

0當(dāng)前位置為持平

1當(dāng)前位置為持多倉

這個函數(shù)用來配合Buy/Sell指令工作,對A_SendOrder無效。IntegerBarsSinceEntry()---獲得當(dāng)前持倉的第一個建倉位置到當(dāng)前位置的Bar計數(shù)。只有當(dāng)MarketPosition!=0時,即有持倉的狀況下,該函數(shù)才有意義,否則返回0;在開倉Bar上為0。60

Bool

CrossOver(NumericSeriesPrice1,NumericSeriesPrice2)---求Price1是否上穿Price2返回值為布爾型。Price1和Price2必須為數(shù)值型序列值。Bool

CrossUnder(NumericSeriesPrice1,NumericSeriesPrice2)---求Price1是否下穿Price2返回值為布爾型。Price1和Price2必須為數(shù)值型序列值。61信號消失問題(1)產(chǎn)生原因:使用變化的價格(如Close)或是基于最新價Close計算的技術(shù)指標(biāo),來作為交易的進場、出場或止損條件時,就會產(chǎn)生信號消失問題。如果編寫的公式策略中存在信號閃爍問題,在歷史測試中會得出失真的測試結(jié)果,在實盤交易時,更會因為重復(fù)發(fā)單造成嚴(yán)重?fù)p失。信號消失問題的一般解決辦法:延遲發(fā)單或用前一根K線的數(shù)據(jù)來做為判斷條件用能保持得住的價格來做為判斷條件信號消失問題(2)用前一根K線做判斷舉例: condition=交易條件 If(condition[1]) { Buy(1,Open); }用High,Low,Open等做判斷If(High>High[1]){ buy(1,High[1]);}

例11:雙均線系統(tǒng)交易規(guī)則:如果短期均線上穿長期均線,做多,如原來持有空單,則先平空單,再建多倉如果短期均線下穿長期均線,做空,如原來持有多單,則先平多單,再建空單短周期:10長周期:20交易頭寸暫為1手64

實現(xiàn)代碼Sample11:Params

NumericLength1(10); NumericLength2(20); NumericLots(1);Vars

NumericSeriesMA1;

NumericSeriesMA2;

BoolSeries

condBuy(false);

BoolSeries

condSell(false);Begin MA1=AverageFC(Close,Length1); MA2=AverageFC(Close,Length2);65

PlotNumeric("MA1",MA1); PlotNumeric("MA2",MA2);

condBuy=CrossOver(MA1,MA2);

condSell=CrossUnder(MA1,MA2); If(MarketPosition<>1andcondBuy[1]==true)

Buy(Lots,Open); If(MarKetPosition<>-1andcondSell[1]==true) SellShort(lots,Open);End6667公式基礎(chǔ)知識1交易策略實現(xiàn)4技術(shù)指標(biāo)編寫2TB編程進階5

止盈止損策略的實現(xiàn)止盈止損的設(shè)置有多種方法,常見的有:固定點數(shù)價格百分比進場價的一定比例;平均波動范圍的一定比例;形態(tài)判斷下面以固定點數(shù)止損,進場價的一定比例止盈為例,來實現(xiàn)它。68

例12:止盈止損的代碼Sample12:Params NumericTakeProfit(1);//百分比NumericStopLoss(20);Vars NumericMinPoint; NumericMyEntryPrice; NumericMyExitPrice;Begin

MinPoint=MinMove*PriceScale;

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);69

}Elseif(Low<MyEntryPrice-Stoploss*MinPoint) {

MyExitPrice=MyEntryPrice-Stoploss*MinPoint; if(Open<MyExitPrice)MyExitPrice=Open; Sell(0,MyExitPrice); } }Elseif(MarketPosition==-1) { if(Low<=MyEntryPrice*(1-TakeProfit*0.01)) {

MyExitPrice=MyEntryPrice*(1-TakeProfit*0.01); if(open<MyExitPrice)MyExitPrice=Open; BuyToCover(0,MyExitPrice); }ElseIf(High>MyEntryPrice+Stoploss*MinPoint) { MyExitPrice=MyEntryPrice+Stoploss*MinPoint; if(Open>MyExitPrice)MyExitPrice=Open; BuyToCover(0,MyExitPrice); } }End70

追蹤止盈策略的實現(xiàn)追蹤止盈的設(shè)置也有多種方法,常見的有:峰值價回落固定點數(shù)峰值價回落一定的百分比峰值價的一定比例;平均波動范圍的一定比例;開盤價的一定比例。是否盈利達到一定幅度才啟用追蹤止盈;動態(tài)的回落點數(shù)或比例。下面以峰值價回落一定比例為例,來實現(xiàn)它。71

例13:追蹤止盈的代碼Sample13:Params

NumericTrailingStop(1);//跟蹤止損百分比Vars

NumericMinPoint; NumericMyExitPrice;

NumericSeries

HigherAfterEntry;

NumericSeries

LowerAfterEntry; NumericStopLine(0);Begin if(BarsSinceEntry==1) {

HigherAfterEntry=AvgEntryPrice;

LowerAfterEntry=AvgEntryPrice; }ElseIf(BarsSinceEntry>1) {

HigherAfterEntry=Max(HigherAfterEntry[1],High[1]);

LowerAfterEntry=Min(LowerAfterEntry[1],Low[1]); }72

Else {

HigherAfterEntry=HigherAfterEntry[1];

LowerAfterEntry=LowerAfterEntry[1]; }

MinPoint=MinMove*PriceScale;

If(MarketPosition==1) {

StopLine=HigherAfterEntry*(1-TrailingStop*0.01);

If(Low<=StopLine) {

MyExitPrice=StopLine-MinPoint;

If(Open<MyExitPrice)MyExitPrice=Open; Sell(0,MyExitPrice); } }ElseIf(MarketPosition==-1) {

StopLine=LowerAfterEntry*(1+TrailingStop*0.01);

If(High>=StopLine) {

MyExitPrice=StopLine+MinPoint;

If(Open>MyExitPrice)MyExitPrice=Open; BuyToCover(0,MyExitPrice); } }End7374應(yīng)注意的問題如果單根K線的最高價和最低價相差很大,有可能出現(xiàn)止盈和止損同時滿足的情況,解決辦法:切換到更小的時間周期上進行交易;擴大止盈和止損的幅度在開倉BAR,因無法判斷開倉價和最高價最低價的先后順序,因此一般是在開倉BAR的后一根BAR才開始判斷是否滿足止盈止損或跟蹤止盈的的條件。如交易策略需要及時的止損,同樣需要切換到更小的時間周期上進行交易。

K線波動太大的問題進場位置和盈利峰值價計算開盤價最低價追蹤止損價盈利峰值價止損沒被止損

開盤價進場的追蹤止損開盤價(進場價)最低價追蹤止損價以進場價作為盈利峰值價止損

再進場策略的設(shè)計使用止損止盈或追蹤止盈出場后,如果趨勢沒有改變,我們?nèi)匀恍枰龠M場的策略以避免錯失大的波段趨勢;可以考慮的再入場的方法有:價格創(chuàng)出新高或新低,再次入場;出場后一定時間后,大趨勢仍未改變則再次入場;出場后大趨勢未改變,其他輔助指標(biāo)出現(xiàn)和大趨勢一致的進場信號時再次入場。下面以出場后一定時間后大趨勢仍未改變即再次入場的方法來舉例。78

跟蹤止盈后,我們要設(shè)個標(biāo)志,表示曾經(jīng)出場過,因此要增加兩個布爾型序列變量;

BoolSeries

bLongStoped(false);

BoolSeries

bShortStoped(false);跟蹤止盈后,設(shè)置這兩個變量;//多頭跟蹤止盈后

If(Low<=StopLine) {

…… Sell(0,MyExitPrice);

bLongStoped=true; }//空頭跟蹤止盈后

If(High>=StopLine) {

…… BuyToCover(0,MyExitPrice);

bShortStoped=true; }79

這兩個序列變量值必須往下傳遞(V4中可以免寫)

if(BarStatus>0) {

bLongStoped=bLongStoped[1];

bShortStoped=bShortStoped[1]; }多頭或空頭初次進場和再次進場后,都要將這兩個變量復(fù)位;

bLongStoped=false;

bShortStoped=false;為了配合再進場,我們需要記錄當(dāng)前的趨勢方向,以例9的雙均線交叉為例,我們需要增加以下代碼:

if(condBuy==falseandcondSell==false) {

condBuy=condBuy[1];

condSell=condSell[1]; }80

追蹤止盈后的等待時間,我們可用止盈后的K線根數(shù)來衡量。因為我們止盈后bLongStoped或bShortStoped會被置為True,因此我們可通過一個函數(shù)NthCon來尋找跟蹤止盈的那根BAR到現(xiàn)在的BAR數(shù)。具體止盈后多少根BAR后趨勢還在持續(xù)再進場,我們可以設(shè)置為一個參數(shù):BarsReEntry。多頭再進場部分的代碼如下

BarsAfterLongExit=NthCon(!bLongStoped,1);

Commentary("BarsAfterLongExit="+text(BarsAfterLongExit));

If(bLongStopedandMarketPosition==0andcondBuy[1]==true andBarsAfterLongExit>=BarsReEntry) {

Buy(Lots,Open);

bLongStoped=False;

HigherAfterEntry=Open; }81例14:雙均線完整策略Sample14:例11加上跟蹤止盈和再進場策略Params

NumericLength1(10); NumericLength2(20); NumericLots(1); NumericTrailingStop(1); //跟蹤止損百分比

NumericBarsReEntry(5); //出場后趨勢維持多少根Bar后再進場Vars

NumericSeriesMA1;

NumericSeriesMA2;

BoolSeries

condBuy(false);

BoolSeries

condSell(false); NumericMinPoint; NumericMyExitPrice;

NumericSeries

HigherAfterEntry;

NumericSeries

LowerAfterEntry; NumericStopLine(0);

BoolSeries

bLongStoped(false);

BoolSeries

bShortStoped(false); NumericBarsAfterLongExit(0); NumericBarsAfterShortExit(0);Begin

/*if(BarStatus>0)//V4中可以省略的序列變量傳遞部分 {

bLongStoped=bLongStoped[1];

bShortStoped=bShortStoped[1]; }*/

Commentary("bLongStoped="+IIFString(bLongStoped,"true","false"));

Commentary("bShortStoped="+IIFString(bShortStoped,"true","false")); if(BarsSinceEntry==1) {

HigherAfterEntry=AvgEntryPrice;

LowerAfterEntry=AvgEntryPrice; }ElseIf(BarsSinceEntry>1) {

HigherAfterEntry=Max(HigherAfterEntry[1],High[1]);

LowerAfterEntry=Min(LowerAfterEntry[1],Low[1]); } Else {

HigherAfterEntry=HigherAfterEntry[1];

LowerAfterEntry=LowerAfterEntry[1]; }

MA1=AverageFC(Close,Length1); MA2=AverageFC(Close,Length2); PlotNumeric("MA1",MA1); PlotNumeric("MA2",MA2);

condBuy=CrossOver(MA1,MA2);

condSell=CrossUnder(MA1,MA2); if(condBuy==falseandcondSell==false) {

condBuy=condBuy[1];

condSell=condSell[1]; } If(MarketPosition<>1andcondBuy[1]==trueandbLongStoped==false) {

Buy(Lots,Open);

HigherAfterEntry=Open;

bLongStoped=false;

bShortStoped=false; } If(MarKetPosition<>-1andcondSell[1]==trueandbShortStoped==false) {

SellShort(lots,Open);

LowerAfterEntry=Open;

bLongStoped=false;

bShortStoped=false; }

BarsAfterLongExit=NthCon(!bLongStoped,1);

Commentary("BarsAfterLongExit="+text(BarsAfterLongExit));

If(bLongStopedandMarketPosition==0andcondBuy[1]==true andBarsAfterLongExit>=BarsReEntry) {

Buy(Lots,Open);

bLongStoped=False;

HigherAfterEntry=Open; Return; }

BarsAfterShortExit=NthCon(!bShortStoped,1);

Commentary("BarsAfterShortExit="+text(BarsAfterShortExit));

If(bShortStopedandMarketPosition==0andcondSell[1]==true andBarsAfterShortExit>=BarsReEntry) {

SellShort(Lots,Open);

bShortStoped=False;

LowerAfterEntry=Open; Return; }

MinPoint=MinMove*PriceScale;

If(MarketPosition==1) {

StopLine=HigherAfterEntry*(1-TrailingStop*0.01);

If(Low<=StopLine) {

MyExitPrice=StopLine-MinPoint;

If(Open<MyExitPrice)MyExitPrice=Open; Sell(0,MyExitPrice);

bLongStoped=true; } }ElseIf(MarketPosition==-1) {

StopLine=LowerAfterEntry*(1+TrailingStop*0.01);

If(High>=StopLine) {

MyExitPrice=StopLine+MinPoint;

If(Open>MyExitPrice)MyExitPrice=Open; BuyToCover(0,MyExitPrice);

bShortStoped=true; } }End實驗4:Sample14實驗?zāi)繕?biāo):通過實驗,學(xué)習(xí)TB中交易策略的編寫;理解交易策略中具體的進場、出場、再進場、再出場規(guī)則的設(shè)計思路和代碼實現(xiàn);掌握公式應(yīng)用的全局設(shè)置以及交易品種費率的調(diào)整;掌握歷史回測和參數(shù)優(yōu)化工具的使用。實驗步驟:新建公式應(yīng)用,輸入Sample14的代碼,編譯通過;打開超級圖表,選好品種和時間周期,插入公式應(yīng)用;右鍵點擊圖表-》商品設(shè)置-》交易-》修改保證金率和傭金比率;右鍵點擊圖表-》公式應(yīng)用設(shè)置-》全局交易設(shè)置;點擊“工具”-》投資組合性能測試報告,進行歷史測試;點擊“工具”-》交易策略參數(shù)優(yōu)化報告,進行參數(shù)優(yōu)化。全局變量序列變量的缺陷序列變量在每個BAR只能有一個值,這個值在行情更新時,會不斷刷新,直到最后一個Tick才能將值保存下來;因此,序列變量無法記錄盤中每個Tick運行公式產(chǎn)生的數(shù)據(jù);比如:我們要對每個Tick計數(shù),用序列變量就做不到。全局變量全局變量通過SetGlobalVar和GetGlobalVar函數(shù)來設(shè)置和讀取,TBV4中單個公式應(yīng)用可以支持500個全局變量;Bool

SetGlobalVar(Integer

nIndex,Numeric

fVal)

參數(shù):nIndex---全局變量的索引值

fVal---要設(shè)置的變量的值

如:SetGlobalVar(0,1)將0號全局變量設(shè)置為1;NumericGetGlobalVar(Integer

nIndex)獲取某個索引的全局變量值

全局變量的初始值為無效值,它的值不會因為當(dāng)前BAR的變化而變化,而只能由SetGlobalVar函數(shù)來設(shè)置;全局變量依附在超級圖表上,一旦關(guān)掉超級圖表后,所有與該圖表有關(guān)的全局變量將不復(fù)存在;全局變量值的變化只跟SetGlobalVar的執(zhí)行順序有關(guān),因此在圖表上進行刷新時,必須考慮因公式重新運行導(dǎo)致的全局變量值的變化。

例15:記錄BAR的tick數(shù)Sample15:Vars

NumericSeries

SeTickCnt; NumericTickCnt; NumericGlobTickCnt; Numericbartime;Begin

bartime=GetGlobalVar(0); if(CurrentBar==0||bartime==InvalidNumeric) {

bartime=date+time; SetGlobalVar(0,bartime);

TickCnt=1;

SeTickCnt=1;

GlobTickCnt=1; SetGlobalVar(1,GlobTickCnt); FileAppend("c:\\tb\\Sample15.txt","Bartime="+DateTimeToString(date+time) +"計數(shù)器初始化,全局變量時間="+DateTimeToString(bartime) +"TickCnt="+Text(tickcnt)+"SeTickCnt="+Text(SeTickCnt) +"GlobTickCnt="+Text(GlobTickCnt)); }elseif(Date+Time>bartime)

{

bartime=Date+Time; SetGlobalVar(0,bartime);

TickCnt=1;

SeTickCnt=1;

GlobTickCnt=1; SetGlobalVar(1,GlobTickCnt); FileAppend("c:\\tb\\Sample15.txt","Bartime="+DateTimeToString(date+time) +"新K線產(chǎn)生,全局變量時間="+DateTimeToString(bartime) +"

TickCnt="+Text(tickcnt)+"SeTickCnt="+Text(SeTickCnt) +"GlobTickCnt="+Text(GlobTickCnt)); }ElseIf(Date+Time==bartime) {

TickCnt=TickCnt+1;

SeTickCnt=SeTickCnt+1;

GlobTickCnt=GetGlobalVar(1)+1; SetGlobalVar(1,GlobTickCnt); FileAppend("c:\\tb\\Sample15.txt","Bartime="+DateTimeToString(date+time) +"原K線增加計數(shù),全局變量時間="+DateTimeToString(bartime) +"TickCnt="+Text(tickcnt)+"SeTickCnt="+Text(SeTickCnt) +"GlobTickCnt="+Text(GlobTickCnt)); }End

Sample15運行結(jié)果Sample15運行結(jié)果寫數(shù)據(jù)庫文件SetTBProfileString

寫信息文件

溫馨提示

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

評論

0/150

提交評論