Params
Numeric OIThreshold(5); // 持仓量变化率阈值(百分比),当持仓量变化超过±5%时触发条件
Numeric MaxDailyLoss(2); // 单日最大亏损比例(百分比),触发后当日停止交易
NumerIC ATRMultiplier(2); // ATR止损倍数(如2倍ATR作为止损空间)
//MACD的
Numeric FastLength(12); //快线周期
Numeric SlowLength(26); //慢线周期
Numeric MACDLength(9); //信号线周期
//ATR的
Numeric Length(14); //周期
//成交量的
Numeric VolPeriod(5); // 成交量均线周期,用于判断成交量突破
Vars
//MACD的
Series<Numeric> MACDDiff;
Series<Numeric> AvgMACD;
Series<Numeric> MACDValue;
Plot plt_macd;
Plot plt_ATR;
Events
//MACD的
OnInit()
{
plt_macd.figure(0);//plt_macd和k线同一个画板,独立图表显示
plt_ATR.figure(0);//plt_vol和k线同一个画板,独立图表显示
}
//ATR的
OnReady()
{
SetBackBarMaxCount(1+VolPeriod);
Range[0:DataSourceSize() - 1]
//ATR的
{
plt_ATR.setOption ("ATR", "begin-bar", Length);
}
//MACD的
{
plt_macd.setOption("MACDDiff", "begin-bar", SlowLength);
plt_macd.setOption("MACDDEA", "begin-bar", SlowLength + MACDLength);
plt_macd.setOption("MACD", "begin-bar", SlowLength + MACDLength);
}
//成交量的
{
setPlotOption("5日成交量均线", "begin-bar", VolPeriod);
}
}
OnBar(ArrayRef<Integer> indexs)
{
//ATR的
Range[0:DataSourceSize() - 1]
{
plt_ATR.line("ATR",AvgTrueRange(Length));
}
//MACD的
{
MACDDiff = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDDiff,MACDLength);
MACDValue = 2 * (MACDDiff - AvgMACD);
plt_macd.line("MACDDiff",MACDDiff); //画线
plt_macd.line("MACDDEA",AvgMACD); //画线
If (MACDValue >= 0)
{
plt_macd.setOption("MACD","color",Red); //设置颜色属性
plt_macd.barv("MACD",MACDValue); //画柱状图
}
Else
{
plt_macd.setOption("MACD","color",Green);//设置颜色属性
plt_macd.barv("MACD",MACDValue); //画柱状图
}
plt_macd.barv("零线",0);
}
//成交量的
{
PlotAuto("成交量",Vol,0,Color10(),Enum_Bar,Enum_Fill);
PlotNumeric("5日成交量均线", AverageFC(Vol, VolPeriod));
}
}
还请帮忙看看,复制的内建策略代码到自己的策略,计算结果不同的原因。
你的 SetBackBarMaxCount(1+VolPeriod) 回溯设置太短了
VolPeriod 只有5
ATR至少需要14个回溯
其实我并不太清楚这个函数是怎么 运行的,只是回溯值肯定要满足代码里面的最大回溯。
老师如果看到,帮忙顺便指点一下我
谢谢大哥指点,我后来也是发现了,所以干脆把这行回溯给删了,我不理解的一点是,删了以后好像没有什么影响,好奇这行指标的意义是什么,当然你们肯定 也发现了我是一个小白,这些指标都是从系统内建的多个指标缝合在一起的,所以第一事件没发现是因为其他指标的内容影响到了。
直觉不错,就是这个的问题。
SetBackBarMaxCount
设置所有可回溯类型的最大回溯值
拿atr举例子,atr(14)指的是从现在开始,往前数14根k线,把这14根k线的truerange(tr)做算数平均,得到atr(14)值。这里的往前数14根bar,就是回溯。所以atr(14)最少,也需要回溯14根bar数据。
而你代码里 SetBackBarMaxCount(1+VolPeriod) ,volperiod默认是5,加一变成6,所以atr计算的时候只能回溯取到6根k线,这还怎么能计算正确呢?
不太清楚你加这一行代码的目的是什么,如果没有目的,删掉也无妨。