请教代码问题

想请教一下,使用了跨周期用法。但是在H1(小时K)那段代码中,H1_MA1等于后面赋值公式,现在输出的时候使用公式的时候能够计算数值,但是当用H1_MA1的时候,值是0. 不知道什么原因。下面代码可以测试通过。Params // --- PUBU 基础参数 --- Vars Numeric Lots(1); // 交易手数 // 1. 日线级别变量 (Data[0]) - 6根PUBU均线 Series<Numeric> D1_MA1; // 最短周期 Series<Numeric> D1_MA2; Series<Numeric> D1_MA3; Series<Numeric> D1_MA4; Series<Numeric> D1_MA5; Series<Numeric> D1_MA6; // 最长周期 Series<Numeric> D1_TrendScore; // 趋势得分:用于判断排列顺序 // 2. H1级别变量 (Data[1]) - 6根PUBU均线 Series<Numeric> H1_MA1; Series<Numeric> H1_MA2; Series<Numeric> H1_MA3; Series<Numeric> H1_MA4; Series<Numeric> H1_MA5; Series<Numeric> H1_MA6; Series<Numeric> H1_TrendScore;Events // ----------------------------------------------------------------------- // 初始化事件:订阅跨周期数据 // ----------------------------------------------------------------------- OnInit() { // 假设主图是日线 (D1) SubscribeBar(Data[0].Symbol(),"1H",20200101); // 订阅 1小时 K线 SubscribeBar(Data[0].Symbol(),"10M",20000101); // 订阅 10分钟 K线 } // ----------------------------------------------------------------------- // Bar更新事件:核心逻辑处理 // ----------------------------------------------------------------------- OnBar(ArrayRef<Integer> indexs) { // ========================================== // 第一层:日线 D1 逻辑 - 6线 PUBU 判断趋势 // ========================================== D1_MA1 = (AverageFC(Data[0].Close, 4)+AverageFC(Data[0].Close, 4*2)+AverageFC(Data[0].Close, 4*3))/3; D1_MA2 = (AverageFC(Data[0].Close, 6)+AverageFC(Data[0].Close, 6*2)+AverageFC(Data[0].Close, 6*3))/3; D1_MA3 = (AverageFC(Data[0].Close, 9)+AverageFC(Data[0].Close, 9*2)+AverageFC(Data[0].Close, 9*3))/3; D1_MA4 = (AverageFC(Data[0].Close, 13)+AverageFC(Data[0].Close, 13*2)+AverageFC(Data[0].Close, 13*3))/3; D1_MA5 = (AverageFC(Data[0].Close, 18)+AverageFC(Data[0].Close, 18*2)+AverageFC(Data[0].Close, 18*3))/3; D1_MA6 = (AverageFC(Data[0].Close, 24)+AverageFC(Data[0].Close, 24*2)+AverageFC(Data[0].Close, 24*3))/3; Data[0].PlotNumeric("D1_MA1", D1_MA1); Data[0].PlotNumeric("D1_MA2", D1_MA2); Data[0].PlotNumeric("D1_MA3", D1_MA3); Data[0].PlotNumeric("D1_MA4", D1_MA4); Data[0].PlotNumeric("D1_MA5", D1_MA5); Data[0].PlotNumeric("D1_MA6", D1_MA6); Data[0].Commentary("D1_MA1:"+Text(D1_MA1)); // 判断 D1 排列状态 // 完美多头: MA1>MA2>MA3>MA4>MA5>MA6 If (D1_MA1 > D1_MA2 And D1_MA2 > D1_MA3 And D1_MA3 > D1_MA4 And D1_MA4 > D1_MA5 And D1_MA5 > D1_MA6) { D1_TrendScore = 1; // 强多头趋势 } // 完美空头: MA1<MA2<MA3<MA4<MA5<MA6 Else { If (D1_MA1 < D1_MA2 And D1_MA2 < D1_MA3 And D1_MA3 < D1_MA4 And D1_MA4 < D1_MA5 And D1_MA5 < D1_MA6) { D1_TrendScore = -1; // 强空头趋势 } Else { D1_TrendScore = 0; // 均线纠缠,震荡市 } } // ========================================== // 第二层:H1 逻辑 - 6线 PUBU 寻找机会 // ========================================== // 计算 H1 的 6 根均线 H1_MA1 = (AverageFC(Data[1].Close, 4)+AverageFC(Data[1].Close, 4*2)+AverageFC(Data[1].Close, 4*3))/3; Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4))); Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4*2))); Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4*3))); Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4)+AverageFC(Data[1].Close,4*2)+AverageFC(Data[1].Close,4*3))); Data[1].Commentary("H1_MA1:"+Text(H1_MA1)); //问题在这里,H1_MA1等于后面的语句,上面我使用公式的时候能够计算数值,但是当用H1_MA1的时候,值是0. H1_MA2 = (AverageFC(Data[1].Close, 6)+AverageFC(Data[1].Close, 6*2)+AverageFC(Data[1].Close, 6*3))/3; H1_MA3 = (AverageFC(Data[1].Close, 9)+AverageFC(Data[1].Close, 9*2)+AverageFC(Data[1].Close, 9*3))/3; H1_MA4 = (AverageFC(Data[1].Close, 13)+AverageFC(Data[1].Close, 13*2)+AverageFC(Data[1].Close, 13*3))/3; H1_MA5 = (AverageFC(Data[1].Close, 18)+AverageFC(Data[1].Close, 18*2)+AverageFC(Data[1].Close, 18*3))/3; H1_MA6 = (AverageFC(Data[1].Close, 24)+AverageFC(Data[1].Close, 24*2)+AverageFC(Data[1].Close, 24*3))/3; // 判断 H1 排列状态 If (H1_MA1 > H1_MA2 And H1_MA2 > H1_MA3 And H1_MA3 > H1_MA4 And H1_MA4 > H1_MA5 And H1_MA5 > H1_MA6) { H1_TrendScore = 1; // H1 处于多头结构 } Else If (H1_MA1 < H1_MA2 And H1_MA2 < H1_MA3 And H1_MA3 < H1_MA4 And H1_MA4 < H1_MA5 And H1_MA5 < H1_MA6) { H1_TrendScore = -1; // H1 处于空头结构 } Else { // 保持上一根的状态,或者设为0表示当前混乱 // 这里选择保持状态,以过滤盘中波动,直到形态破坏 // 如果需要更敏感,可以在此处 Else { H1_TrendScore = 0; } } // ========================================== // 第三层:M10 逻辑 - 触发入场 // ========================================== // --- 做多逻辑 --- // 条件1: D1 6线呈多头排列 (大方向向上) // 条件2: H1 6线呈多头排列 (中周期确认向上,替代了KDJ金叉) // 条件3: 当前无持仓 If (D1_TrendScore == 1 And H1_TrendScore == 1 And MarketPosition == 0) { // 激进入场:直接以当前 M10 收盘价或挂单入场 // 保守入场:等待 M10 突破前一根高点 Numeric BuyPrice = High[1]; Buy(Lots, BuyPrice); PlotString("Action", "Buy"); } // --- 做空逻辑 --- // 条件1: D1 6线呈空头排列 // 条件2: H1 6线呈空头排列 // 条件3: 当前无持仓 If (D1_TrendScore == -1 And H1_TrendScore == -1 And MarketPosition == 0) { Numeric SellPrice = Low[1]; SellShort(Lots, SellPrice); PlotString("Action", "SellShort"); } // --- 离场逻辑 (示例) --- // 当 H1 级别的 6线排列被破坏(例如短期均线下穿长期均线导致不再是完美排列)时离场 // 注意:这里的 H1_TrendScore 如果不是 1 或 -1,说明排列乱了 // 多单离场:H1 不再是完美多头排列 If (MarketPosition == 1 And H1_TrendScore != 1) { Sell(Lots, Close); } // 空单离场:H1 不再是完美空头排列 If (MarketPosition == -1 And H1_TrendScore != -1) { BuyToCover(Lots, Close); } } // --- 绘图辅助 --- // 绘制 D1 的 6 条线以便观察 //PlotNumeric("D1_MA1", D1_MA1); //PlotNumeric("D1_MA6", D1_MA6); // 只画首尾两条作为通道参考,避免图表太乱 //PlotNumeric("TrendState", D1_TrendScore);

看不太明白,这是ai写的么

回复:不是Ai写的。上面代码在途中展示的结果。 H1_MA1=AverageFC(Data[1].Close,4);Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4))); 则可以计算出数字。 Data[1].Commentary("H1_MA1:"+Text(H1_MA1)); 这个数字为0 。按道理是等效的。

回复:零基础课程里关于图层调用的说明看过么?变量是分图层的data0.ma1和data1.ma1是两个对象。并且函数内部参数图层对象依据于函数图层归属