0

我正在做一个项目,该项目需要我下一个BUYSTOP和一SELLSTOP对订单,如果这些订单没有被触发,然后在下一个栏上,然后删除它们并放置新的。

这是我的代码:

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

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

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

我敢肯定有一种很简单的方法可以解决这个问题,但由于我是新手,我无法弄清楚。

4

2 回答 2

1

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

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

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

于 2015-07-01T12:42:01.330 回答
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()价值之外,相应的经纪商条款和条件也适用。

不要犹豫,提出更多问题,并可能在域中享受其他问题/答案MQL4

于 2016-08-20T10:28:12.067 回答