Ошибки, баги, вопросы - страница 307

 
Jager:

При попытке потестировать на usdjpy выдает вот такое сообщение:

 и похоже до бесконеяности, когда дошло до 3000 выключил. Тестирование пытался включить на промежутке 2010.10.01 - 2010.10.10, только цены открытия.

 bild 401

А также не получается запустить другого удаленного агента, вот лог:

 

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

я вроде дождался окончания процесса или перезагружал терминал.

вчера обнаружил интересный момент. после перекомпиляции эксперта, изменения не работают в тестере пока не перезапустишь терминал - вот это жесть!!!

 
Im_hungry:
Полностью поддерживаю - может в сервисдеск?. (по сто раз его закрываю)
а смысл ? все они знают прекрасно...
 

Со вчерашнего дня эксперты начали жить своей цифровой жизнью.

При тестировании выдаёт случайный фокус... То каким то магическим способом пропускает функцию OnInit() то выдаёт ошибку array out of range в функции DeInit().


фишка в том что с одними и теми же параметрами он может запустится и прогнать весь тест, а может и вылететь.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

Вот задача: сделать параметр индикатора динамичным, при закрытии позиции меняем один из параметров индикатора, вот и вся задачка.

Теперь мое решение:

Могу сказать что этот код работает т.к. тестирование показывает другой результат, но непонятно почему работает т.с. через раз, в логе просмотрел - 1 неделю все работает как нужно, потом зацикливается и выдает одни и те же значения в буфер, хотя это невозможно (2 недели одинаковые значения в логе тестера), если не зацикливается то просто пишет ошибку:

сообщение через Alert

Насколько я смог понять, советник при появлении нового бара создаёт хендл некоего индикатора и одновременно требует скопировать буферы этого индикатора. Но при этом не проработана ситуация, при которой для расчёта индикаторных буферов может потребоваться некоторое время. Иными словами, хендл индикатора может быть успешно создан, но индикаторные буферы ещё не рассчитаны.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
Насколько я смог понять, советник при появлении нового бара создаёт хендл некоего индикатора и одновременно требует скопировать буферы этого индикатора. Но при этом не проработана ситуация, при которой для расчёта индикаторных буферов может потребоваться некоторое время. Иными словами, хендл индикатора может быть успешно создан, но индикаторные буферы ещё не рассчитаны.

Да согласен - поэтому попробовал такую конструкцию:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Покась работает! Благодарю за помощь

 

Но время от времени выдает всетаки:

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Да согласен - поэтому попробовал такую конструкцию:

Покась работает! Благодарю за помощь

Такая конструкция пропускает случаи, когда "хендл создан, а индикаторные буферы ещё не рассчитаны". Поскольку сама конструкция вызывается один раз за период, можно ещё попробовать многократное обращение к функциям CopyBuffer(). Т.е. если CopyBuffer()<0, то повторять обращение к функциям, пока позволяет выбранный период (в пределах выбранного периода времени). 
 
Im_hungry:

Но время от времени выдает всетаки:

Ну правильно. У Вас функция proverkaHANDLA() является самостоятельным блоком, который внутри себя однократно обращается к CopyBuffer(). Соответственно,  если буферы не рассчитаны, всегда будет выскакивать алёрт. Пока что Ваша функция proverkaHANDLA() ситуацию "хендл создан, а индикаторные буферы ещё не рассчитаны" не обрабатывает, а игнорирует.

 
Yedelkin:
Такая конструкция пропускает случаи, когда "хендл создан, а индикаторные буферы ещё не рассчитаны". Поскольку сама конструкция вызывается один раз за период, можно ещё попробовать многократное обращение к функциям CopyBuffer(). Т.е. если CopyBuffer()<0, то повторять обращение к функциям, пока позволяет выбранный период (в пределах выбранного периода времени). 

то есть пока CopyBuffer>0 мы его рассчитываем, а новый параметр (Close())

появляются при закрытии позиции. То есть нужно через While зациклить. Выходит так.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Попробуйте почитать в справке про BarsCalculated, там кстати, сразу приводиться нужный пример.
Причина обращения: