MQL5:如何在下新订单之前自动删除所有未触发的挂单?

时间:2015-04-09 20:00:21

标签: algorithmic-trading mql4 metatrader4 mql5 metatrader5

我正在制作一个项目,要求我放置 BUYSTOP SELLSTOP 一对订单,然后在下一个栏上如果没有触发这些订单,则删除它们并放置新订单。

这是我的代码:

if(logic == true && OrdersTotal() == 0)
  {bool res = OrderSend(....);}
if(OrdersTotal() != 0)
  {
  if(ordertype == OP_BUY || ordertype == OP_SELL)
     {
      bool del = OrderDelete(....);
     }
  }

此代码在我测试时正确下订单并删除它们。

但是当EA在实时服务器上处于活动状态时,它不会打开订单,因为该平台已经开启了其他工具的订单。

我敢肯定会有一个简单的方法可以解决这个问题,但由于我是新手,我无法理解这一点。

2 个答案:

答案 0 :(得分:0)

目前尚不清楚您是否使用幻数和符号检查。 你应该检查......

int _ordersTotal = OrdersTotal()-1;
for (int i = _ordersTotal; i >= 0; i--){
   if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
   ....
}

在不同的实现中,即你可以创建一个函数(字符串符号)来检查你是否有一些指定符号的工作订单。

答案 1 :(得分:0)

旧谚语说:
Measure twice before cut once
OrderDelete()之前检查实际上有四个值(三个用于挂件)

正如您的定义所述,处理{ OP_{BUY|SELL}STOP }订单时,需要检查以下三项:

  • Symbol() 匹配(不会因删除其他EA或手动订单而导致不必要的副作用)
  • OrderType() 匹配(不会忽略订单的实际状态{ PENDING | AT_MARKET }和方向{ BUY | SELL }
  • OrderMagicNumber() 匹配(不会忽略可为每个人设置的UUID选择器实用程序OrderSend()

那么,让我们勾勒出检测过程:

int myEaContextAwareMagicNUMBER = ...;

for ( int ii  = OrdersTotal();
          ii >= 0;
          ii--
      )
      if OrderSelect( ii, SELECT_BY_POS, MODE_TRADES )
      {
          if (      OrderSymbol()       != _Symbol
             &&     OrderMagicNumber()  != myEaContextAwareMagicNUMBER
             &&     OrderOpenTime()     >= Time[1]                    // Prev. Bar 
             && !(  OrderType()         == OP_BUYSTOP
                 || OrderType()         == OP_SELLSTOP
                 )
             ) continue;                // __^ __^ __^ __^ __^ __^ loop for next test

          // -------------------------------------------+
          // FINALLY PROCESS THE MATCHING OrderDelete() |
          // -------------------------------------------+
             ...
             ..
             .
          // -------------------------------------------+
      }
      else Print( "WARN: OrderSelect() failed at db.POOL.SELECT(), RECORD_NUMBER == ", ii );
  

那么如何删除未触发的挂起已完成

接下来是关于

的评论
  

“......当ea在实时服务器上处于活动状态时,它不会打开订单,因为该平台已经开启了其他工具的订单。”

如果没有提供准确的 { GetLastError() | _LastError } 值,很难提供任何建议。

某些帐户类型的某些代理确实限制了OrderSend()接受政策,因此除GetLastError()值外,相应的经纪商条款和条件也适用。

Do not hesitate to ask more & may enjoy other Questions/Answers in MQL4 domain.