TB持仓信号和真实账户持仓不同步的调整模块 [开拓者 TB]
- 咨询内容: 本人开发了一套策略,历史数据回测什么都很好,接下来要做到计算机自动交易。现在万里长征还差最后一步,就是TB持仓信号和真实账户持仓不同步的调整模块,由于都是A_函数只有在实时行情的时候才能测试,从上周到现在花了好几个交易日,也改了好几次代码但还是有重复发单或者持仓不足等情况,今天收盘后针对发生的问题又改进了一下,也不知道明天能不能顺利通过。心里没底所以把这部分代码公开出来,希望管理员或有自动交易实盘经验的高手指点一下。
If((BarInterval==1 And Time!=0.1514) Or (BarInterval==5 And Time!=0.1510) Or (BarInterval==15 And Time!=0.1500))
{
TickCnt1=15; //等待TickCnt1次后如不成交采取相应措施
If(GetGlobalVar(2)==InvalidNumeric) //对全局变量初始赋值(包括意外网络中断、账户断开等情况后的初始化赋值)
{
SetGlobalVar(2,0);
}
If(MarketPosition==1)
{
If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0) //没有未成交委托单时计数器归零
{
SetGlobalVar(2,0);
}
If(A_BuyPosition>0)
{
If(A_BuyPosition>Abs(CurrentContracts)) //真实账户相对TB信号有多余持仓
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1; //计数器记录未成交委托单存在的Tick数
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0) //没有委托单时直接发单平掉多余持仓
{
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1) //如果委托单持续TickCnt1个Tick数后仍没成交
{
A_DeleteOrder(); //撤所有委托单
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice); //重新发单平掉多余持仓
SetGlobalVar(2,0); //重置全局变量
}
}else if(A_BuyPosition<Abs(CurrentContracts))
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1; //计数器记录未成交委托单存在的Tick数
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts)-A_BuyPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts)-A_BuyPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
}else if(A_BuyPosition==Abs(CurrentContracts)) //真实账户和TB信号持仓同步的时候
{
If(A_GetOpenOrderCount!=0) //如果还有未成交委托单全部撤单,重置全局变量
{
A_DeleteOrder();
SetGlobalVar(2,0);
}else if(GetGlobalVar(2)!=0)
{
SetGlobalVar(2,0);
}
}
}else if(A_SellPosition>0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
}else if(A_BuyPosition==0 And A_SellPosition==0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts),Q_AskPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts),Q_AskPrice);
SetGlobalVar(2,0);
}
}
}else if(MarketPosition==-1)
{
If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0) //没有未成交委托单时计数器归零
{
SetGlobalVar(2,0);
}
If(A_BuyPosition>0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
}else if(A_SellPosition>0)
{
If(A_SellPosition>Abs(CurrentContracts))
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1; //计数器记录未成交委托单存在的Tick数
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition-Abs(CurrentContracts),Q_AskPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition-Abs(CurrentContracts),Q_AskPrice);
SetGlobalVar(2,0);
}
}else if(A_SellPosition<Abs(CurrentContracts))
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1; //计数器记录未成交委托单存在的Tick数
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts)-A_SellPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts)-A_SellPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
}else if(A_SellPosition==Abs(CurrentContracts))
{
If(A_GetOpenOrderCount!=0)
{
A_DeleteOrder();
SetGlobalVar(2,0);
}else if(GetGlobalVar(2)!=0)
{
SetGlobalVar(2,0);
}
}
}else if(A_BuyPosition==0 And A_SellPosition==0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts),Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts),Q_BidPrice);
SetGlobalVar(2,0);
}
}
}else if(MarketPosition==0)
{
If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0) //没有未成交委托单时计数器归零
{
SetGlobalVar(2,0);
}
If(A_BuyPosition>0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
SetGlobalVar(2,0);
}
}else if(A_SellPosition>0)
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1;
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
{
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1)
{
A_DeleteOrder();
A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
SetGlobalVar(2,0);
}
}else if(A_BuyPosition==0 And A_SellPosition==0)
{
If(A_GetOpenOrderCount!=0)
{
A_DeleteOrder();
SetGlobalVar(2,0);
}else if(GetGlobalVar(2)!=0)
{
SetGlobalVar(2,0);
}
}
}
}
前面部分在MarketPosition==1情况下做了些注释,后面逻辑是一致的。基本思路就是发觉TB信号与实际持仓不一致的时候,先检查是不是已有委托单(可能是其他模块用Buy Sell命令发送的),如果已有委托单等待TickCnt1时间,如果该时间后没有成交则撤单用A_SendOrder发送。同时继续用OrderWaitCounts记录委托单发出未成的时间,如果过了TickCnt1时间还是没成交,继续撤单重发,直至实际持仓与TB信号同步。同步后检查是否还有未成交的委托单,如果有全部撤单并重置全局变量。
不同步的问题测试起来实在很麻烦,所以恳请高手回复,看看以上代码有无逻辑错误,会不会导致重复发单或其他问题。多谢了,加急!!! - TB技术人员: 不是有数据回放吗?可以多试试的现在,以前没有回放的时候我也很纠结。。。
- TB客服: 回放只显示行情,对实际账户持仓测试没用的
- 网友回复: 额,好吧,忘记自己没用A函数了。。
- 网友回复: 今天实时行情继续测试中,问题比之前少了些,不过还是有很多警告,而且都是连续发出的警告,持仓不足、资金不足和相应委托不能撤销这三类都有。我分析了一下代码,选前一段一起看一下:
If(A_BuyPosition>0)
{
If(A_BuyPosition>Abs(CurrentContracts)) //真实账户相对TB信号有多余持仓
{
If(A_GetOpenOrderCount!=0)
{
OrderWaitCounts=GetGlobalVar(2)+1; //计数器记录未成交委托单存在的Tick数
SetGlobalVar(2,OrderWaitCounts);
}else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0) //没有委托单时直接发单平掉多余持仓
{
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);
SetGlobalVar(2,0);
}
If(OrderWaitCounts==TickCnt1) //如果委托单持续TickCnt1个Tick数后仍没成交
{
A_DeleteOrder(); //撤所有委托单
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice); //重新发单平掉多余持仓
SetGlobalVar(2,0); //重置全局变量
}
}
我估计问题出在
If(OrderWaitCounts==TickCnt1) //如果委托单持续TickCnt1个Tick数后仍没成交
{
A_DeleteOrder(); //撤所有委托单
A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice); //重新发单平掉多余持仓
SetGlobalVar(2,0); //重置全局变量
}
这段里,因为里面有撤销委托操作和发单操作,如果是开仓单频繁发单就会导致资金不足警告,如果是平仓单就会导致持仓不足警告。我设计的思路是当OrderWaitCounts==TickCnt1的时候只要求发送一次,因为发送完全局变量就被重置为0了,这样即使不成交再进入该条件OrderWaitCounts又要重新开始计数等待,如果等到TickCnt1时再撤单重发。但实际情况是这段代码并没有只发送一次,还是频繁在发送,百思不其解,请管理员或诸位高手帮忙解答,谢谢了!
有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友
可联系技术人员 QQ: 262069696 进行 有偿 编写!(不贵!点击查看价格!)
相关文章
-
没有相关内容