肯特纳通道增强版
系统自带的肯特纳通道的增强版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]));//空头平仓 } }