肯特纳通道增强版
2023-03-23 21:24

系统自带的肯特纳通道的增强版

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]));//空头平仓

}

}


评论区
顶部