请教代码问题

想请教一下,使用了跨周期用法。但是在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是两个对象。并且函数内部参数图层对象依据于函数图层归属