以下代码为什么回测3年一次成交都没有 什么原因
还有虽然可以通过语法 但返回包含序列函数 可能存在逻辑错误 又是哪里的问题 是否影响正常运行
代码如何才能正常运行呢?
Params
Numeric Lots(1); // 交易手数
Numeric Len1(5); // 短均线周期数(MA5)
Numeric Len2(20); // 中均线周期数(MA20)
Numeric Len3(60); // 长均线周期数(MA60)
Numeric Len4(10); // MA10周期数(保留参数兼容)
String BigTimeFrame1("30m"); // 大周期1
String BigTimeFrame2("5m"); // 大周期2
Numeric MacdFastLen(12); // MACD快线周期
Numeric MacdSlowLen(26); // MACD慢线周期
Numeric MacdSignalLen(9); // MACD信号线周期
Vars
Global Integer bigLayer1;
Global Integer bigLayer2;
Integer lastBar_5min; // 记录上一次5分钟周期的CurrentBar值(用于开仓过滤,可选)
// 当前周期(1分钟)指标
Series<Numeric> ma1_1min;
Series<Numeric> ma10_1min;
Series<Numeric> ma20_1min;
Series<Numeric> ma60_1min;
Series<Numeric> stdDev_1min;
Series<Numeric> macdDif_1min;
Series<Numeric> macdDea_1min;
Series<Numeric> macdValue_1min;
// 大周期1(30分钟)指标
Series<Numeric> ma1_30min;
Series<Numeric> ma10_30min;
Series<Numeric> ma20_30min;
Series<Numeric> ma60_30min;
Series<Numeric> macdDif_30min;
Series<Numeric> macdDea_30min;
Series<Numeric> macdValue_30min;
// 大周期2(5分钟)指标
Series<Numeric> ma1_5min;
Series<Numeric> ma10_5min;
Series<Numeric> ma20_5min;
Series<Numeric> ma60_5min;
Series<Numeric> macdDif_5min;
Series<Numeric> macdDea_5min;
Series<Numeric> macdValue_5min;
// K线数量校验标志
Bool barsOk_1min;
Bool barsOk_30min;
Bool barsOk_5min;
Integer i;
Events
OnInit()
{
bigLayer1 = SubscribeBar(Data0.Symbol, BigTimeFrame1, 0, 0, Data0.DataFlag);
bigLayer2 = SubscribeBar(Data0.Symbol, BigTimeFrame2, 0, 0, Data0.DataFlag);
lastBar_5min = -1;
}
OnBar(ArrayRef<Integer> indexs)
{
// ==================== 1. 验证K线数量 ====================
barsOk_1min = (Data0.CurrentBar >= 60);
barsOk_30min = (Data[bigLayer1].CurrentBar >= 60);
barsOk_5min = (Data[bigLayer2].CurrentBar >= 60);
if (!barsOk_1min || !barsOk_30min || !barsOk_5min)
{
Commentary("K线数量不足60根,跳过");
return;
}
// ==================== 2. 计算1分钟指标 ====================
ma1_1min = AverageFC(Close, Len1);
ma10_1min = AverageFC(Close, Len4);
ma20_1min = AverageFC(Close, Len2);
ma60_1min = AverageFC(Close, Len3);
macdDif_1min = XAverage(Close, MacdFastLen) - XAverage(Close, MacdSlowLen);
macdDea_1min = XAverage(macdDif_1min, MacdSignalLen);
macdValue_1min = macdDif_1min - macdDea_1min;
PlotNumeric("MA5_1min", ma1_1min);
PlotNumeric("MA10_1min", ma10_1min);
PlotNumeric("MA20_1min", ma20_1min);
PlotNumeric("MA60_1min", ma60_1min);
PlotNumeric("MACD_DIF_1min", macdDif_1min);
PlotNumeric("MACD_DEA_1min", macdDea_1min);
PlotNumeric("MACD_VAL_1min", macdValue_1min);
// ==================== 3. 计算大周期指标 ====================
for i = bigLayer1 To bigLayer2
{
if(i == bigLayer1)
{
ma1_30min = AverageFC(Data[i].Close, Len1);
ma10_30min = AverageFC(Data[i].Close, Len4);
ma20_30min = AverageFC(Data[i].Close, Len2);
ma60_30min = AverageFC(Data[i].Close, Len3);
macdDif_30min = XAverage(Data[i].Close, MacdFastLen) - XAverage(Data[i].Close, MacdSlowLen);
macdDea_30min = XAverage(macdDif_30min, MacdSignalLen);
macdValue_30min = macdDif_30min - macdDea_30min;
PlotNumeric("MA5_30m", ma1_30min);
PlotNumeric("MA10_30m", ma10_30min);
PlotNumeric("MA20_30m", ma20_30min);
PlotNumeric("MA60_30m", ma60_30min);
PlotNumeric("MACD_DIF_30m", macdDif_30min);
PlotNumeric("MACD_DEA_30m", macdDea_30min);
PlotNumeric("MACD_VAL_30m", macdValue_30min);
}
else if(i == bigLayer2)
{
ma1_5min = AverageFC(Data[i].Close, Len1);
ma10_5min = AverageFC(Data[i].Close, Len4);
ma20_5min = AverageFC(Data[i].Close, Len2);
ma60_5min = AverageFC(Data[i].Close, Len3);
macdDif_5min = XAverage(Data[i].Close, MacdFastLen) - XAverage(Data[i].Close, MacdSlowLen);
macdDea_5min = XAverage(macdDif_5min, MacdSignalLen);
macdValue_5min = macdDif_5min - macdDea_5min;
PlotNumeric("MA5_5m", ma1_5min);
PlotNumeric("MA10_5m", ma10_5min);
PlotNumeric("MA20_5m", ma20_5min);
PlotNumeric("MA60_5m", ma60_5min);
PlotNumeric("MACD_DIF_5m", macdDif_5min);
PlotNumeric("MACD_DEA_5m", macdDea_5min);
PlotNumeric("MACD_VAL_5m", macdValue_5min);
}
}
// ==================== 4. 平仓逻辑(基于1分钟MACD交叉) ====================
// 多单平仓:1分钟MACD死叉
if(MarketPosition == 1 And CrossUnder(macdDif_1min, macdDea_1min))
{
Sell(0, Open);
}
// 空单平仓:1分钟MACD金叉
if(MarketPosition == -1 And CrossOver(macdDif_1min, macdDea_1min))
{
BuyToCover(0, Open);
}
// ==================== 5. 开仓逻辑(多周期MACD状态过滤) ====================
// 判断大周期MACD状态(金叉:DIF > DEA;死叉:DIF < DEA)
Bool bullCondition30 = (macdDif_30min > macdDea_30min);
Bool bearCondition30 = (macdDif_30min < macdDea_30min);
Bool bullCondition5 = (macdDif_5min > macdDea_5min);
Bool bearCondition5 = (macdDif_5min < macdDea_5min);
// 多单开仓:30分钟金叉状态 && 5分钟金叉状态 && 1分钟金叉//去掉大周期条件后仍无一信号触发 应该是前方代码阻塞了信号生成
if(MarketPosition != 1
And bullCondition30 And bullCondition5
And CrossOver(macdDif_1min, macdDea_1min))
{
Buy(Lots, Open);
}
// 空单开仓:30分钟死叉状态 && 5分钟死叉状态 && 1分钟死叉
if(MarketPosition != -1
And bearCondition30 And bearCondition5
And CrossUnder(macdDif_1min, macdDea_1min))
{
SellShort(Lots, Open);
}
}

这里发现了一个序列类型的使用错误。
crossover和crossunder是序列对象,不可以放在and和or后面。
具体看一下零基础课程里的说明
可以把序列对象放在用and或者or连接的bool表达式的第一项
但是这个不一定是你三年不出信号的原因
你先改了看看吧
哪个ai写的
deep seek 要矫正AI逻辑吗?😂
原则上我们不处理ai写得东西