期貨軟件TB系統(tǒng)源代碼解讀系列73-恒溫器系統(tǒng)

策略說明:

通過計算市場的潮汐指數(shù),把市場劃分為震蕩和趨勢兩種走勢;震蕩市中

采用開盤區(qū)間突破進(jìn)場;趨勢市中采用布林通道突破進(jìn)場。

系統(tǒng)要素:

1、潮汐指數(shù)

2、關(guān)鍵價格

3、布林通道

4、真實(shí)波幅

5、出場均線

入場條件:

1、震蕩市中采用開盤區(qū)間突破進(jìn)場

2、趨勢市中采用布林通道突破進(jìn)場

出場條件:

1、震蕩市時進(jìn)場單的出場為反手信號和ATR保護(hù)性止損

2、趨勢市時進(jìn)場單的出場為反手信號和均線出場

做多代碼及解讀如下:

Params

Numeric swingTrendSwitch(20); // 聲明數(shù)值參數(shù)swingTrendSwitch,初值20,即潮汐指數(shù)小于此值為震蕩市,否則為趨勢市。//

Numeric swingPrcnt1(0.50); // 聲明數(shù)值參數(shù)swingPrcnt1,初值0.5,即震蕩市開倉參數(shù)。//

Numeric swingPrcnt2(0.75); // 聲明數(shù)值參數(shù)swingPrcnt2,初值0.75,即震蕩市開倉參數(shù)。//

Numeric atrLength(10); //聲明數(shù)值參數(shù)atrLength,初值10,即真實(shí)波幅參數(shù)。//

Numeric bollingerLengths(50); // 聲明數(shù)值參數(shù)bollingerLengths,初值50,即布林通道參數(shù)。//

Numeric numStdDevs(2); //聲明數(shù)值參數(shù)numStdDevs,即布林通道參數(shù)。//

Numeric trendLiqLength(50); // 聲明數(shù)值參數(shù)trendLiqLength,初值50,趨勢市時進(jìn)場單的出場均線參數(shù)。//

Numeric Lots(0); // 聲明數(shù)值參數(shù)Lots,初值0,即交易手?jǐn)?shù)。//

Vars

NumericSeries cmiVal(0); //聲明數(shù)值序列變量cmiVal,初值0,即潮汐指數(shù)。//

BoolSeries buyEasierDay(False); // 聲明布爾型序列變量buyEasierDay,初值為假,宜買市。//

BoolSeries sellEasierDay(False); //聲明布爾型序列變量sellEasierDay,初值為假, 宜賣市。//

NumericSeries myATR(0); // 聲明數(shù)值序列變量myATR,初值為0,即真實(shí)波幅。//

NumericSeries MidLine(0); // 聲明數(shù)值序列變量MidLine,初值0,即布林通道中軌。//

Numeric Band(0); //聲明數(shù)值變量Band,初值0.//

NumericSeries upBand(0); // 聲明數(shù)值序列變量upBand,初值0,即布林通道上軌。//

NumericSeries dnBand(0); //聲明數(shù)值序列變量dnBand,初值0, 布林通道下軌。//

NumericSeries trendLokBuy(0);//聲明數(shù)值序列變量trendLokBuy,初值0.//

NumericSeries trendLokSell(0);//聲明數(shù)值序列變量trendLokSell,初值0.//

NumericSeries keyOfDay(0); // 聲明數(shù)值序列變量keyOfDay,初值0,即關(guān)鍵價格。//

NumericSeries swingBuyPt(0); //聲明數(shù)值序列變量swingBuypt,初值0,即 震蕩市的買觸發(fā)價格。//

NumericSeries swingSellPt(0); // 聲明數(shù)值序列變量swingSellpt,初值0,震蕩市的賣觸發(fā)價格//

NumericSeries trendBuyPt(0); //聲明數(shù)值序列變量trendBuypt,初值0,即 趨勢市的買觸發(fā)價格。//

NumericSeries trendSellPt(0); // 聲明數(shù)值序列變量trendSellpt,初值0,即趨勢市的賣觸發(fā)價格。//

NumericSeries swingProtStop(0); //聲明數(shù)值序列變量swingProtStop,初值0, 震蕩市時進(jìn)場單的出場觸發(fā)價格//

NumericSeries trendProtStop(0); // 聲明數(shù)值序列變量trendProtStop,初值0,即趨勢市時進(jìn)場單的出場觸發(fā)價格。//

BoolSeries swingEntry(False); //聲明布爾型序列變量swingEntry,初值為假,即 震蕩市時進(jìn)場標(biāo)識。//

Begin

