策略說明:
通過計算市場的潮汐指數(shù),把市場劃分為震蕩和趨勢兩種走勢;震蕩市中
采用開盤區(qū)間突破進(jìn)場稽鞭;趨勢市中采用布林通道突破進(jìn)場。
系統(tǒng)要素:
1引镊、潮汐指數(shù)
2朦蕴、關(guān)鍵價格
3、布林通道
4弟头、真實波幅
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ù)痕貌。//
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芽世,即真實波幅。//
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;? //其實就是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周期的真實波動值。//
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ù)蔚鸥。//
}
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