满足开仓条件但打印显示不满足导致没有交易信号

老师:   晚上好,听了最近您一个答疑的视频,然后有点思路用AI做了下面代码,但有个问题:就是满足MA_Bull是真的 但是实际跑过程中显示是不满足,导致没有交易信号 麻烦老师看一下 Params Numeric MA_Period(21); // 均线周期 Numeric ATR_Period(14); // ATR周期 Numeric StopLossPct(1.5); // 止损百分比 Numeric TrailMultiplier(2.0); // ATR移动止盈倍数 Numeric ATR_Filter(1.5); // ATR过滤阈值 Numeric lots(1); // 开仓手数Vars // 多周期图层编号(全局变量) Global Numeric i1; // 日线图层 Global Numeric i2; // 1小时图层 Global Numeric i3; // 15分钟图层(主显示图层) // 多周期均线(通过Range绑定图层) Series<Numeric> MA_Daily; // 日线均线(i1图层) Series<Numeric> MA_H1; // 1小时均线(i2图层) Series<Numeric> MA_M15; // 15分钟均线(i3图层) Series<Numeric> ATR_Val; // ATR(i3图层) // 其他变量 Numeric TrailStop; Series<Numeric> HighSinceEntry; Series<bool> MA_Bull; Series<Numeric> myStopPrice; Series<Numeric> myentryprice; Series<Numeric> myexitprice; Numeric profit; Numeric pricediff; Series<bool> cond1(False); Series<bool> cond2(False); Series<bool> cond3(False); Events OnInit() { // 订阅三周期数据 i1 = SubscribeBar(symbol, "D", BeginDateTime); i2 = SubscribeBar(symbol, "1h", BeginDateTime); i3 = SubscribeBar(symbol, "15m", BeginDateTime); // 检查图层订阅是否成功 If(i1 == InvalidNumeric || i2 == InvalidNumeric || i3 == InvalidNumeric) { Print("图层订阅失败!周期设置错误"); } } OnBar(ArrayRef<Integer> indexs) { // 数据加载检查(保留你的原始设置) If(Data[i1].CurrentBar < MA_Period || Data[i2].CurrentBar < 8*MA_Period || Data[i3].CurrentBar < 32*MA_Period) { Data[i3].Commentary("数据加载中:日线Bar=" + Text(Data[i1].CurrentBar) + ", 1小时Bar=" + Text(Data[i2].CurrentBar) + ", 15分钟Bar=" + Text(Data[i3].CurrentBar)); return; } // Range隔离图层计算(核心:确保指标绑定对应图层) Range[i1:i1] { MA_Daily = AverageFC(Close, MA_Period); // 日线图层计算 } Range[i2:i2] { MA_H1 = AverageFC(Close, MA_Period); // 1小时图层计算 } Range[i3:i3] { MA_M15 = AverageFC(Close, MA_Period); ATR_Val = AvgTrueRange(ATR_Period); // 15分钟图层计算 } // 1. 绘图:日线/1小时MA显式绑定对应图层 Data[i1].PlotNumeric("MA_Daily-日线MA值:", Data[i1].MA_Daily[1]); // 绑定i1图层 Data[i1].Commentary("MA_Daily[1]: " + Text(Data[i1].MA_Daily[1])); Data[i2].PlotNumeric("MA_H1-1小时MA值:", Data[i2].MA_H1[1]); // 绑定i2图层 Data[i2].Commentary("MA_H1[1]: " + Text(Data[i2].MA_H1[1])); Data[i3].PlotNumeric("MA_Daily-日线MA值:", Data[i1].MA_Daily[1]); // 绑定i1图层 Data[i3].PlotNumeric("MA_H1-1小时MA值:", Data[i2].MA_H1[1]); // 绑定i2图层 Data[i3].PlotNumeric("MA_M15-15分钟MA值", MA_M15[1]); // 2. 打印:日线/1小时MA显式绑定对应图层 Data[i3].Commentary("ATR值[1]: " + Text(ATR_Val[1])); // 3. 布尔信号:日线/1小时MA显式绑定对应图层 MA_Bull = (Data[i1].MA_Daily[1] > Data[i1].MA_Daily[2]) && // i1图层前值比较 (Data[i2].MA_H1[1] > Data[i2].MA_H1[2]) && // i2图层前值比较 (MA_M15[1] > MA_M15[2]); // 15分钟无需额外绑定 // 计算MA_Bull的三个条件,并单独存储 cond1 = (Data[i1].MA_Daily[1] > Data[i1].MA_Daily[2]); // 日线MA:前一根 > 前两根 cond2 = (Data[i2].MA_H1[1] > Data[i2].MA_H1[2]); // 1小时MA:前一根 > 前两根 cond3 = (MA_M15[1] > MA_M15[2]); // 15分钟MA:前一根 > 前两根 MA_Bull = cond1 && cond2 && cond3; // 打印MA_Bull的判断过程(使用IfString函数处理布尔值的文字描述) Data[i3].Commentary("MA_Bull判断过程:"); // 条件1:用IIFString函数,true返回"满足",false返回"不满足" Data[i3].Commentary("条件1(日线MA[1] > MA[2]): " + IIFString(cond1, "满足", "不满足") + " 【值:" + Text(Data[i1].MA_Daily[1]) + " > " + Text(Data[i1].MA_Daily[2]) + "】"); // 条件2:同理处理1小时周期条件 Data[i3].Commentary("条件2(1小时MA[1] > MA[2]): " + IIFString(cond2, "满足", "不满足") + " 【值:" + Text(Data[i2].MA_H1[1]) + " > " + Text(Data[i2].MA_H1[2]) + "】"); // 条件3:同理处理15分钟周期条件 Data[i3].Commentary("条件3(15分钟MA[1] > MA[2]): " + IIFString(cond3, "满足", "不满足") + " 【值:" + Text(MA_M15[1]) + " > " + Text(MA_M15[2]) + "】"); // 最终结果:用IfString函数描述MA_Bull的真假 Data[i3].Commentary("最终MA_Bull: " + IIFString(MA_Bull, "真(所有条件满足)", "假(至少一个条件不满足)")); /* If(MA_Bull) Data[i3].Commentary("MA_Bull为真"); Else Data[i3].Commentary("MA_Bull为假");*/ // 开仓逻辑(保持不变) If(Data[i3].MarketPosition != 1 And MA_Bull And ATR_Val[1] > ATR_Filter) { Data[i3].Buy(lots, Data[i3].Open); myentryprice = Data[i3].Open; myStopPrice = myentryprice * (1 - StopLossPct * 0.01); HighSinceEntry = Data[i3].High; Data[i3].Commentary("开仓:myentryprice=" + Text(myentryprice)); } // 平仓逻辑(保持不变) If(Data[i3].MarketPosition == 1 And Data[i3].BarsSinceEntry >= 1) { If(Data[i3].High > HighSinceEntry) HighSinceEntry = Data[i3].High; TrailStop = Max(myStopPrice, HighSinceEntry - TrailMultiplier * ATR_Val); If(Data[i3].Low <= TrailStop) { myexitprice = Min(Data[i3].Open, TrailStop); pricediff = myexitprice - myentryprice; profit = pricediff * abs(Data[i3].CurrentContracts()) * ContractUnit() * BigPointValue(); Data[i3].Sell(lots, myexitprice); Data[i3].Commentary("平仓:profit=" + Text(profit)); } } }

看得比较混乱,建议每个变量前加上对应图层