隨機在TB裡找了一個系統,看著畫線還不錯的,但交易結果一般,可能是沒有做一點參數優化吧。可以不用它,但可以研究一下它的畫線意思的。
策略說明:
1.計算價格通道
2.收盤價加上ATR的一定倍數作為進場價
入場條件:
1.上一根Bar創新高
2.當前Bar最高價突破上一根Bar收盤價加上ATR的一定倍數
出場條件:
1.記錄多頭進場後的跟蹤止損價
2.價格向下突破跟蹤止損價多頭出場
買賣規則就這樣了,先直接看做多的具體代碼吧,解讀如下:
Params
Numeric Length(10); //聲明數值參數Length,初值10,用於計算ATR和新高價的Bar數。//
Numeric Trigger(0.79);//聲明數值參數Trigger,初值0.79,用於計算多頭進場價的驅動係數。//
Numeric Acceleration(0.05);//聲明數值參數Acceleration,初值0.05,拋物線的加速係數。//
Numeric FirstBarMultp(5);//聲明數值參數FirstBarMultp,初值5,用於計算在進場Bar設置止損價的係數。//
Vars
NumericSeries ATR;//聲明數值序列變量ATR。//
NumericSeries StopPrice;//聲明序列變量StopPrice,即跟蹤止損價。//
NumericSeries HighValue;//聲明數值序列變量HighValue,即多頭進場之後的盈利峰值價。//
NumericSeries AF;//聲明數值序列變量AF。//
BoolSeries Condition1(False);//聲明布爾型序列變量Condition1,初值為假。//
Numeric StopATR;//聲明數值變量StopATR。//
Begin
If(!CallAuctionFilter()) Return;// 集合競價和小節休息過濾。//
//初始設置。//
ATR=AvgTrueRange(Length);//變量ATR的求法,就是之前解讀的拋物線了。//
Condition1=High>Highest(High[1],Length);//先求Highest(High[1],Length)值,再與當前High比較,判斷當前最高價大於成立的,則把值賦值給布爾型變量Condition1值。//
//上一根Bar創新高後且當前Bar最高價突破上一根Bar收盤價加上ATR的一定倍數多頭入場。//
If(Condition1[1])//假如前一個布爾型序列變量Condition1[1]為真。//
{
If(High>=Close[1]+ATR[1]*Trigger And Vol > 0)//假如當前最高價 >= 前一收盤價Close[1] + 前一ATR[1] * 0.79,並且成交量Vol>0.//
{
Buy(0,Max(Open,Close[1]+ATR[1]*Trigger));//開倉買入了。//
}
}
//記錄盈利峰值價和跟蹤止損價。//
StopATR = Average(TrueRange,3);//函數TrueRange,求真實波動值了。函數Average,求平均值。這些都是前面解讀過的,都是把相應數值代回去求值就行。//
If(MarketPosition==1 And BarsSinceEntry==0)//假如持有多單,並且建倉位等於0.//
{
StopPrice=Low-StopATR*FirstBarMultp;//止損價StopPrice = 最低價Low - 變量StopATR * 5.//
AF=Acceleration;//代入值,即AF = 0.05//
HighValue=High;//序列變量HighValue = 當前最高價High。//
}
Else If(MarketPosition==1 And BarsSinceEntry>0)//假如持有多單,並且建倉位大於0.//
{
If(High>HighValue) HighValue=High;//假如當前最高價大於變量HighValue值,則變量HighValue = 當前High值。//
If(HighValue>HighValue[1] And AF<0.2)//假如當前變量HighValue值大於前一個HighValue[1]值的,並且AF < 0.2//
{
AF=AF+Min(Acceleration,0.2-AF);//代入相應值了,依據起始建倉位AF = Acceleration = 0.05,這代碼意思先求括號裡的最小值,再加上AF值,最後再賦值給係數AF了。//
}
StopPrice=StopPrice+AF*(HighValue-StopPrice);//這個StopPrice也是依據起始建倉位算得的值,這裡也就是把相應值給代進去算了。//
}
PlotNumeric("StopPrice",StopPrice);//畫出跟蹤止損價。//
//向下突破跟蹤止損價多頭出場。//
If(MarketPosition==1 And BarsSinceEntry>0 And Low<=StopPrice[1] And Vol > 0)//假如持有多單,並且建倉位大於0,並且最低價小於等於前一個止損價StopPrice值,並且成交量大於0.//
{
Sell(0,Min(Open,StopPrice[1]));//賣出平倉。//
}
End
它的5分鐘週期收益看著也還有點盈利,但我覺得一般的,最主要的還是看它畫線止損的算法。
寫完具體的,下面就是它做空的代碼了:
Params
Numeric Length(10);
Numeric Trigger(0.5);
Numeric Acceleration(0.06);
Numeric FirstBarMultp(2);
Vars
NumericSeries ATR;
NumericSeries StopPrice;
NumericSeries LowValue;
NumericSeries AF;
BoolSeries Condition2(False);
Numeric StopATR;
Begin
If(!CallAuctionFilter()) Return;
ATR=AvgTrueRange(Length);
Condition2=Low If(Condition2[1]) { If(Low<=Close[1]-ATR[1]*Trigger And Vol > 0) {
SellShort(0,Min(Open,Close[1]-ATR[1]*Trigger));
}
}
StopATR = Average(TrueRange,3);
If(MarketPosition==-1 And BarsSinceEntry==0)
{
StopPrice=High+StopATR*FirstBarMultp;
AF=Acceleration;
LowValue=Low;
}Else If(MarketPosition==-1 And BarsSinceEntry>0)
{
If(Low If(LowValue { AF=AF+Min(Acceleration,0.2-AF); } StopPrice=StopPrice-AF*(StopPrice-LowValue); } PlotNumeric("StopPrice",StopPrice); If(MarketPosition==-1 And BarsSinceEntry>0 And High>=StopPrice[1] And Vol > 0) { BuyToCover(0,Max(Open,StopPrice[1])); } End 做空的就很一般了,這波動虧損的,誰還敢用啊,當然還是老話,這個不是它系統不好,你首先還是得先了解它,可能是參數對不上,實在不行,你可以再加個均線要求,比如在均線上方才開多,下方開空等,總能調節一下的。
閱讀更多 依之翊 的文章