图表信号NOK,假设OK但却没有向账户发出委托(未发生信号闪烁)

碳酸锂主力实盘时1120日14:23分满足买多条件成交1手,14:30图表显示满足K2的平仓条件(实际并未满足)如图1标识,而且14:30的图表信号并没有向账户发出委托(未出现信号闪烁,断网等预警,图第二图)。策略单元设置及代码见最后,请大神帮分析下原因。谢谢!Params Numeric HCBL(0.03); // 自高点的回撤比例 Numeric SZBLJC(0.012); //AJC建仓后的涨幅超过此时启动 Numeric SZBLGW(0.008); //A建仓后的高位涨幅超过此时启动 Numeric EMAFast(10); //A快速均线周期 Numeric EMASlow(21); //A慢速均线周期 Numeric Length(9); //BKDJ的最高最低值的bar数 Numeric LengthSlow(4); //BKDJ的K周期 //Numeric SmoothLength(8); //BKDJ的D周期 Numeric LCDQJ(20); //B超跌区间 Numeric CDBL(0.989); //B比前低低的倍数 Numeric CDlowB(3); //B前CDlowB的low Numeric CCDBL(0.994); //超跌后还超跌 Numeric JXSZ(6); //A调整后继续上涨的Bar数 Numeric GWB(5); //A高位调整Bar数量 Numeric Per(1); //开仓比例 Vars Series<Numeric> PriceEMAF; // 当前快EMA价格 Series<Numeric> PriceEMAS; // 当前慢EMA价格 Series<Numeric> PriceEMAFS; //F-S的值 Series<Numeric> HighestK; Series<Numeric> LowestK; Series<Numeric> K; Series<Numeric> kValue; Series<Numeric> DValue; Series<Integer> XDSS; // 开仓手数 Numeric a; //建仓后出现的最高价 Numeric b; //当前价格-最高价的差 Numeric Y; //建仓后最大涨幅 Numeric Bprice; //买入价格 Numeric Sprice; //平仓价格 Numeric DS1; //判断当前Bar是否有平仓 Numeric GWXL; //高位斜率 Numeric CDlow; //前CDlowB根low的最高价 Numeric n1; //n为价格转换为商品最小变动价的参数 Numeric n3; Numeric n4; Numeric n5; Events OnBar(ArrayRef<Integer> indexs) { //计算价格的EMA值 PriceEMAF = EMA(Open, EMAFast); PriceEMAS = EMA(Open, EMASlow); PriceEMAFS = PriceEMAF-PriceEMAS; //KDJ的计算 HighestK = Highest(High, Length); LowestK = Lowest(Low, Length); k = (low - LowestK) / (HighestK - LowestK) * 100; kValue = SMA(k, LengthSlow, 1); //DValue = SMA(KValue, SmoothLength, 1); // 建仓手数 XDSS = Max(IntPart((Portfolio_CurrentCapital() * Per) / (ContractUnit *MarginRatio * Close)), 0); // 计算最大可开手数 // 买入条件1:当前EMA金叉&& 当前bar平仓后不再买入&&当前图表显示空仓 Bool DS; If(DS1 == 0 && longEntries()!=0) DS = False; Else DS = True; // 买入条件3:当前low比前面CDlowB根low的最高价超跌 && 当前bar平仓后不再买入&&当前图表显示空仓 CDlow = Highest(low(), CDlowB); Bool D31 = low / CDlow < CDBL; Bool D3 = D31 && (kValue < LCDQJ) && (PriceEMAF < PriceEMAS); if(D3 && DS && MarketPosition == 0) { n1 = IntPart(CDlow * CDBL / (MinMove * PriceScale)) * MinMove * PriceScale; //Bprice = n1 + MinMove * PriceScale; Bprice = min(n1 + MinMove * PriceScale,open+ MinMove * PriceScale); Buy(XDSS, Bprice); } if(D3) Commentary("D3超跌买入"); // 买入条件4:调整后继续上涨 &&当前图表显示空仓 Bool D41 = PriceEMAF > PriceEMAS; Integer j; Bool D4 = True; for j=0 to JXSZ-1 { if(PriceEMAFS[j] <= PriceEMAFS[j+1]) { D4 = false; break; } } if(D4 && D41 && MarketPosition == 0) { Bprice = open + MinMove * PriceScale; // 按开盘价+一个价位开仓XDSS手 Buy(XDSS, Bprice); } if(D4 && D41) Commentary("D4调整后持续上涨"); Commentary("持续上涨" + Text(PriceEMAFS)); // 建仓后上涨比例达到SZBLGW后,无论D1 还是D2、D3 买入,未出现死叉前的高位调整; a = Highest(high(), BarsSinceLastEntry + 1); Y = a / EntryPrice - 1; Commentary("上涨比例" + Text(Y)); GWXL = LinearRegSlope(PriceEMAF,GWB); Bool K211 = (GWXL < 0) && (GWXL != InvalidNumeric); Bool K21 = (Y >= SZBLGW) && K211 && (PriceEMAF >= PriceEMAS); If(K21 && MarketPosition != 0) { Sprice = open - MinMove * PriceScale; Sell(0, Sprice); } if(K21) Commentary("K21高位调整"); // 建仓后上涨比例达到SZBLJC后,无论D1 还是D2、D3 买入,死叉就平仓; Bool K2 = (Y >= SZBLJC) && CrossUnder(PriceEMAF, PriceEMAS); If(K2 && MarketPosition != 0) { Sprice = open - MinMove * PriceScale; Sell(0, Sprice); } if(K2) Commentary("K2死叉"); b = low - Highest(high(), BarsSinceLastEntry + 1); Bool K3 = (b / a <= -HCBL); Commentary("回撤比例" + Text(b / a)); if(K3) Commentary("K3HCBL"); if(K3 && MarketPosition != 0) { if(Open < close[1]) //考虑低开超出止损; { n3 = IntPart(a * HCBL / (MinMove * PriceScale)) * MinMove * PriceScale; Sprice = min((a - n3 - 2 * MinMove * PriceScale), (open - MinMove * PriceScale)); } Else { n3 = IntPart(a * HCBL / (MinMove * PriceScale)) * MinMove * PriceScale; Sprice = a - n3 - 2 * MinMove * PriceScale; } Sell(0, Sprice); // 平全部多仓 } DS1 = BarsSinceExit(); if(DS) Commentary("此Bar未过平仓"); }

