Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 116

 
novichok2018:

Спасибо. break вроде помогло. Посмотрим, что будет дальше.

Нет, не совсем помогло. Работает нормально, только если открываются однотипные позиции. Если же например, сначала открылась СЕЛЛ и ещё не закрылась, а в это время открывается и закрывается БАЙ то СЕЛЛ уже не видит условий для своего закрытия до того момента, как откроется и закроется (по своим условиям) другая СЕЛЛ. И если вдруг опять откроются и закроются БАЙ, то она опять пропускает свои условия закрытия. Пытался определить наличие открытых позиций после закрытия БАЯ с помощью функции И.Кима ExistPositions(), но не понимаю, куда её вставлять, и где расположить Принт, чтобы проконтролировать исполнение. Подскажите.

 
novichok2018:

Нет, не совсем помогло. Работает нормально, только если открываются однотипные позиции. Если же например, сначала открылась СЕЛЛ и ещё не закрылась, а в это время открывается и закрывается БАЙ то СЕЛЛ уже не видит условий для своего закрытия до того момента, как откроется и закроется (по своим условиям) другая СЕЛЛ. И если вдруг опять откроются и закроются БАЙ, то она опять пропускает свои условия закрытия. Пытался определить наличие открытых позиций после закрытия БАЯ с помощью функции И.Кима ExistPositions(), но не понимаю, куда её вставлять, и где расположить Принт, чтобы проконтролировать исполнение. Подскажите.

Неужели никто не знает решения? Не верю.

 
novichok2018:  Неужели никто не знает решения? Не верю.

Вошел на форум - вижу, Вы сами с собой беседуете... Где начало Вашей беседы и о чем речь - понять трудно. Для отладки программы удобнее вместо Print использовать Alert - тогда сразу на экране появляется. Эти Alert ставятся перед проверкой условия if. Еще есть способ отладки с карандашом - идете по программе, как она должна выполняться, и записываете значения переменных. Изменилась - зачеркиваете старое значение и пишете новое. Так делали раньше. Теперь в редакторе MetaEditor есть отладчик, где можно проследить за значениями переменных. Простейшие конструкции надо проверять отдельно, написав скрипт

 
novichok2018:

Неужели никто не знает решения? Не верю.

попробуйте так:

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
а откуда берет данные iCustom?
 
Igor Makanu:

попробуйте так:

Спасибо, попробовал - не закрывает ни одной позиции даже после некоторой корректировки, чтоб компилятор не ругался.

 
STARIJ:

Вошел на форум - вижу, Вы сами с собой беседуете... Где начало Вашей беседы и о чем речь - понять трудно. Для отладки программы удобнее вместо Print использовать Alert - тогда сразу на экране появляется. Эти Alert ставятся перед проверкой условия if. Еще есть способ отладки с карандашом - идете по программе, как она должна выполняться, и записываете значения переменных. Изменилась - зачеркиваете старое значение и пишете новое. Так делали раньше. Теперь в редакторе MetaEditor есть отладчик, где можно проследить за значениями переменных. Простейшие конструкции надо проверять отдельно, написав скрипт

За рекомендации спасибо, только для моей ситуации они не совсем. Для понимания повторю. ниже код пользовательской функции закрытия позиций

 

, который работает не совсем правильно - закрытие позиций происходит по условиям закрытия первой открытой позиции. То есть, если сначала открыли БАЙ или СЕЛЛ с условием на закрытие 1, а потом открылась вторая такая же позиция, но с условием на закрытие 2, то это условие закрытия игнорируется и вторая позиция, не смотря на другой магик, закрывается тоже по условию 1. 

 Применил break после закрытия ордера, но получилось решение наполовину: только если открываются однотипные позиции. Если же например, сначала открылась СЕЛЛ и ещё не закрылась, а в это время открывается и закрывается БАЙ то СЕЛЛ уже не видит условий для своего закрытия до того момента, как откроется и закроется (по своим условиям) другая СЕЛЛ. И если вдруг опять откроются и закроются БАЙ, то она опять пропускает свои условия закрытия. И как быть?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
а откуда берет данные iCustom?

из буферов пользовательского индикатора, потренируйтесь, к примеру на МА

novichok2018:

 Применил break после закрытия ордера, но получилось решение наполовину: только если открываются однотипные позиции. Если же например, сначала открылась СЕЛЛ и ещё не закрылась, а в это время открывается и закрывается БАЙ то СЕЛЛ уже не видит условий для своего закрытия до того момента, как откроется и закроется (по своим условиям) другая СЕЛЛ. И если вдруг опять откроются и закроются БАЙ, то она опять пропускает свои условия закрытия. И как быть?

попробуйте заменить break на continue

странно, что мой пример кода ничего не закрывает, возможно дело в нормализации цены

 
Igor Makanu:


попробуйте заменить break на continue


Заменил. Ругается ошибкой 138 (реквоты). Потом вернул break, и опять 138. Странно, может я раньше не замечал.

 
Igor Makanu:

из буферов пользовательского индикатора, потренируйтесь, к примеру на МА


Это из того поля что появляется в окне данных терминала?