以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  orderstatus执行问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=137795)

--  作者:NatalieGuan
--  发布时间:2016/8/10 11:18:07
--  orderstatus执行问题
我写了以下函数,本意是下单之后如果成交,则执行平仓动作,若未成交,则等待一定时间,中间若不符合我的交易条件则撤单,等待一定时间后不成交也撤单,但是运行的结果发现,只有触发了撤单条件(但其实已经成交几秒了)以后才会触发平仓动作,这是为什么?是因为不执行完这个函数就不能再触发一次orderstatus吗?
Sub ORDER_OrderStatusEx2(OrderID, Status, Filled, Remaining, Price, Code, Market, OrderType, Aspect, Kaiping, Account, AccountType)
    application.msgout("调用成功!"&Code&":"&Status) 
   if Code=cizhuliheyue then
   application.MsgOut("次主力合约交易动向!")
   Select Case Status
     Case "Inactive" 
     tradeflag=1
    
     Case "Submitted" 
     tOrderTime=now()
     application.msgout("Submitted!") 
     tradeflag=0
     application.MsgOut("tradeflag="&tradeflag)
     exitflag=0
     
       Ms=0
       timeflag=Ms-waitingtime
       do while exitflag=0 and timeflag<0 
       
       Ms=DateDiff("s",CDate(tOrderTime),Cdate(now()))
       timeflag=Ms-waitingtime
       if kongzhiflag=1 then
       update=abs(Price-zhuliprice)-shedingjicha+(huandiannumber+plustick)*MinTick
       else
       update=abs(Price-zhuliprice)-shedingjicha-(huandiannumber+plustick)*MinTick
       end if
       if ((update<0 and kongzhiflag=1) or (update>0 and kongzhiflag=0)) and Remaining>0 then//等待时间之内设定撤单条件
       order.CancelOrder(OrderID) 

       huanyue_ts1.AddItem time()& cizhuliheyue&" 不符合条件,准备撤单  "&OrderID
       
       exit do
       end if
       application.msgout("Remaining="&Remaining)
       
      if Remaining=0  then//若成交,则exit
       exitflag=1
     
       exit do 
       end if
       
       loop
       
       application.MsgOut("exitflag1=")
       application.MsgOut(exitflag)
       
       if exitflag=0  then 
       huanyue_ts1.AddItem time()& cizhuliheyue&"委托超时, 准备撤单  "&OrderID
       order.CancelOrder(OrderID) 
  
       
     
       end if
  
    
    Case "Filled" \'then\'(Status="Tradeing" and Filled>0) or Status="Filled" then
       application.msgout("成交了次主力合约!"&OrderID)
       if zhi<=0 then
       sellid=Order.buyshort(0, 1,zhuliprice-100,0,zhuliheyue,marketzhuli,"",0)
       huanyue_ts1.AddItem time()& zhuliheyue&" 自动发出移仓"&sellid&" 买入空仓指令  "&"价格为"&zhuliprice
       else
       sellid=Order.sell(0, 1,zhuliprice-100,0,zhuliheyue,marketzhuli,"",0)
       huanyue_ts1.AddItem time()& zhuliheyue&" 自动发出移仓"&sellid&" 卖出平仓指令  "&"价格为"&zhuliprice
       end if
       jiaoyicitemp=jiaoyicitemp+1 
       
     
       tradeflag=1
       
    
    case "Cancelled" 
    huanyue_ts1.AddItem time()& cizhuliheyue&"撤单成功  "&OrderID
    tradeflag=1
    CancelNum=CancelNum+1    
    End Select 
   
    end if
end sub
[此贴子已经被作者于2016-8-10 11:18:41编辑过]

--  作者:王锋
--  发布时间:2016/8/10 11:22:16
--  

你把控制流程代码放在ORDER_OrderStatusEx2事件中,当然会有问题了,ORDER_OrderStatusEx2这个时间只有你交易动作时才会被触发的。

建议你把控制流程放在定时器中,由定时器来定期做处理


--  作者:NatalieGuan
--  发布时间:2016/8/10 11:28:05
--  
如图
图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160810112543.png
图片点击可在新窗口打开查看
我设置的等待20秒。
其中第三行,是IC09成交以后才会触发的操作(实际上在这20秒之内就成交了),然而每次它都会在20秒时显示了第二行“撤单”才会触发第三行

--  作者:NatalieGuan
--  发布时间:2016/8/10 11:30:46
--  
可是如果定时器的话我怎么在这一段等待时间内不断循环进行判断跟操作呢?


--  作者:NatalieGuan
--  发布时间:2016/8/10 11:32:23
--  
我的逻辑是,如果submit以后,会触发这个函数,然后执行case submitted,但是如果这时候filled了,不是应该马上再触发这个函数,执行case filled吗?
--  作者:NatalieGuan
--  发布时间:2016/8/10 11:37:11
--  
所以是因为,上一个orderstatus执行不完成,就不能触发下一个orderstatus吗?那我怎么随时判断这个单成交了没有呢?我试过用orderinfo里的remaining,也没有用
 if Remaining=0  then//若成交,则exit
       exitflag=1
     
       exit do 
       end if
就这个怎么改呢?

--  作者:王锋
--  发布时间:2016/8/10 12:59:39
--  

你使用ORDER_OrderStatusEx2事件处理起来肯定是不行的,不可能按照你的要求去触发的。

 

我这里给你一个思路。

 

首先你建立一个1秒的定时器

下单后将你的报单塞到数组中,数组中需要至少记录ORDER ID以及下单时间

如果报单已经成交,在ORDER_OrderStatusEx2事件中将数组中的对应的ID删掉

在1秒定时器中判断数组中的报单,判断目前还在队列中的ORDER ID单子,在于本地计算机时间对比,超过20秒的就执行例如撤单等操作,然后再删除该订单ID。

如此循环


--  作者:NatalieGuan
--  发布时间:2016/8/10 13:28:37
--  
在哪个函数里建立一个1秒定时器呢?
--  作者:NatalieGuan
--  发布时间:2016/8/10 14:16:05
--  
成功,非常感谢!