关于多图层前缀继承的细节问题
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]
        {
            Data[i3].MA_M15 = Data[i3].AverageFC(Data[i3].Close, MA_Period);
            Data[i3].ATR_Val = Data[i3].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图层前值比较
                  (data[i3].MA_M15[1] > data[i3].MA_M15[2]);              //修改                        // 15分钟无需额外绑定
        //PlotBool("ma_bull",ma_bull);
         // 计算MA_Bull的三个条件,并单独存储
		/*data0.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;*/
        PlotBool("ma_bull",ma_bull);
		// 打印MA_Bull的判断过程(使用IfString函数处理布尔值的文字描述)
		Data[i3].Commentary("MA_Bull判断过程:");
		// 条件1:用IIFString函数,true返回"满足",false返回"不满足"有修改
		Data[i3].Commentary("条件1(日线MA[1] > MA[2]): " + IIFString(Data0.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(data0.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(data0.cond3, "满足", "不满足") + " 【值:" + Text(MA_M15[1]) + " > " + Text(MA_M15[2]) + "】");
		// 最终结果:用IfString函数描述MA_Bull的真假有修改
		Data[i3].Commentary("最终MA_Bull: " + IIFString(data0.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  Data[i3].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));
            }
        }
    }

注意看注释里的修改标记,和原代码的区别。

主要是函数对象内部的参数对象,应该是继承函数的图层前缀,导致张冠李戴了。

如果看不明白可以等2025年10月30日的录像上线以后配合录像食用

多图层问题
关于多图层运算
关于多图层策略
多图层策略关于onbaropen?
关于多图层DataCount的问题
请教!关于多品种,跨周期,多图层
多图层计算问题
多图层
多图层的交易触发问题
关于图层的问题

yeah