在多层中开多单以后,MarketPosition为什么总是0

//------------------------------------------------------------------------ // 简称: EMA30Price // 名称: 均线斜率 // 类别: 策略应用 // 类型: 内建应用 //------------------------------------------------------------------------ Params Numeric EMA30Length(30); // 30日均线参数 Numeric MinDiff(0); // 与30线的最小价差 Numeric MaxDiff(100); // 与30线的最大价差 Numeric DiffPrice(3); // 多几跳去买/卖 Numeric SlopeCnt(5); // 近N天均线值的斜率 Numeric SlopeVal(2); // 斜率 Vars Series<Numeric> ema30; // 30日均线值 Series<Numeric> slope; // 30日均线值 Numeric CurrentPrice; // 当前实时价格 Numeric Diff; Numeric longPosition; Numeric shortPosition; Bool Flag(False); String mainSymbol; Numeric Cnt(1); // 手数 Numeric MarketPosition; // 图表上信号的当前净持仓状态,-1表示当前位置为持空仓,0表示当前位置为持平,1表示当前位置为持多仓 Events //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //与数据源有关 Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 (据说只是回测时用的) AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 //=========交易相关设置============== SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手 SetOrderMap2MainSymbol(); //设置委托映射到主力 } } // 每根BAR开始的时候设置触发时间点, 收盘价模型收盘提前N秒发单 OnBarOpen(ArrayRef<Integer> indexes) { Array<Numeric> timePoint; Numeric ret = DateTimeAdd(RealEndDateTime, -10); // 提前10秒发单 ret = StringToTime(TimeToString(ret)); ArrayPushBack(timePoint, ret); ret = DateTimeAdd(RealEndDateTime, -5); // 提前5秒发单 ret = StringToTime(TimeToString(ret)); ArrayPushBack(timePoint, ret); SetTriggerBarClose(timePoint); } OnReady() { SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数 Range[0:DataSourceSize() - 1] { setPlotOption("ema30", "begin-bar", EMA30Length); } } OnBar(ArrayRef<Integer> indexs) { // data0 是日线数据 // data1 是分钟级别数据 Range[0:DataSourceSize() - 1] { // 计算30日均线 ema30 = AverageFC(Close, EMA30Length); PlotNumeric("ema30", ema30); // 计算日均线的斜率 Array<Numeric> arr; Numeric i; for i=SlopeCnt DownTo 1 { ArrayInsert(arr, 0, ema30[i]); } slope = LinearRegSlopeArray(arr); //线性回归斜率 Commentary("均线斜率:" + Text(slope)); } } OnBarClose(ArrayRef<Integer> indexs) { Print("OnBarClose 执行时间:" + DateTimeToString(MakeDateTime(Date, Time))); // 获取当前实时价格(当前bar的close价) CurrentPrice = Close(); // 计算分钟线的最低价格/最高价格 Numeric lowest = data1.Lowest(data1.Close[1], EMA30Length); Numeric highest = data1.Highest(data1.Close[1], EMA30Length); if(data1.MarketPosition <> 1) // 没有多单 { Flag = data1.Buy(Cnt, CurrentPrice + DiffPrice); // 尽量成交,减少偷价 FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } 为什么我在 OnBarClose 中开多单以后,用data1.MarketPosition 获取到的值一直是0,然后导致一直开单;data0是日线级别,data1是分钟/小时线级别;以下是截图:

看到原因了,打扰了

回复:哦好