[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 294

 
CreAndr:
我有一个关于拖网的问题,谁能告诉我。这似乎是正确的拖网,以实现收支平衡,但它并不奏效。

这里有一个拖网:https://www.mql5.com/ru/forum/131859

要在文本中插入代码,请按文本输入栏上方的SRC 按钮。

 
DhP:

这里有一个拖网:https://www.mql5.com/ru/forum/131859

要在文本中插入代码,请按文本输入栏上方的SRC 按钮。


谢谢你。
 
CreAndr:
我有一个关于拖网的问题,谁能告诉我。它似乎是正确的拖网到收支平衡,但它不工作。


按重要性降序排列的原因清单。

1.电脑没有开机

2.Metatrader没有开机。

3.图表上的脚本没有安装

4.未启用专家顾问系统

5.没有什么可拖累的。

6.代码中有些地方出了问题。

 
Roger:


按重要性从高到低的顺序列出原因。

1.电脑没有开机

2.Metatrader没有开机。

3.图表上的脚本没有安装

4.未启用专家顾问系统

5.没有什么可拖累的。

6.代码中有些地方出了问题。

很好的回答,Roger,但是电脑是开着的,Metatrader也是开着的,EA是连接到图表上的,EA是启用的,交易是打开的,因此有一些东西是可以追踪的但是,代码有什么问题呢,这就是问题所在。
 
artmedia70:
使用OrderOpenTime() 对于--那我们为什么需要它?


所以,是的,但我得到的订单号相当短,但对于OrderOpenTime,我不明白该怎么做,我需要把开放时间 放在某个地方,与列表中的下一个订单进行比较,如果时间更长,就重写变量,等等。我还不了解这个算法。


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
很好的回答,罗杰,但是电脑是启用的,MetaTrader也是启用的,EA是附在图表上的,EA是启用的,交易是打开的,因此有东西可以拖动!但是,代码有什么问题呢,这就是问题所在。


起初没有代码,你后来附上了。

可能是因为你在开单功能中加入了尾音,也就是说,开单的条件确实出现了,订单被打开了,但它可能没有得到任何进一步发展。

 
Pyro:

所以,是的,但通过订单号我得到了相当短的时间,但对于OrderOpenTime,我不明白该怎么做,我需要把开放时间放在某个地方,与列表中的下一个订单进行比较,如果时间更长,就重写这个变量,等等。我还不了解这个算法。


序列号是不可靠的,这个编号没有任何保证,只是为了测试者。在前面的几页,我写了搜索最后一个关闭订单的代码。这很简单,我们已经看完了票,然后我们根据票选择了订单 或位置,就这样了。

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


订单号是不可靠的,在这个编号中没有人保证任何东西,只是对测试者而言。在前面几页,我写了代码来寻找最后一个关闭的订单,对开放的订单也是如此。一切都很简单,我们已经通过它,记住了这个票,然后通过这个票选择了一个订单或一个位置,就是这样。

谢谢你,这真的很简单。我将研究这个问题。
 
Roger:


起初没有代码,你后来加了。

可能是因为你在开单功能中加了尾音,也就是说,开单的条件确实发生了,订单被打开了,但它可能不会有任何进展。

我明白了,谢谢你。
 
Figar0:


订单号是不可靠的,在这个编号中没有人保证任何东西,只是对测试者而言。在前面几页,我写了代码来寻找最后一个关闭的订单,对开放的订单也是如此。这很简单,我们已经看完了票据,然后我们通过票据选择了一个订单或一个位置,就这样。

代码是错误的。

首先,这里是这样的。

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

如果命令符号等于符号 变量中的给定符号 ,则命令魔法等于魔法。因此,如果任何带有符号 的订单被选中,而魔力不同或缺失,条件将被满足。因为不是 这样就是 那样。相应地,我们应该 or 来代替e,或者,最好是把检查分成独立的字符串--循环会更快,这对优化至关重要。

进一步...按票选:水池 参数被忽略,也就是说,在这里写它没有意义。

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

当订单被票据成功选中后,我们应该检查它是从哪个订单列表中被选中的--市场订单还是封闭订单。要做到这一点,我们需要检查订单关闭的时间,如果它高于零,那么该订单肯定已经关闭。对于未结头寸,该参数总是等于零。IMHO,在选择了最后一个订单后,我们应该立即检查它的类型,并将其写入变量中。

现在,该函数将看起来像这样。

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

现在,如果我们想只检查当前图表中的买入或卖出,以及其中哪一个是最后的关闭,我们应该这样调用这个函数。

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

对于错误处理,原则上我们可以创建一个全局变量,例如int err;并在函数本身的主体中把错误号码存储在这个变量中。

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

然后在调用函数后处理错误 ...

GetTypeLastClosePos(Symbol(), Magic);

...和错误发生,其数字将被存储在变量err 中,在处理块中,这个数字将被处理。

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

更好的是,使用开关