欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → orderstatus执行问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3050人关注过本帖树形打印复制链接

主题:orderstatus执行问题

美女呀,离线,留言给我吧!
NatalieGuan
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
orderstatus执行问题  发帖心情 Post By:2016/8/10 11:18:07 [只看该作者]

我写了以下函数,本意是下单之后如果成交,则执行平仓动作,若未成交,则等待一定时间,中间若不符合我的交易条件则撤单,等待一定时间后不成交也撤单,但是运行的结果发现,只有触发了撤单条件(但其实已经成交几秒了)以后才会触发平仓动作,这是为什么?是因为不执行完这个函数就不能再触发一次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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/8/10 11:22:16 [只看该作者]

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

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



金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 11:28:05 [只看该作者]

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

 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 11:30:46 [只看该作者]

可是如果定时器的话我怎么在这一段等待时间内不断循环进行判断跟操作呢?


 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 11:32:23 [只看该作者]

我的逻辑是,如果submit以后,会触发这个函数,然后执行case submitted,但是如果这时候filled了,不是应该马上再触发这个函数,执行case filled吗?

 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 11:37:11 [只看该作者]

所以是因为,上一个orderstatus执行不完成,就不能触发下一个orderstatus吗?那我怎么随时判断这个单成交了没有呢?我试过用orderinfo里的remaining,也没有用
 if Remaining=0  then//若成交,则exit
       exitflag=1
     
       exit do 
       end if
就这个怎么改呢?

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/8/10 12:59:39 [只看该作者]

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

 

我这里给你一个思路。

 

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

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

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

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

如此循环



金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 13:28:37 [只看该作者]

在哪个函数里建立一个1秒定时器呢?

 回到顶部
美女呀,离线,留言给我吧!
NatalieGuan
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:117 积分:0 威望:0 精华:0 注册:2016/6/27 15:46:46
  发帖心情 Post By:2016/8/10 14:16:05 [只看该作者]

成功,非常感谢!

 回到顶部