以下代码的逻辑是否正确 为什么后续同样的开仓平仓条件与之前的回测结果不一致 多数据源跨周期的指标计算应参考什么?哪里有学习资料
原文:
OnBar(ArrayRef<Integer> indexs)
{
Range[bigLayer1:bigLayer2]
{
ma1 = AverageFC(Close, Len1);
ma2 = AverageFC(Close, Len2);
PlotNumeric("ma1", ma1);
PlotNumeric("ma2", ma2);
Commentary("[ma1]" + Text(ma1));
Commentary("[ma2]" + Text(ma2));
if(CurrentBar >= MaxBarsBack) barsOk = True;
Commentary("====================");
Commentary("[CurrentBar]" + Text(CurrentBar));
Commentary("[MaxBarsBack] " + Text(MaxBarsBack));
// <--- 修正5: 修正 Commentary 函数的错误
Commentary("[barsOK]" + IIfString(barsOk, "K线根数OK", "K线不足"));
}
// 获取大周期数据源的均线值
ma1_b1 = Data[bigLayer1].ma1;
ma2_b1 = Data[bigLayer1].ma2;
ma1_b2 = Data[bigLayer2].ma1;
ma2_b2 = Data[bigLayer2].ma2;
PlotNumeric("ma1_b1", ma1_b1);
PlotNumeric("ma2_b1", ma2_b1);
PlotNumeric("ma1_b2", ma1_b2);
PlotNumeric("ma2_b2", ma2_b2);
Commentary("====================");
Commentary("[ma1_b1]" + Text(ma1_b1));
Commentary("[ma2_b1]" + Text(ma2_b1));
Commentary("[ma1_b2]" + Text(ma1_b2));
Commentary("[ma2_b2]" + Text(ma2_b2));
barsOk_b1 = Data[bigLayer1].barsOk;
barsOk_b2 = Data[bigLayer2].barsOk;
Commentary("====================");
扩展仿写代码:
OnBar(ArrayRef<Integer> indexs)
{
Range[bigLayer1:bigLayer2] //对从bigLayer1到bigLayer2的每个数据源执行内部语句。
{
ma1 = AverageFC(Close, Len1);
ma2 = AverageFC(Close, Len2);
PlotNumeric("ma1", ma1);
PlotNumeric("ma2", ma2);
//输出调试信息
Commentary("[ma1]" + Text(ma1));
Commentary("[ma2]" + Text(ma2));
// MACD
macd_diff = XAverage(Close, MacdFast) - XAverage(Close, MacdSlow);
macd_dea = XAverage(macd_diff, MacdSignal);
macd_bar = 2 * (macd_diff - macd_dea);
//PlotNumeric("MACD_DIFF_1min", macd_diff);
//PlotNumeric("MACD_DEA_1min", macd_dea);
//PlotAuto("MACD_BAR_1min", macd_bar, 0, IIf(macd_bar >= 0, Color9(), Color10()), Enum_Bar);
// 布林带
boll_mid = AverageFC(Close, BollingerLength);
boll_upper = boll_mid + BollingerWidth * StandardDev(Close, BollingerLength);
boll_lower = boll_mid - BollingerWidth * StandardDev(Close, BollingerLength);
PlotNumeric("BOLL_MID_1min", boll_mid);
PlotNumeric("BOLL_UP_1min", boll_upper);
PlotNumeric("BOLL_LOW_1min", boll_lower);
// ATR
if(CurrentBar == 0)
atr = (High - Low);
else
{
tr = Max(High - Low, Max(Abs(High - Close[1]), Abs(Low - Close[1])));
atr = (atr[1] * (AtrLength - 1) + tr) / AtrLength;
}
//PlotNumeric("ATR_1min", atr);
// CJL(成交量)
cjl = Vol;
PlotNumeric("CJL_1min", cjl);
//判断当前数据源的K线数量是否足够,并输出调试信息,以便开发者监控指标计算的有效性。
if(CurrentBar >= MaxBarsBack) barsOk = True;
Commentary("====================");
Commentary("[CurrentBar]" + Text(CurrentBar));
Commentary("[MaxBarsBack] " + Text(MaxBarsBack));
// <--- 修正5: 修正 Commentary 函数的错误
Commentary("[barsOK]" + IIfString(barsOk, "K线根数OK", "K线不足"));
}
// 获取大周期数据源的均线值
ma1_b1 = Data[bigLayer1].ma1;
ma2_b1 = Data[bigLayer1].ma2;
ma10_b1 = Data[bigLayer1].ma10;
PlotNumeric("ma1_b1", ma1_b1);
PlotNumeric("ma2_b1", ma2_b1);
PlotNumeric("ma1_b2", ma1_b2);
PlotNumeric("ma2_b2", ma2_b2);
Commentary("====================");
Commentary("[ma1_b1]" + Text(ma1_b1));
Commentary("[ma2_b1]" + Text(ma2_b1));
Commentary("[ma1_b2]" + Text(ma1_b2));
Commentary("[ma2_b2]" + Text(ma2_b2));
// 获取大周期数据源的指标值
// MACD
macd_diff_b1 = Data[bigLayer1].macd_diff;
macd_dea_b1 = Data[bigLayer1].macd_dea;
macd_bar_b1 = Data[bigLayer1].macd_bar;
//PlotNumeric("MACD_DIFF_30m", macd_diff_b1);
//PlotNumeric("MACD_DEA_30m", macd_dea_b1);
//PlotAuto("MACD_BAR_30m", macd_bar_b1, 0, IIf(macd_bar_b1 >= 0, Color9(), Color10()), Enum_Bar);
// 布林带
boll_mid_b1 = Data[bigLayer1].boll_mid;
boll_upper_b1 = Data[bigLayer1].boll_upper;
boll_lower_b1 = Data[bigLayer1].boll_lower;
PlotNumeric("BOLL_MID_30m", boll_mid_b1);
PlotNumeric("BOLL_UP_30m", boll_upper_b1);
PlotNumeric("BOLL_LOW_30m", boll_lower_b1);
// ATR
if(Data[i].CurrentBar == 0)
atr_b1 = (Data[i].High - Data[i].Low);
else
{
Numeric tr_b1 = Max(Data[i].High - Data[i].Low, Max(Abs(Data[i].High - Data[i].Close[1]), Abs(Data[i].Low - Data[i].Close[1])));
atr_b1 = (atr_b1[1] * (AtrLength - 1) + tr_b1) / AtrLength;
}
//PlotNumeric("ATR_30m", atr_b1);
// CJL
cjl_b1 = Data[i].Vol;
//PlotNumeric("CJL_30m", cjl_b1);
// K线数量校验
if(Data[i].CurrentBar >= MaxBarsBack) barsOk = True;
// ===== 5分钟周期 (i == bigLayer2) =====
// 均线
ma1_b2 = Data[bigLayer2].ma1;
ma2_b2 = Data[bigLayer2].ma2;
ma10_b2 = Data[bigLayer2].ma10;
PlotNumeric("MA5_5m", ma1_b2);
PlotNumeric("MA10_5m", ma10_b2);
PlotNumeric("MA20_5m", ma2_b2);
// MACD
macd_diff_b2 = Data[bigLayer2].macd_diff;
macd_dea_b2 = Data[bigLayer2].macd_dea;
macd_bar_b2 = Data[bigLayer2].macd_bar;
//PlotNumeric("MACD_DIFF_5m", macd_diff_b2);
//PlotNumeric("MACD_DEA_5m", macd_dea_b2);
//PlotAuto("MACD_BAR_5m", macd_bar_b2, 0, IIf(macd_bar_b2 >= 0, Color9(), Color10()), Enum_Bar);
// 布林带
boll_mid_b2 = Data[bigLayer2].boll_mid;
boll_upper_b2 = Data[bigLayer2].boll_upper;
boll_lower_b2 = Data[bigLayer2].boll_lower;
PlotNumeric("BOLL_MID_5m", boll_mid_b2);
PlotNumeric("BOLL_UP_5m", boll_upper_b2);
PlotNumeric("BOLL_LOW_5m", boll_lower_b2);
// ATR
if(Data[i].CurrentBar == 0)
atr_b2 = (Data[i].High - Data[i].Low);
else
{
Numeric tr_b2 = Max(Data[i].High - Data[i].Low, Max(Abs(Data[i].High - Data[i].Close[1]), Abs(Data[i].Low - Data[i].Close[1])));
atr_b2 = (atr_b2[1] * (AtrLength - 1) + tr_b2) / AtrLength;
}
//PlotNumeric("ATR_5m", atr_b2);
// CJL
cjl_b2 = Data[bigLayer2].Vol;
//PlotNumeric("CJL_5m", cjl_b2);
// K线数量校验
if(Data[i].CurrentBar >= MaxBarsBack) barsOk = True;