碳酸锂主力实盘时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未过平仓");
}
补充说明,14:30图表K线上有平仓信号,图表单元里的多仓是不是应该为“0”,实际却仍为持仓1手(下图红圈)。
