最近做的自动化交易总是出现信号闪烁问题 通过通知信息分析发现委托买卖信号产生时间不对
我的交易周期为1分钟,开仓信号以macd金死叉为判断,macd取值用的是C[1]
以上述通知为例 ,我的交易信号应该在10:13的K线走完产生,即交易信号发生要在10:14,但实际交易是,10:13最后几秒产生,在10:13是不满足开仓条件的 所以发生了信号闪烁,各位老师帮忙看看怎么解决这个问题,谢谢!!
具体代码如下
Params
Numeric FastLength(89);//声明数值型参数为FastLength,初始值赋值它为12个周期//
Numeric SlowLength(144);//声明数值型参数为SlowLength,初始值为26个周期。//
Numeric MACDLength(9);//声明数组型参数为MACDLength,初始值为9个周期。//
Numeric TIMES(5);//止盈倍数。//
Numeric MONEY(1000);//声明盈亏金额,初始值1000。//
Numeric HHCSZ(999);//声明计算取值起始价位,初始值999。//
Vars
Series<Numeric> DIFF; //跟k线价格相关,所以用声明数组型序列变量名为MACDValue。//
Series<Numeric> GDShort; //短均线。//
Series<Numeric> GDlong; //长均线。//
GLOBAL BOOL PERMIT;//允许开仓。//
Numeric MACDValue;//声明数值型变量名为AvgMACD。//
Numeric DEA;//声明数值型变量名为MACDDiff。//
GLOBAL Numeric LOTS;//声明开仓手数。//
GLOBAL Numeric ZSK;//声明止损空价格。//
GLOBAL Numeric ZYK;//声明止盈空价格。//
BOOL JC ;//声明MACD金叉。//
BOOL SC ;//声明MACD死叉。//
BOOL GDJC ;//声明均线金叉。//
BOOL GDSC ;//声明均线死叉。//
Numeric NZSC;
Numeric NZJC;
Numeric NZGDSC;
Numeric NZGDJC;
GLOBAL Numeric H3;
GLOBAL Numeric L3;
GLOBAL Numeric GDJZ;//轨道极值
GLOBAL Numeric GDH3;//轨道高点
GLOBAL Numeric GDL3;//轨道低点
GLOBAL Numeric M;//开仓次数
GLOBAL BOOL KCBZ;//开仓标志
//Defs
//先轨道线金叉 再轨道线死叉,再等k线上碰轨道线上轨 macd死叉开空仓 止损2次 等下次轨道线死叉 上碰上轨 macd死叉再开仓 模板PL9
Events
OnReady()
{
Print("MinMove:" + Text(MinMove()));
}
onBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize() - 1]
{
DIFF = XAverage( Close[1], FastLength ) -XAverage( Close[1], SlowLength ) ;
DEA = XAverage(DIFF,MACDLength);
MACDValue = DIFF - DEA;
GDShort= XAverage( Close[1], 144 );//短均线
GDlong= XAverage( Close[1], 338 ); //长均线
GDJC=CROSSOVER(GDShort,GDLONG);//均线金叉
GDSC=CROSSOVER(GDLONG,GDShort);//均线死叉
JC = CrossOver(DIFF,DEA);//macd金叉
SC = CROSSOVER(DEA,DIFF);//macd死叉
NZSC= NthCon(SC,1);//上一次死叉到当前的周期数
NZJC = NthCon(jC,1);//上一次金叉到当前的周期数
L3=Lowest(L,NZSC);//最近一次死叉到目前为止的最低值
H3=HIGHEST(H,NZJC);//最近一次金叉到目前为止的最高值
NZGDSC= NthCon(GDSC,1);//上一次均线死叉到当前的周期数
NZGDJC = NthCon(GDjC,1);//上一次均线金叉到当前的周期数
GDL3=Lowest(L,NZGDSC);//最近一次均线死叉到目前为止的最低值
GDH3=HIGHEST(H,NZGDJC);//最近一次均线金叉到目前为止的最高值
If (GDSC AND GDH3>HHCSZ AND MarketPosition==0)//初始均线死叉 高点在初始设定值之上 赋顶部值准备开仓
{
PERMIT=TRUE;
M=3;//开仓次数设为3
GDJZ=GDH3;
}
If (GDSC AND GDH3>GDJZ AND MarketPosition==0)//第一次均线死叉破顶后 赋顶部值重新准备开仓
{
PERMIT=TRUE;
M=3;//开仓次数设为3
GDJZ=GDH3;
}
IF (SC AND H3>GDlong AND M>0 AND M<4 AND MarketPosition==0)
{
LOTS=ROUND((MONEY/(H3-C[1])/ContractUnit),0);//开仓手数
SellShort(LOTS,C[1]-MinMove*PriceScale);//开仓价格
ZSK=H3;//止损
ZYK=C-TIMES*(H3-C[1]);//止盈
M=M-1;
}
IF (Close[1]>ZSK AND MarketPosition==-1 and MACDValue>0)
{
BuyToCover(ABS(CurrentContracts),Close[1]+MinMove*PriceScale);
}
IF (L<ZYK AND MarketPosition==-1)
{
BuyToCover(ABS(CurrentContracts),ZYK);
PERMIT = FALSE;
}
IF (H>GDJZ )
{
M=0;
}
If (MACDValue >= 0)
PlotAuto("MACD",MACDValue,0,Red,Enum_Bar);
Else
PlotAuto("MACD",MACDValue,0,Green,Enum_Bar);
}
}
你怎么会用global做状态变量啊 那盘中肯定闪烁啊
老师帮我看看是哪几个global有问题 我刚才把global全去掉再跑了一遍程序结果都不开仓了 。
还有我前面分析的我取得是C[1],开仓信号应该在1分钟k线走完即下1分钟开始时发信号,为什么它会在这1分钟的最后1、2秒出信号,这怎么解释?
问题解决了!不是gloabl变量的问题 信号闪烁是onbar的问题,当Bar一个周期有多次变化导致了信号闪烁,我改成onbaropen就没有问题了
onBar(ArrayRef<Integer> indexs)你是说把这个改成了onbaropen吗?