算法交易分批下单问题 (文华财经WH8赢智V8.2)

投资者咨询:算法交易分批下单问题 (文华财经WH8赢智V8.2)
来源:文华财经  日期:2019-4-8 11:11
参考文华的分批下单模板,进行了修改,发现会出现问题

当某笔单子没有成交的时候,进行撤单交易,程序默认撤单成功,然后直接进入下一轮委托
后来该笔单子又成交了,撤单失败。最后总成交手数超过了设置的值。

请问该怎么修改?





GLOBAL_VAR MOD; //模组名称
GLOBAL_VAR COD; //合约编码 
GLOBAL_VAR T; //时间间隔
GLOBAL_VAR KN; //每次开仓手数
GLOBAL_VAR NOW; //当前时间
GLOBAL_VAR NUMB; //查询单次成交数量
GLOBAL_VAR MAXORDER;//阈值:对多可发委托手数/信号手数

GLOBAL_VAR BKID; //开平仓委托
GLOBAL_VAR BKSIGV; //信号手数
GLOBAL_VAR BCFLG; //多头处理标志
GLOBAL_VAR BKFLG; //开平仓标志
GLOBAL_VAR BKM; //单次买开委托手数
GLOBAL_VAR BKT; //买开委托时间
GLOBAL_VAR BKN; //已发出买开委托总手数
GLOBAL_VAR BKCN; //开仓成交总手数


VOID MAIN()
{
   VLFUN(); //执行变量赋值函数
   OPFUN(); //执行开盘处理函数
}

//----------------------自定义函数--------------------//

VOID VLFUN() //变量赋值函数
{
   MOD = "TEST"; //模组名称
   COD = MOD.F_DealCode(); //合约编码

   T = 1; //开仓时间间隔
   KN = 3; //每次开仓手数
   MAXORDER = 1.3;//阈值设为1.3
   NOW = CurrentTime(); //当前时间
}

VOID OPFUN() //开盘处理函数
{
   IF(T_IsExchangeOpen(COD) == 1) //如果当前状态是开盘
   {
      KPCCHK(); //执行成交判断函数
      SIGFUN(); //执行信号处理函数
   }
}

VOID KPCCHK() //成交判断函数
{
   BKCHK(); //执行买开成交判断函数
   BKCHK2(); //执行多头平仓成交判断函数
   SKCHK(); //执行卖开成交判断函数
   SKCHK2(); //执行空头平仓成交判断函数
}

VOID SIGFUN() //信号处理函数
{
   IF(MOD.F_FreshSig() == 1) //如果当前信号是未处理过的新信号
   {
      IF(MOD.F_SigValid() == 1) //如果当前信号未消失
      {
         IF(MOD.F_Sig() == BK) //如果信号类型为BK
         {
            MessageOut("【BK信号!】");
            IF(BCFLG == 0) //如果未开启做多处理
            {
               BKSIGV = MOD.F_SigVol(); //信号手数
               MessageOut("【BK信号:信号手数" + BKSIGV + "手!】");
               BCFLG = 1; //开启做多处理
            }
         }

       
}

//-------------------------买开-----------------------//

VOID BKFUN() //买开函数
{
   IF(BKFLG == 0 && BKN < BKSIGV * MAXORDER) //如果没有买开委托。发出委托不超过1.3倍的信号数量,防止程序出错
   {
      IF(BKN == 0 || (BKN > 0 && NOW - BKT >= T)) //如果是首次委托,或非首次委托且时间间隔T秒
      {
         IF(BKCN < BKSIGV && BKCN + KN < BKSIGV) //如果成交手数小于信号手数,且不是最后一批
         {
            BKM = KN; //买开委托手数
         }
IF(BKCN < BKSIGV && BKCN + KN >= BKSIGV) //最后一批委托
{
    BKM = BKSIGV - BKCN; // 剩余委托数量
         }
         MessageOut("【BK信号:买开委托发出:" + BKM + "手!】");
         BKID = T_Deal1(COD,0,0,BKM,ACTIVE_ORDER); //以对价发出买开委托手数的买开委托
BKN = BKN + BKM; //已发出委托数量
         BKT = NOW; //买开委托时间
         BKFLG = 1; //买开委托标志
      }
   }
}

VOID BKCHK() //买开成交判断函数
{
   IF(BKFLG > 0) //如果有买开委托
   {
      IF(T_OrderState(BKID) == 0 || T_OrderState(BKID) == 1 || T_OrderState(BKID) == 3) //如果买开委托未成交,成交或者部分成交
      {
IF(T_OrderState(BKID) == 0 || T_OrderState(BKID) == 3) //如果未成交或者部分成交
{
T_DeleteOrder(BKID); //发出撤单命令
}
         NUMB = T_OrderMatchVol(BKID); //成交数量
 
BKCN = BKCN + NUMB;
         MessageOut("【BK信号:买开委托成交:" + BKCN + "手!】");
NUMB =0 ;
BKFLG = 0; //买开标志归0
IF(BKCN >= BKSIGV) //如果是最后一批买开委托  
{
    MessageOut("【BK信号:买开委托成交完成!】");
    BKN = 0; //已发买开委托数量归0
BKCN = 0;//买开已成交数量归0
    BCFLG = 0; //多头处理标志归0
}
      }
  IF(T_OrderState(BKID) == 2 || T_OrderState(BKID) == 7 || T_OrderState(BKID) == 14 || BKN >= BKSIGV * MAXORDER)  //出现错误的处理
  {
         MessageOut("【BK信号:委托出错】");
     NUMB =0 ;
BKFLG = 0; //买开标志归0
     BKN = 0; //已发买开委托数量归0
BKCN = 0;//买开已成交数量归0
  BCFLG = 0; //多头处理标志归0
  }
   }
}
技术人员回复
日期:2019-4-8 11:34
 正常情况下,一笔单子如果算法运行池撤单成功了,是不会再显示这笔挂单成交的

如果成交了,之前挂单应该是撤单失败的,您运行中出现这个问题了吗?

您上传算法运行池运行日志截图,我们分析下
投资者咨询:算法交易分批下单问题 (文华财经WH8赢智V8.2)
来源:文华财经  日期:2019-4-8 11:11


图片点击可在新窗口打开查看 
投资者咨询:算法交易分批下单问题 (文华财经WH8赢智V8.2)
来源:文华财经  日期:2019-4-8 11:11
 在第12笔那个地方,撤单委托发出了,但是最后又成交了,但是程序并不知道成交了