If(!CallAuctionFilter()) Return;// 集合競價和小節(jié)休息過濾。//

// 計算潮汐指數(shù)用以區(qū)分震蕩市與趨勢市。//

cmiVal = Abs(Close - Close[29])/(Highest(High,30) - Lowest(Low,30))*100; //照順序來看吧,第一個絕對值函數(shù)Abs,即當(dāng)前收盤價減去前第29個收盤價,取絕對值;再看求最高價函數(shù)Highest,即求30周期的最高價;同理,最低函數(shù)Lowest,求30周期的最低價。最后代入公式求解,即得cmiVal值。//

trendLokBuy = Average(Low,3);//求3周期內(nèi)最低價均值。//

trendLokSell= Average(High,3);//求3周期內(nèi)最高價均值。//

// 關(guān)鍵價格。//

keyOfDay = (High + Low + Close)/3;? //其實(shí)就是3個價格的平均值。//

// 震蕩市中收盤價大于關(guān)鍵價格為宜賣市,否則為宜買市。//

buyEasierDay = False;//賦值為假。//

sellEasierDay = False;//賦值為假。//

If(Close[1] > keyOfDay[1]) sellEasierDay = True;//假如前一個收盤價大于前一個關(guān)鍵價,則變量sellEasierDay賦值為真。//

If(Close[1] <= keyOfDay[1]) buyEasierDay = True;//假如前一個收盤價小于等于前一個關(guān)鍵價,則變量buyEasierDay賦值為真。//

// 計算震蕩市的進(jìn)場價格//

myATR = AvgTrueRange(atrLength);//求10周期的真實(shí)波動值。//

If(buyEasierDay == True)//假如變量buyEasierDay等于真的。//

{

swingBuyPt = Open + swingPrcnt1*myATR[1];//代入相應(yīng)數(shù)值即可。//

swingSellPt = Open - swingPrcnt2*myATR[1];//同理,代入相應(yīng)數(shù)值。//

}

If(sellEasierDay == True)//假如變量sellEasierDay等于真。//

{

swingBuyPt = Open + swingPrcnt2*myATR[1];//代入相應(yīng)數(shù)值了。//

swingSellPt = Open - swingPrcnt1*myATR[1];//同理的,其實(shí)主要看的就是系數(shù)。//

}

swingBuyPt = Max(swingBuyPt,trendLokBuy[1]);//比較變量swingBuyPt與前一個變量trendLokBuy值,取較大值。//

swingSellPt = Min(swingSellPt,trendLokSell[1]); //比較swingSellPt值與前一個trendLokSell值,取較小值。//

// 計算趨勢市的進(jìn)場價格,即布林帶系統(tǒng)。//

MidLine = AverageFC(Close,bollingerLengths); //50周期的收盤價均值。//

Band = StandardDev(Close,bollingerLengths,2);?//標(biāo)準(zhǔn)差求值,可返回之前解讀的布林線看具體函數(shù)代碼。//

upBand = MidLine + numStdDevs*Band;//上軌道計算公式。//

dnBand = MidLine - numStdDevs*Band;?//下軌道計算公式。//

trendBuyPt = upBand;//把上軌道賦值給變量trendBuyPt值。//

trendSellPt = dnBand;//把下軌道賦值給變量trendSellPt值。//

// 震蕩市。//

If(cmiVal[1] < swingTrendSwitch) //假如前一個變量cmiVal值小于變量swingTrendSwitch值。//

{

If(MarketPosition != 1 And High >= swingBuyPt) //假如當(dāng)前沒有持多單,且最高價大于等于變量swingBuyPt值。//

{

Buy(Lots,Max(Open,swingBuyPt));//開倉買入。//

swingEntry = True;//變量swingEntry賦值為真。//

}

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= swingSellPt) //假如當(dāng)前持有多單,且建倉數(shù)位大于等于1,且最低價小于等于變量swingSellPt值。//

{

Sell(0,Min(Open,swingSellPt));//平倉。//

swingEntry = False;//變量sweingEntry賦值為假。//

}

}

swingProtStop = 3*myATR;//止損價swingProtStop = 3 *變量myATR值。//

trendProtStop = Average(Close,trendLiqLength); //50周期收盤價均值。//

? // 趨勢市判斷。//

If(cmiVal[1] >= swingTrendSwitch) //假如前一cmiVal值大于等于變量swingTrendSwitch值。//

