策略說明:
通過計算市場的潮汐指數(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