信号闪烁的问题需要自己写日志调试

回复:没有信号闪烁。

回复:回测显示平仓原因是代码的K2死叉,实际上K2的条件之一CrossUnder(PriceEMAF, PriceEMAS)都没满足。

回复:那就不清楚了,这种模型运行问题,是需要自行写日志调试运行过程的。

回复:我通过调整单元格开始时间取消了前一笔交易(上面代码的D4 && D41 && MarketPosition == 0买多,K3 && MarketPosition != 0平多),图表就不会出现上面讲的11-20日14:30的平多标识了,具体什么原因呢?请大神指教~谢谢!

回复:我分段试了一下代码,发现了原因了: Bool K2 = (Y >= SZBLJC) && CrossUnder(PriceEMAF, PriceEMAS);CrossUnder不能连着写。另定义一个Bool才行。这种细节没见教程里有说明呢😂

回复:另外,平台上找不到写日志调试的方法,有教程分享下么?谢谢!

回复:调试工具全在这个视频里有讲 https://video.tbquant.net/video?id=video464

回复:第一 你的这个问题在零基础课程里其实有讲过,是序列类型的问题 https://video.tbquant.net/video?id=video443 第二 调试的视频,也是零基础课程里讲过 https://video.tbquant.net/video?id=video464

补充说明,14:30图表K线上有平仓信号,图表单元里的多仓是不是应该为“0”,实际却仍为持仓1手(下图红圈)。

回复:早上开机后图表的1手变为0了。但仍没有委托或相关报警信息。