{

// 震蕩市時進(jìn)場單在趨勢市的出場。//

If(swingEntry == True) //假如變量swingEntry等于真。//

{

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= (EntryPrice - swingProtStop[1])) //假如當(dāng)前持有多單,且建倉數(shù)位大于等于1,且最低價小于等于進(jìn)場價減去前一止損價。//

{

Sell(0,Min(Open,EntryPrice - swingProtStop[1])); //平倉。//

swingEntry = False;//變量swingEntry賦值為假。//

}

}

? // 趨勢市時進(jìn)出場 。//

If(swingEntry == False) //假如變量swingEntry等于假。//

{

If(MarketPosition != 1 And BarsSinceExit >= 1 And High >= trendBuyPt[1]) //假如當(dāng)前沒有持倉,且出場數(shù)位大于等于1,且最高價大于等于前一變量trendBuyPt值。//

{

Buy(Lots,Max(Open,trendBuyPt[1]));//開倉買入。//

}

If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= Max(trendSellPt[1],trendProtStop[1])) //假如持有多單,且建倉數(shù)位大于等于1,且最低價小于等于兩出場價中的較大值。//

{

Sell(0,Min(Open,Max(trendSellPt[1],trendProtStop[1])));//平倉,這里先看比較max值,再比較min值,最后以較小價為平倉價。//

}

}

}

End

做空代碼及結(jié)果如下:

Params

Numeric swingTrendSwitch(20);

Numeric swingPrcnt1(0.50);

Numeric swingPrcnt2(0.75);

Numeric atrLength(10);

Numeric bollingerLengths(50);

Numeric numStdDevs(2);

Numeric trendLiqLength(50);

Numeric Lots(0);

Vars

NumericSeries cmiVal(0);

BoolSeries buyEasierDay(False);

BoolSeries sellEasierDay(False);

NumericSeries myATR(0);

NumericSeries MidLine(0);

Numeric Band(0);

NumericSeries upBand(0);

NumericSeries dnBand(0);

NumericSeries trendLokBuy(0);

NumericSeries trendLokSell(0);

NumericSeries keyOfDay(0);

NumericSeries swingBuyPt(0);

NumericSeries swingSellPt(0);

NumericSeries trendBuyPt(0);

NumericSeries trendSellPt(0);

NumericSeries swingProtStop(0);

NumericSeries trendProtStop(0);

BoolSeries swingEntry(False);

Begin

If(!CallAuctionFilter()) Return;

cmiVal = Abs(Close - Close[29])/(Highest(High,30) - Lowest(Low,30))*100;

trendLokBuy = Average(Low,3);

trendLokSell= Average(High,3);

keyOfDay = (High + Low + Close)/3;

buyEasierDay = False;

sellEasierDay = False;

If(Close[1] > keyOfDay[1]) sellEasierDay = True;

If(Close[1] <= keyOfDay[1]) buyEasierDay = True;

myATR = AvgTrueRange(atrLength);

If(buyEasierDay == True)

{

swingBuyPt = Open + swingPrcnt1*myATR[1];

swingSellPt = Open - swingPrcnt2*myATR[1];

}

If(sellEasierDay == True)

{

swingBuyPt = Open + swingPrcnt2*myATR[1];

swingSellPt = Open - swingPrcnt1*myATR[1];

}

swingBuyPt = Max(swingBuyPt,trendLokBuy[1]);

swingSellPt = Min(swingSellPt,trendLokSell[1]);

MidLine = AverageFC(Close,bollingerLengths);

Band = StandardDev(Close,bollingerLengths,2);?

upBand = MidLine + numStdDevs*Band;

dnBand = MidLine - numStdDevs*Band;?

trendBuyPt = upBand;

trendSellPt = dnBand;

If(cmiVal[1] < swingTrendSwitch)

{

If(MarketPosition != -1 And Low <= swingSellPt)

{

SellShort(Lots,Min(Open,swingSellPt));

swingEntry = True;

}

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= swingBuyPt)

{

BuyToCover(0,Max(Open,swingBuyPt));

swingEntry = False;

}

}

swingProtStop = 3*myATR;

trendProtStop = Average(Close,trendLiqLength);

If(cmiVal[1] >= swingTrendSwitch)

{

If(swingEntry == True)

{

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= (EntryPrice + swingProtStop[1]))

{

BuyToCover(0,Max(Open,EntryPrice + swingProtStop[1]));

swingEntry = False;

}

}

If(swingEntry == False)

{

If(MarketPosition != -1 And BarsSinceExit >= 1 And Low <= trendSellPt[1])

{

SellShort(Lots,Min(Open,trendSellPt[1]));

}

If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= Min(trendBuyPt[1],trendProtStop[1]))

{

BuyToCover(0,Max(Open,Min(trendBuyPt[1],trendProtStop[1])));

}

}

}

End

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容