在分钟图上不显示信号了
//------------------------------------------------------------------------ // 简称: EMA30Price // 名称: 均线斜率 // 1.跌破前低就止损 // 2.止损以后下一根K线不开仓 // 类别: 策略应用 // 类型: 内建应用 //------------------------------------------------------------------------ Params Numeric EMA30Length(30); // 30日均线参数 Numeric MinDiff(0); // 与30线的最小价差 Numeric MaxDiff(100); // 与30线的最大价差 Numeric DiffPrice(3); // 多几跳去买/卖 Numeric SlopeCnt(5); // 近N天均线值的斜率 Numeric SlopeVal(1); // 斜率 Numeric DiffPercent(0.02); // 价差 Numeric LHKCnt(15); // 价差 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); // 手数 Global Numeric Skip; // 止损以后跳过的K线(跳过几根K线再开仓) //此处添加变量 Plot plt; 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(); //设置委托映射到主力 } } OnReady() { SetBackBarMaxCount(1 + EMA30Length); // 设置最大回溯条数 Range[0:DataSourceSize() - 1] { setPlotOption("ema30", "begin-bar", EMA30Length); } } OnBarClose(ArrayRef<Integer> indexs) { Numeric endTime = data1.RealEndDateTime(); Numeric currentTime = SystemDateTime(); Print("OnBarClose 执行时间:" +DateTimeToString(currentTime)+ ", RealEndDateTime: " +DateTimeToString(endTime)); data1.Commentary("Skip: " + Text(Skip)); if (endTime < currentTime) { Print("跳过回测K线 " + DateTimeToString(MakeDateTime(Date, Time))); return; } if (Skip > 0) { Print("跳过执行, Skip: " + Text(Skip) + DateTimeToString(MakeDateTime(Date, Time))); Skip = Skip - 1; return; } // 获取当前实时价格(当前bar的close价) CurrentPrice = data1.Close(); // 计算分钟线的最低价格/最高价格 Numeric i; Numeric curPrice; Numeric backCnt; Numeric lowest = 99999999; for i = 1 to LHKCnt { curPrice = data1.Close[i]; if(curPrice<lowest) { backCnt = i; lowest = curPrice; } } Bar barVal; Bool ret = data1.GetBar(barVal, backCnt); data1.Commentary("Lowest: " + Text(lowest) + "," +DateTimeToString(barVal.dateTime)); Numeric highest = 0; for i = 1 to LHKCnt { curPrice = data1.Close[i]; if(highest<curPrice) { backCnt = i; highest = curPrice; } } ret = data1.GetBar(barVal, backCnt); data1.Commentary("Highest: " + Text(highest) + "," + DateTimeToString(barVal.dateTime)); //获取当前商品的仓位 Position pos; mainSymbol = MainSymbol(Symbol()); A_GetPosition(mainSymbol, pos); longPosition = pos.longCurrentVolume; shortPosition = pos.shortCurrentVolume; Print("多单量: " + Text(longPosition) + ", 空单量 : " + Text(shortPosition) + ", " +DateTimeToString(MakeDateTime(Date, Time))); Numeric TargetPrice = Round(lowest * (1+DiffPercent), 1); data1.Commentary("跌到: " + Text(TargetPrice) + " 开多"); if (CurrentPrice > lowest && CurrentPrice <= TargetPrice) { if(longPosition <= 0) // 没有多单 { Print("开多单, data0.slope: " + Text(data0.slope) + ", SlopeVal: " + Text(SlopeVal) + ", ema30: " + Text(data0.ema30) + ", CurrentPrice: " + Text(CurrentPrice) + ", lowest: " + Text(lowest) + ", " + DateTimeToString(MakeDateTime(Date, Time))); plt.text("Text",Low, "开多"); Flag = data1.Buy(Cnt, CurrentPrice + DiffPrice); // 尽量成交,减少偷价 FileAppend("d:/tb_data/ma30.tbf", "开多单: " +DateTimeToString(MakeDateTime(Date, Time))+ ", 结果: " +Text(IIF(Flag, 1, 0))); } } } 以上是相关代码,data0是日线,data1是分钟线;原来是用 data1.MarketPosition 判断信号的,可正确在分钟图上显示入场/出场信号,如下图:但是改为 A_GetPosition(mainSymbol, pos); 判断仓位以后,在分钟图上就不显示信号了,信号跑到日线图上了,如下图:麻烦各位老师帮忙看看