在分钟图上不显示信号了

//------------------------------------------------------------------------ // 简称: 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); 判断仓位以后,在分钟图上就不显示信号了,信号跑到日线图上了,如下图:麻烦各位老师帮忙看看

A_GetPosition是实时函数,你没登账户不会有持仓,而且实时是没有历史的

回复:我登录账户了,用的是模拟账户;另外我的平多单的方法已经被触发了,而且执行到Sell函数了,Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的

回复:另外我用 A_GetPosition 已经拿到持有的多单数量了

回复:图表和A函数混用是不会有什么正确结果的 你A_GetPosition 取到有什么用,刷新一下看看 图表上还会在吗?

回复:意思是 推荐用MarketPosition 做真正的持仓信号是吗?用A_GetPosition是因为可以拿到真正的持仓信息,以免MarketPosition发生信号闪烁导致重复开仓;

回复:图表系统就用图表信号

回复:那我上面那个sell函数被触发了,但是却没有平仓,是因为 MarketPosition 的原因啊?还是因为我这个单子是手动开仓的单子引起的啊?

另外我的平多单的方法已经被触发了,而且Flag 的值显示为1, 但是怎么持有的多单就是没有被平仓掉啊?我这个多单是手动开仓的

原来使用 data1.MarketPosition 判断仓位的时候,可在分钟图上看到信号,但是改为 A_GetPosition(mainSymbol, pos); 判断仓位以后,在分钟图上就看不到信号了

回复:不同图层需要加前缀运行