策略说明:
基于凯特纳通道的交易系统
系统要素:
1. 计算关键价格的凯特纳通道
2. 价格突破凯特纳通道后,设定入场触发单
入场条件:
1、价格突破凯特纳通道后,在当根K线高点之上N倍通道幅度,设定多头触发单,此开仓点将挂单X根k线
2、价格突破凯特纳通道后,在当根K线低点之下N倍通道幅度,设定空头触发单,此开仓点将挂单X根k线
出场条件:
1. 价格下穿轨道中轨时平仓
2. 价格小于N周期低点平仓
做多代码及解读如下:
Params
Numeric length(10); //声明数值参数length,初值10,即均线参数。//
Numeric Constt(1.2); // 声明数值参数Constt,初值1.2,即通道倍数。//
Numeric ChanPcnt(0.5) ; // 声明数值参数ChanPcnt,初值0.5,即入场参数。//
Numeric buyN(5); // 声明数值参数buyN,初值5,入场触发条件有效K线周期。//
Numeric stopN(4); //声明数值参数stopN,初值4, 低点止损参数。//
Vars
NumericSeries Price(0); // 声明数值序列变量Price,初值0,即价格。//
NumericSeries KCU(0); // 声明数值序列变量KCU,初值0,通道上轨。//
NumericSeries KCL(0); // 声明数值序列变量KCL,初值0,通道下轨。//
NumericSeries ChanRng(0); //声明数值序列变量ChanRng,初值0, 通道宽度。//
NumericSeries AvgVal(0); //声明数值序列变量AvgVal,初值0,通道中轨。//
NumericSeries AvgRange(0); // 声明数值序列变量AvgRange,初值0,真实波动均值。//
NumericSeries Setbar(0); //声明数值序列变量Setbar,初值0.//
NumericSeries CountL(0); // 声明数值序列变量CountL,初值0,触发单周期变量。//
NumericSeries hh; // 声明数值序列变量hh,多头触发单价位。//
NumericSeries Lstopline; // 声明数值序列变量Lstopline,即止损线。//
bool con; // 声明布尔型变量con。//
BoolSeries con2; // 声明布尔型序列变量con2。//
Begin
If(!CallAuctionFilter()) Return; // 集合竞价和小节休息过滤.//
// 指标计算。//
Price = Close; // 关键价格,赋值收盘价,也可以换成中位价等。//
AvgVal = Average(Price,Length); // 计算均线 默认10周期。//
AvgRange = Average(TrueRange,Length); // 计算真实波动均值(atr) 默认10周期。//
KCU = AvgVal + AvgRange*Constt; // 计算通道上轨=均线+1.2倍的10周期真实波动值。//
KCL = AvgVal - AvgRange*Constt; // 计算通道下轨=均线-1.2倍的10周期真实波动值。//
ChanRng = (KCU - KCL)/2; // 通道宽度 / 2 。//
CountL = CountL + 1; // 每经过1根K线CountL+1,用于判断信号取消的变量,上穿上轨后,默认参数:开仓点仅挂单5根k线。//
con = CrossOver( Price,KCU); // bool变量con,当价格上穿上轨时为真 。//
If(con) //假如变量con为真。//
{
SetBar = High;//变量SetBar 赋值为当前最高价。//
CountL = 0; //变量CountL = 0.//
hh = SetBar + (ChanRng*ChanPcnt);//直接代入上面求得的数值了。//
}
// 系统入场。//
If(MarketPosition == 0)//当前没有持仓。//
{
If(Price[1] > KCU[1] and CountL <= buyN and High >= hh) // 当价格上穿上轨,并且在buyN根K线内>=变量CountL,且当前最高价大于等于变量hh时,买入开仓。//
{
Buy(0,max(Open,hh));//开仓买入。//
}
}
// 系统出场。//
con2 = CrossUnder(Close,AvgVal); // 布尔型变量con2,当价格下穿轨道中轨时为真。//
Lstopline = Lowest(Low[1],stopN); //止损线为求4周期内的最低价。//
If(MarketPosition == 1 and BarsSinceEntry > 0)//当前持有多单,且建仓数位大于0.//
{
If(con2[1])// 价格下穿轨道中轨时。//
{
Sell(0,Open); //平仓。//
}
If(Low <= Lstopline)// 当前价格小于4周期低点平仓 .//
{
Sell(0,Min(Open,Lstopline)); //平仓。//
}
}
End
做空代码及结果如下:
Params
Numeric length(10);
Numeric Constt(1.2);
Numeric ChanPcnt(0.5) ;
Numeric sellN(5);
Numeric stopN(4);
Vars
NumericSeries Price(0);
NumericSeries KCU(0);
NumericSeries KCL(0);
NumericSeries ChanRng(0);
NumericSeries AvgVal(0);
NumericSeries AvgRange(0);
NumericSeries Setbar(0);
NumericSeries CountS(0);
NumericSeries ll;
NumericSeries Sstopline;
bool con;
BoolSeries con2;
Begin
If(!CallAuctionFilter()) Return;
Price = Close;
AvgVal = Average(Price,Length);
AvgRange = Average(TrueRange,Length);
KCU = AvgVal + AvgRange*Constt;
KCL = AvgVal - AvgRange*Constt;
ChanRng = (KCU - KCL)/2;
CountS = CountS + 1;
con = CrossUnder(price,KCL);
If(con)
{
SetBar = Low;
countS = 0;
ll = SetBar - (ChanRng*Chanpcnt);
}
If(MarketPosition == 0)
{
If(Price[1] < KCL[1] and CountS <= sellN and Low <= ll)
{
SellShort(0,Min(Open,ll));
}
}
con2 = CrossOver(Close,AvgVal);
Sstopline = Highest(High[1],stopN);
If(MarketPosition == -1 and BarsSinceEntry > 0)
{
If(con2[1])
{
BuyToCover(0,Open);
}
If(High >= Sstopline)
{
BuyToCover(0,max(Sstopline,Open));
}
}
End