关于函数里面序列变量的使用问题

函数里面定义的序列变量的值打印出来都是一样的,

调用的地方如下所示,这里可以打印出序列变量中不同的值,这是什么问题?

打印结果如下:

关于序列变量函数和if
关于序列变量的问题
关于IF或者循环程序体内不能用序列变量的疑问
序列变量
关于多帐号的序列变量的赋值和使用问题
换手率的系统例程里面,为什么Average函数的参数不是序列型?
序列函数Nthcon的使用在OnbarOpen and Onbar问题
序列变量,递归问题
简语言也有序列变量的问题??
序列变量和全局变量区别

Params
    Series<Numeric> Fast(0); // 快线
    Series<Numeric> Slow(0); // 慢线
    Numeric length(30); // 范围
    Bool isCrossUnder(True); // true 返回死叉位置 False 返回金叉位置

Vars
    Numeric i;

Begin
    for i = 1 To length -1
    {
        If(isCrossUnder)
        {
            Print(Text(i)+"-->fast[i]:"+Text(Fast[i])+",slow[i]:"+Text(Slow[i])+",fast[i-1]:"+Text(Fast[i-1])+",slow[i-1]:"+Text(Slow[i-1]));
            If(Fast[i] > Slow[i] And Fast[i-1] <= Slow[i-1])
            {
                Return i-1;
            }
        }
        Else
        {
            If(Fast[i] < Slow[i] And Fast[i-1] >= Slow[i-1])
            {
                return i-1;
            }
        }
    }

    Return 0;
End



Params

Vars
    Plot plt;
    
    Series<Numeric> ema_fast(0, 100);
    Series<Numeric> ema_slow(0, 100);
    Series<Numeric> MACDValue(0, 100);
    Series<Numeric> MACDDiff(0, 100);
    Series<Numeric> AvgMACD(0, 100);
Defs
    Bool bar_runing()
    {
        Numeric i;
        Numeric result = 1;
        For i = 0 to DataSourceSize - 1
        {
            result = result * Data[i].BarExistStatus;
        }
        If(result == 1)
        {
            Return True;
        }
        Else
        {
            Return False;
        }
    }
    
    Numeric remain_cash()
    {
        return IntPart(Portfolio_CurrentEquity - Portfolio_UsedMargin);
    }
    
    Bool loginfo(String msg)
    {
        msg = DateTimeToString(CurrentDate + CurrentTime) + "->" + msg;
        return FileAppend("D:\\tblog", msg);
    }
    
    Numeric cross_pos(Numeric start, Numeric length, Bool isCrossUnder)
    {
        Numeric i;
        for i = start To length - 1
        {
            If(isCrossUnder)
            {    
                Print("i:"+Text(i)+",value:"+Text(MACDValue[i]));
                If(MACDValue[i] > 0 And MACDValue[i - 1] <= 0)
                {
                    Return i - 1;
                }
            }
            Else
            {
                If(MACDValue[i] < 0 And MACDValue[i - 1] >= 0)
                {
                    return i - 1;
                }
            }
        }
        Return 0;
    }
    
