Params
Numeric N(20);
Numeric X(10);
Numeric TRS(45);
Numeric Fund(20000);
Vars
Series<Numeric> HH;
Series<Numeric> LL;
Series<Numeric> upband;
Series<Numeric> dnband;
Series<Numeric> H0Slope;
Series<Numeric> H1Slope;
Series<Numeric> L0Slope;
Series<Numeric> L1Slope;
Series<Numeric> Hdelta;
Series<Numeric> Ldelta;
Series<Bool> beta;
Series<Numeric> HL;
Series<Bool> buycond;
Series<Bool> sellcond;
Series<Numeric> KG(0);
Series<Numeric> HighAfterEntry;//开仓后出现的最高价
Series<Numeric> LowAfterEntry;//开仓后出现的最低价
Series<Numeric> liQKA;
Series<Numeric> DliqPoint;
Series<Numeric> KliqPoint;
Series<Numeric> barcoutN;
Series<Numeric> Lots;
Series<Numeric> Ma1;
Series<Numeric> callkg;
Events
//此处实现事件函数
OnInit()
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
onBar(ArrayRef<Integer> indexs)
{
Lots=Max(1,IntPart(Fund/(O*ContractUnit*BigPointValue*0.1))); //计算开仓手数
//计算斜率
HL=(H+L)/2;
H0Slope=LinearRegSlope(HL,N);
H1Slope=LinearRegSlope(HL[1],N);
buycond=crossover(H0Slope,H1Slope);
Sellcond= CrossUnder(H0Slope,H1Slope);
HH=Highest(H,X);
LL=Lowest(L,X);
//保存斜率交叉时的高低点
if(buycond[1])
{
upband=HH;
KG=1;
}
if(Sellcond[1])
{
dnband=LL;
KG=-1;
}
PlotNumeric("unband",upband);
PlotNumeric("dnband",dnband);
if (KG[1]==1 and H>=upband[1] and MarketPosition==0)
{
Buy(Lots,Max(open,upband[1]));
LowAfterEntry=Max(open,upband[1]);
callkg=1;
}
if(KG[1]==-1 and L<=dnband[1] and MarketPosition==0)
{
SellShort(Lots,Min(open,dnband[1]));
HighAfterEntry=Min(open,dnband[1]);
callkg=-1;
}
//加仓模块
Ma1=Average(C,5);
PlotNumeric("Ma1",Ma1);
if (callkg==1 and MarketPosition>0 and C[1]>EntryPrice and C[1]<Ma1[2] and C[1]>Ma1[1])
{
Buy(Lots/2,open);
callkg=0;
}
if(callkg==-1 and MarketPosition<0 and C[1]<EntryPrice and C[1]>Ma1[2] and C[1]<Ma1[1])
{
SellShort(Lots/2,open);
callkg=0;
}
//记录开仓后高低点
If(BarsSinceentry == 0)
{
HighAfterEntry = High;
LowAfterEntry = Low;
}else
{
HighAfterEntry = Min(HighAfterEntry,High); // 空头止损,更新最低的最高价
LowAfterEntry = Max(LowAfterEntry,Low); // 多头止损,更新最高的最低价
}
//移动出场
If(MarketPosition == 0) // 自适应参数默认值;
{
liQKA = 1;
barcoutN=0;
}Else if(BarsSinceEntry>barcoutN) //当有持仓的情况下,liQKA会随着持仓时间的增加而逐渐减小,即止损止盈幅度乘数的减少。
{
liQKA = liQKA - 0.1;
liQKA = Max(liQKA,0.3);
barcoutN=BarsSinceEntry;
}
if(MarketPosition>0)
{
DliqPoint = LowAfterEntry - (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
}
if(MarketPosition<0)
{
KliqPoint = HighAfterEntry + (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
}
//If(KliqPoint[1]>0 and MarketPosition<0)PlotNumeric("KliqPoint[1]",KliqPoint[1]);
//if(DliqPoint[1]>0 and MarketPosition>0)PlotNumeric("DliqPoint[1]",DliqPoint[1]);
// 持有多单时
If(MarketPosition >0 And BarsSinceEntry >0 And Low <= DliqPoint[1] and DliqPoint[1]>0 and DliqPoint[1]>0 and BarsSinceEntry>0)
{
Sell(0,Min(Open,DliqPoint[1]));
DliqPoint=0;
barcoutN=0;
}
// 持有空单时
If(MarketPosition <0 And BarsSinceEntry >0 And High >= KliqPoint[1] and KliqPoint[1]>0 and KliqPoint[1]>0 and BarsSinceEntry>0)
{
BuyToCover(0,Max(Open,KliqPoint[1]));
KliqPoint=0;
barcoutN=0;
}
}
投稿等直播讲解吧 写成文章会很麻烦
哪里看不懂 请指出
整段逻辑都不懂,,
可以说下开仓平仓加仓啥的逻辑吗
老师 你把这个策略的逻辑详细和我说下吗 谢谢