Особенности языка mql4, тонкости и приёмы работы - страница 27

 
Andrey Khatimlianskii:

Индикатор вызывается с неправильным набором параметров

Да, у индикатора довольно много параметров, а есть возможность точно удостоверится, что iCustom заполняет память? Заполнение памяти происходит где-то за 2 часа, значит тестирование пустого iCustom и добавляя по одному параметру затянет на долго. Какие нибудь советы?
П.С. Само собой и пройдусь визуально по всем параметрам.

 
Nauris Zukas:

Да, у индикатора довольно много параметров, а есть возможность точно удостоверится, что iCustom заполняет память?

в логах будет создание множества индикаторов
 
TheXpert:
в логах будет создание множества индикаторов

Да, я знаю о чем вы, такое и в тестере стратегий видел когда много индикаторов после теста появляется. Но здесь в тестере стратегий все отлично работает. А в реале в логах все правильно отображается.

 
Nauris Zukas:

Да, у индикатора довольно много параметров, а есть возможность точно удостоверится, что iCustom заполняет память? Заполнение памяти происходит где-то за 2 часа, значит тестирование пустого iCustom и добавляя по одному параметру затянет на долго. Какие нибудь советы?
П.С. Само собой и пройдусь визуально по всем параметрам.

Оставьте вызов без параметров (тогда они возьмутся умолчательные), и понаблюдайте. Если утечка исчезнет, значит дело именно в этом.

 
Nauris Zukas:

Эксперт жрет память которая понемножку наращивается.

"понемножку" - это сколько?

Может, действительно понемножку, и это - появившаяся с момента запуска история котировок?

 
Andrey Khatimlianskii:

"понемножку" - это сколько?

Может, действительно понемножку, и это - появившаяся с момента запуска история котировок?

Запускаю МТ4 с несколькамы ЕА, включаю запись памяти. Там где стрелка показывает там вылет, происходит "not enough memory for EX4 file".


 
Andrey Khatimlianskii:

Оставьте вызов без параметров (тогда они возьмутся умолчательные), и понаблюдайте. Если утечка исчезнет, значит дело именно в этом.

Ок, сделаю так.

 
Nauris Zukas:

Запускаю МТ4 с несколькамы ЕА, включаю запись памяти. Там где стрелка показывает там вылет, происходит "not enough memory for EX4 file".

40% от скольки используется?

Растет линейно, похоже на кривой вызов индикатора, да.

 
Andrey Khatimlianskii:

40% от скольки используется?

Растет линейно, похоже на кривой вызов индикатора, да.

Похоже что проблема с параметрами. Спасибо!

 

На MT4 возможна такая ситуация (о причинах говорить не будем):

  • Открыты позиции. Баланс равен N.
  • С определенного момента позиции исчезают. Эквити и баланс равны N. В истории торгов о позициях ни слова.
  • Перезагрузки Терминала не помогают.
  • Проходит несколько часов, в истории торгов появляются позиции (закрылись по определенному условию). Баланс и эквити скорректированы сооответствующим образом.

Это очень редкая ситуация, вызванная стечением многих обстоятельств. Но она может возникнуть, пусть и с вероятностью около нуля.

Предлагаю всем боевым роботам в обязательном порядке поместть механизм идентификации таких ситуаций.

Для этого нужно запоминать тикеты открытых ордеров и в случае их исчезновения проверять их наличие в истории торгов. Если нет в истории торгов, Алертим!


Функция такой защиты.

#define TICKET_TYPE int

// Получаем все текущие тикеты.
int GetTickets( TICKET_TYPE &Tickets[] )
{
  int Amount = ArraySize(Tickets);
    
  for (int i = ArrayResize(Tickets, Amount + OrdersTotal()) - Amount - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[Amount++] = OrderTicket();
          
  return(ArrayResize(Tickets, Amount));
}

// Проверяет наличие потерянных тикетов.
int CheckTickets( void )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  int Amount = 0;
  
  if (!IsTester)
  {
    static TICKET_TYPE Tickets[];
    TICKET_TYPE BadTickets[];
    
    for (int i = ArrayResize(BadTickets, ArraySize(Tickets)) - 1; i >= 0; i--)
      if (!OrderSelect(Tickets[i], SELECT_BY_TICKET))
      {
        BadTickets[Amount++] = Tickets[i];
        
        Alert("Ticket " + (string)Tickets[i] + " is not found!");
      }
        
    ArrayResize(BadTickets, Amount);    
  
  #ifdef __MQL5__
    ArraySwap(Tickets, BadTickets);
  #else // __MQL5__
    ArrayFree(Tickets);
    
    ArrayCopy(Tickets, BadTickets);  
  #endif // __MQL5__
      
    GetTickets(Tickets);
  }
      
  return(Amount);
}
Вызывать CheckTickets() в начале OnTick.