系统自带的肯特纳通道的增强版
1.增加了自适应均线平仓模式
2.增加了三种类型的头寸管理模式
下面为完整的代码,参数和变量名为汉语拼音
/*--------------------------------------------------------------------------------
策略说明:
基于肯特纳(有人译为凯特纳)通道的突破系统
交易思想
股份向上突破牛熊线并超一个ATR(上轨)开仓,开仓后如果反向运行,跌一个ATR(中轨)止损,如果正向运行,因股份在牛熊线之上,故牛熊线必逐渐抬升,此时应持仓不变,等股份回调牛熊线并跌破牛熊线时平仓止盈。反之亦然
优点:
1、止损为一个ATR,也可以设计成1.5倍ATR,因ATR反应是的股价的波动幅度,因此止损量也随着股价的波幅而变化
系统要素:
1、基于最高价、最低价、收盘价三者平均值计算而来的较长周期的三价均线(牛熊线)
2、在牛熊线基础上加减一个ATR形成肯特纳通道。
入场条件:
1、三价均线向上,并且价格上破通道上轨,开多单
2、三价均线向下,并且价格下破通道下轨,开空单
出场条件:
1、持有多单时,价格下破三价均线,平多单
2、持有空单时,价格上破三价均线,平空单
-------------------------------------------------------------------------------- */
Params
Numeric avgLength(40,20,70,2); // 三价均线参数
Numeric atrLength(10,5,20,1); // ART周期参数
Numeric NiuXongSHiCanSHu(2,2,20,1);//牛熊判断参数
Numeric SHiYongGuoLu(1,1,2,1);//牛熊过滤开仓:1-使用,2-不使用
Numeric PinCanMoSHi(1,1,2,1);//平仓模式:1-自适应均线平仓,2-牛熊线平仓
Numeric TouCongGuanLi(1,1,3,1);//头寸管理模式:1-固定仓位,2-账户总风险比例,3-按盈利增量开仓
Numeric GuDinCanWei(1);//固定仓位
Numeric GuDinFenXianBiLi(1);//账户总风险比例
Numeric MeiSHouZuiDrFenXianMoSHi(1,1,2,1);//每手最大风险模式:1-每手固定风险,2-按ATR计算风险
Numeric MeiSHouGuDinFenXianSHuLian(1000);//每手固定风险数量,也就是每手止损金额
Numeric ATRFenXianBeiSHu(1,1,2,0.2);//ATR风险倍数
Numeric QuanYiZenIian(50000);//每手盈利增量,也就是每盈利一定的量,增加一手
Vars
Series<Numeric> movAvgVal(0); // 三价均线
Series<Numeric> upBand(0); // 通道上轨
Series<Numeric> dnBand(0); // 通道下轨
Bool NiuSHi;// True为牛,False为熊
Series<Numeric> ZiSHiYenJongXianCanSHu;//自适应均线参数
Series<Numeric> ZiSHiYenJongXian;//自适应均线
Numeric DanQianQuanYi;//账户当前权益
Series<Numeric> ATR;//平均真实波幅
Numeric KaiCanSHouSHu;//开仓手数
Global Numeric CHuSHiQuanYi;//初始权益
Events
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard()); //设置为后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //开平仓价格映射到不复权或除权后的价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //根据除权或复权点移仓换月
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算,把移仓换月的俩笔交易算做一笔,以便胜率等指标真实的反映策略的的盈利能力
}
OnBar(ArrayRef<Integer> indexs)
{
DanQianQuanYi = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); // 账户当前权益
If(CurrentBar == 0) CHuSHiQuanYi = DanQianQuanYi;//账户第一根K线的上的权益,也即账户初始权益
Commentary(\"账户当前权益=\"+Text(DanQianQuanYi));
Commentary(\"账户初始权益=\"+ Text(CHuSHiQuanYi));
movAvgVal = Average((High + Low + Close)/3,avgLength);// 三价均线
upBand = movAvgVal + AvgTrueRange(atrLength);// 通道上轨
dnBand = movAvgVal - AvgTrueRange(atrLength);// 通道下轨
NiuSHi = movAvgVal[1] >= movAvgVal[NiuXongSHiCanSHu];//过滤条件:为真是牛市,为假是熊市
PlotNumeric(\"前一日三价均值加一个ATR\",upBand[1]);
PlotNumeric(\"前一日三价均值减一个ATR\",dnBand[1]);
//求自适应参数(初值为三价均线参数,开仓后每退一个K线减1,最小为10)
If(MarketPosition == 0) ZiSHiYenJongXianCanSHu = avgLength;
Else ZiSHiYenJongXianCanSHu = ZiSHiYenJongXianCanSHu-1;
ZiSHiYenJongXianCanSHu = IIF(ZiSHiYenJongXianCanSHu<10,10,ZiSHiYenJongXianCanSHu);
//PlotAuto(\"自适应均线参数\",Text(ZiSHiYenJongXianCanSHu));
ZiSHiYenJongXian= Average((High + Low + Close)/3,ZiSHiYenJongXianCanSHu);
//如果平仓模型为自适应,输出自适应均线,如果平仓模型为牛熊线,则输出牛熊线
If(PinCanMoSHi == 1) PlotAuto(\"前一日自适应均线\",ZiSHiYenJongXian[1],0,Rgb(250,0,0),Enum_Cross);
Else If(PinCanMoSHi == 2) PlotNumeric(\"前一日的三价长期均值\",movAvgVal[1]);
If(SHiYongGuoLu == 1)//使用牛熊过滤开仓
{
PlotAuto(\"判断牛熊 \",NiuSHi); //输出牛熊市
If(MarketPosition == 0 And NiuSHi And High >= upBand[1]) //牛市开多
{
If(TouCongGuanLi == 1) KaiCanSHouSHu = GuDinCanWei;//头寸管理选择1,使用固定仓位开仓
If(TouCongGuanLi == 2) //头寸管理选择2,使用固定风险比例仓位
{
If(MeiSHouZuiDrFenXianMoSHi == 1) //每手最大风险模式:按每手固定风险计算手数
{
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
//Commentary(\"每手最大风险金额=\"+ Text(MeiSHouGuDinFenXianSHuLian));
Commentary(\"取整前开仓手数=\"+ Text((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian);
}
If(MeiSHouZuiDrFenXianMoSHi == 2) //每手最大风险模式:按ATR风险计算手数
{
ATR = AvgTrueRange(5);
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
Commentary(\"ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()=\" + Text(ATR[1])+\"*\"+ Text(ATRFenXianBeiSHu)+\"*\"+ Text(ContractUnit()*BigPointValue()));
Commentary(\"取整前开仓手数=\"+Text((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue())));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()));
Commentary(\"取整后开仓手数=\"+Text(KaiCanSHouSHu)); //对开仓手数取整
}
}
If(TouCongGuanLi == 3)//头寸管理选择3,按盈利增量开仓
{
If(DanQianQuanYi - CHuSHiQuanYi <= 0) KaiCanSHouSHu =1;
Else KaiCanSHouSHu =IntPart((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian);
Commentary(\"增量=\"+ Text(DanQianQuanYi- CHuSHiQuanYi));
Commentary(\"取整前手数=\"+ Text((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian));
}
Buy(KaiCanSHouSHu,Max(Open,upBand[1]));
}
If(MarketPosition == 0 And !NiuSHi And Low <= dnBand[1])//熊市开空
{
If(TouCongGuanLi == 1) KaiCanSHouSHu = GuDinCanWei;//头寸管理选择1,使用固定仓位开仓
If(TouCongGuanLi == 2) //头寸管理选择2,使用固定风险比例开仓
{
If(MeiSHouZuiDrFenXianMoSHi == 1) //每手最大风险模式:按每手固定风险计算手数
{
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
//Commentary(\"每手最大风险金额=\"+ Text(MeiSHouGuDinFenXianSHuLian));
Commentary(\"取整前开仓手数=\"+ Text((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian);
}
If(MeiSHouZuiDrFenXianMoSHi == 2) // 每手最大风险模式:按ATR风险计算手数
{
ATR = AvgTrueRange(5);
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
Commentary(\"ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()=\" + Text(ATR[1])+\"*\"+ Text(ATRFenXianBeiSHu)+\"*\"+ Text(ContractUnit()*BigPointValue()));
Commentary(\"取整前开仓手数=\"+Text((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue())));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()));
Commentary(\"取整后开仓手数=\"+Text(KaiCanSHouSHu)); //对开仓手数取整
}
}
If(TouCongGuanLi == 3)//头寸管理选择3,按盈利增量开仓
{
If(DanQianQuanYi - CHuSHiQuanYi <= 0) KaiCanSHouSHu =1;
Else KaiCanSHouSHu =IntPart((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian);
Commentary(\"增量=\"+ Text(DanQianQuanYi- CHuSHiQuanYi));
Commentary(\"取整前手数=\"+ Text((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian));
}
SellShort(KaiCanSHouSHu,Min(Open,dnBand[1]));
}
}
If(SHiYongGuoLu == 2)//不使用牛熊过滤开仓
{
If(MarketPosition == 0 And High >= upBand[1])//多头开仓
{
If(TouCongGuanLi == 1) KaiCanSHouSHu = GuDinCanWei;//头寸管理选择1,使用固仓位
If(TouCongGuanLi == 2) //头寸管理选择2,使用固定风险比例仓位
{
If(MeiSHouZuiDrFenXianMoSHi == 1) //每手最大风险模式:按每手固定风险计算手数
{
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
//Commentary(\"每手最大风险金额=\"+ Text(MeiSHouGuDinFenXianSHuLian));
Commentary(\"取整前开仓手数=\"+ Text((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian);
}
If(MeiSHouZuiDrFenXianMoSHi == 2) // 每手最大风险模式:按ATR风险计算手数
{
ATR = AvgTrueRange(5);
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
Commentary(\"ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()=\" + Text(ATR[1])+\"*\"+ Text(ATRFenXianBeiSHu)+\"*\"+ Text(ContractUnit()*BigPointValue()));
Commentary(\"取整前开仓手数=\"+Text((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue())));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()));
Commentary(\"取整后开仓手数=\"+Text(KaiCanSHouSHu)); //对开仓手数取整
}
}
If(TouCongGuanLi == 3)//头寸管理选择3,按盈利增量开仓
{
If(DanQianQuanYi - CHuSHiQuanYi <= 0) KaiCanSHouSHu =1;
Else KaiCanSHouSHu =IntPart((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian);
Commentary(\"增量=\"+ Text(DanQianQuanYi- CHuSHiQuanYi));
Commentary(\"取整前手数=\"+ Text((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian));
}
Buy(KaiCanSHouSHu,Max(Open,upBand[1]));
}
If(MarketPosition == 0 And Low <= dnBand[1]) //空头开仓
{
If(TouCongGuanLi == 1) KaiCanSHouSHu = GuDinCanWei;//头寸管理选择1,使用固定仓位开仓
If(TouCongGuanLi == 2) //头寸管理选择2,使用固定风险比例开仓
{
If(MeiSHouZuiDrFenXianMoSHi == 1) //每手最大风险模式:按每手固定风险计算手数
{
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
//Commentary(\"每手最大风险金额=\"+ Text(MeiSHouGuDinFenXianSHuLian));
Commentary(\"取整前开仓手数=\"+ Text((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) / MeiSHouGuDinFenXianSHuLian);
}
If(MeiSHouZuiDrFenXianMoSHi == 2) // 每手最大风险模式:按ATR风险计算手数
{
ATR = AvgTrueRange(5);
Commentary(\"账户总风险金额=\"+ Text(DanQianQuanYi * GuDinFenXianBiLi/100));
Commentary(\"ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()=\" + Text(ATR[1])+\"*\"+ Text(ATRFenXianBeiSHu)+\"*\"+ Text(ContractUnit()*BigPointValue()));
Commentary(\"取整前开仓手数=\"+Text((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue())));
KaiCanSHouSHu = IntPart((DanQianQuanYi * GuDinFenXianBiLi/100) /(ATR[1] * ATRFenXianBeiSHu * ContractUnit()*BigPointValue()));
Commentary(\"取整后开仓手数=\"+Text(KaiCanSHouSHu)); //对开仓手数取整
}
}
If(TouCongGuanLi == 3)//头寸管理选择3,按盈利增量开仓
{
If(DanQianQuanYi - CHuSHiQuanYi <= 0) KaiCanSHouSHu =1;
Else KaiCanSHouSHu =IntPart((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian);
Commentary(\"增量=\"+ Text(DanQianQuanYi- CHuSHiQuanYi));
Commentary(\"取整前手数=\"+ Text((DanQianQuanYi- CHuSHiQuanYi)/QuanYiZenIian));
}
SellShort(KaiCanSHouSHu,Min(Open,dnBand[1]));
}
}
If(PinCanMoSHi == 2)//平仓模式:牛熊线平仓
{
If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= movAvgVal[1]) Sell(0,Min(Open,movAvgVal[1])); //多头平仓
If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= movAvgVal[1]) BuyToCover(0,Max(Open,movAvgVal[1]));//空头平仓
}
If(PinCanMoSHi == 1)//平仓模式:自适应均线平仓
{
If(MarketPosition == 1 And BarsSinceEntry >= 1 And ZiSHiYenJongXian[1] <= upBand[1] And Low <= ZiSHiYenJongXian[1]) Sell(0,Min(Open,ZiSHiYenJongXian[1]));//多头平仓
If(MarketPosition == -1 And BarsSinceEntry >= 1 And ZiSHiYenJongXian[1] >= dnBand[1] And High >= ZiSHiYenJongXian[1]) BuyToCover(0,Max(Open,ZiSHiYenJongXian[1]));//空头平仓
}
}