关于函数里面序列变量的使用问题
函数里面定义的序列变量的值打印出来都是一样的,调用的地方如下所示,这里可以打印出序列变量中不同的值,这是什么问题?打印结果如下:
函数里面定义的序列变量的值打印出来都是一样的,调用的地方如下所示,这里可以打印出序列变量中不同的值,这是什么问题?打印结果如下:
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]));