Events
    //此处实现事件函数
    
    //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
    OnInit()
    {
        Numeric i;
        Numeric start_time = 20250101;
        //Array<String> symbols = ["SA888.CZCE", "MA888.CZCE", "v9888.DCE", "c9888.DCE", "FG888.CZCE", "rb888.SHFE", "hc888.SHFE", "TA888.CZCE"];
        Array<String> symbols = ["TA888.CZCE"];
        For i = 0 to GetArraySize(symbols) - 1
        {
            //SubscribeBar(symbols[i], "1d", start_time);
            SubscribeBar(symbols[i], "1h", start_time);
            SubscribeBar(symbols[i], "5m", start_time);
        }

        //与数据源有关
        Range[0:DataCount-1]
        {
            //=========数据源相关设置==============
            AddDataFlag(Enum_Data_RolloverForWard());  //设置前复权
            //AddDataFlag(Enum_Data_RolloverBackWard());    //设置后复权

            AddDataFlag(Enum_Data_RolloverRealPrice());    //设置映射真实价格

            AddDataFlag(Enum_Data_AutoSwapPosition());    //设置自动换仓

            AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());    //设置忽略换仓信号计算
            
            //=========交易相关设置==============
            SetMarginRate(0.15);    //设置保证金率为10%
            
            CommissionRate tCommissionRate;
            tCommissionRate.ratioType = Enum_Rate_ByFillAmount;
            tCommissionRate.openRatio = 5; //设置开仓手续费为成交金额的5%%
            tCommissionRate.closeRatio = 2; //设置平仓手续费为成交金额的2%%
            tCommissionRate.closeTodayRatio = 0; //设置平今手续费为0
            SetCommissionRate(tCommissionRate); //设置手续费率
            
            SetSlippage(Enum_Rate_PointPerHand,2);    //设置滑点为2跳/手
            
            SetOrderPriceOffset(2);    //设置委托价为叫买/卖价偏移2跳
            
            SetOrderMap2MainSymbol();    //设置委托映射到主力
            
        }
    }

    //在所有的数据源准备完成后调用,应用在数据源的设置等操作
    OnReady()
    {
        Range[0:DataSourceSize() - 1]
        {
            setPlotOption("STOP_LINE", "begin-bar", 5);
            setPlotOption("HIGH_LINE", "begin-bar", 5);
        }
    }

    //基础数据更新事件函数
    OnDic(StringRef dicName,StringRef dicSymbol,DicDataRef dicValue)
    {
        
    }

    //在新bar的第一次执行之前调用一次,参数为新bar的图层数组
    OnBarOpen(ArrayRef<Integer> indexs)
    {

    }

    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 
    //OnBarClose(ArrayRef<Integer> indexs)
    OnBar(ArrayRef<Integer> indexs)
    {
        If(!bar_runing)
        {
            Return;
        }
        Numeric i;
        for i = 0 To DataSourceSize - 1
        {
            Data[i].ema_fast = Data[i].AverageFC(Data[i].Close, 5);
            Data[i].MACDDiff = Data[i].XAverage(Data[i].Close, 12 ) - Data[i].XAverage(Data[i].Close, 26 ) ;    
            Data[i].AvgMACD = Data[i].XAverage(Data[i].MACDDiff, 9);
            Data[i].MACDValue = 2 * (Data[i].MACDDiff - Data[i].AvgMACD);
            If(i % 2 == 0)
            {
                Data[i].plt.text("text", Data[i].High + 10, Text(Data[i].CurrentBar));
                If(Data[i].MACDValue[1] <= 0 And Data[i].MACDValue[2] > 0)
                {
                    Data[i].plt.text("text", Data[i].Low, "x");
                    If(Data[i].CurrentBar > 1136)
                    {
                        Numeric pos = Data[i].cross_pos(3, 50, True);
                        Data[i].f_cross_pos(Data[i].MACDDiff, Data[i].AvgMACD, 50, True);
                        Print("4:->"+Text(Data[i].MACDValue[4])+",pos"+Text(pos));
                        Data[i].plt.text("text2", Data[i].Date[pos] + Data[i].Time[pos], Data[i].Low[pos], "死叉");
                    }
                }
                If(Data[i].MACDValue[1]>=0 And Data[i].MACDValue[2] < 0)
                {
                    Data[i].plt.text("text", Data[i].High, "O");
                }
            }
            If(i % 2 == 1)
            {
                
                //Data[i].PlotNumeric("d_ma", Data[i-1].ema_fast[1]);
                //Data[i].PlotNumeric("ma", Data[i].ema_fast[1]);
                Numeric high_price = Data[i].Highest(Data[i].High[3], 5);
                Data[i].PlotNumeric("high", high_price);
                
                Bool short_open = Data[i].Highest(Data[i-1].ema_fast[1], 3) == Data[i-1].ema_fast[2] 
                    And Data[i].Open < Data[i-1].ema_fast[1]
                    And Data[i].Open < high_price;
                Bool short_close = Data[i].Open > high_price;
                If(short_open And Data[i].MarketPosition() == 0)
                {
                    //Data[i].SellShort(1, Data[i].Open);
                }
                If(short_close And Data[i].MarketPosition() == -1)
                {
                    Data[i].BuyToCover(0, Data[i].Open);
                }
            }
        }
    }

    //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
    OnBarClose(ArrayRef<Integer> indexs)
    {
    }

    //Tick更新事件函数,需要SubscribeTick函数订阅后触发,参数evtTick表示更新的tick结构体
    OnTick(TickRef evtTick)
    {

    }

    //持仓更新事件函数,参数pos表示更新的持仓结构体
    OnPosition(PositionRef pos)
    {
        
    }

    //策略账户仓更新事件函数,参数pos表示更新的账户仓结构体
    OnStrategyPosition(PositionRef pos)
    {
        
    }

    //委托更新事件函数,参数ord表示更新的委托结构体
    OnOrder(OrderRef ord)
    {
        
    }

    //成交更新事件函数,参数ordFill表示更新的成交结构体
    OnFill(FillRef ordFill)
    {
        
    }

    //定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值
    OnTimer(Integer id,Integer intervalMillsecs)
    {
        
    }

    //通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容
    OnEvent(StringRef evtName,MapRef<String,String> evtValue) 
    {
        
    }

    //当前策略退出时触发
    OnExit()
    {

    }

    


你这个要基于你的K线图来判断,然后请发可复现问题的源码

然后就你上面的输出,”你的输出是不是都是一个bar“都是未知的。

bar是历史bar 输出的数据都是已知的,我在策略公式中都能正常获取序列值,到了自定义函数中就只能获取序列的第一个值了,没法获取序列后面的值。

自定义的函数中取序列值确实有问题,代码如下:

其中Data[i].Low[pos - 1],Data[i].Low[pos],Data[i].Low[pos + 1] 的值分别是,4744,4750,4750,这三个值得出的平均值应该是:4748,而Average得出得值是4744;

Print(Text(Data[i].Average(Data[i].Low[pos - 1], 3)) + "," + Text(Data[i].Low[pos - 1]) + "," + Text(Data[i].Low[pos]) + "," + Text(Data[i].Low[pos + 1]));