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