Срабатывание в первую секунду

 
Здравствуйте! Столкнулась с тем, что иногда в момент присоединения советника к графику(стоит галка "Разрешить советнику торговать") он тут же срабатывает, хотя условия для срабатывания не выполняются. Потом при удалении этой неверной сделки он больше не выставляет. То есть такое впечатление, что он, не успев сделать нужные рассчеты, делает неправильную сделку. А уже потом начинает нормально считать. Как от этого страховаться, ну кроме того что изначально не разрешать торговать, а ставить эту галку только через несколько секунд после присоединения его к графику...
 

Может он неправильно инициализируется?

Проверте все переменные при объявлении.

 
Zhunko писал(а) >>

Может он неправильно инициализируется?

Проверте все переменные при объявлении.

переменные правильно объявлены.. на тесте все как надо.. да и в реале практически всегда правильно

 
Скорей всего проблема в том, что Вы не инициализируете какую-то переменную.
 
TheXpert писал(а) >>
Скорей всего проблема в том, что Вы не инициализируете какую-то переменную.

что это означает?.. они все объявлены у меня

 
Объявление и инициализация не одно и тоже.
 

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

Совсем недавно столкнулся с похожей проблемой. Эксперт должен быть выставить сделку, если в этот день сделки еще не открывались. В тестере тоже все было ОК, но в реале эксперт почти всегда открывал сделку. Рабочий ТФ эксперта H1, а данные он запрашивал с D1. Я был очень удивлен, когда в переменной NowDay, в которой хранилось начало текущего дня, оказалось значение начала дня за неделю назад.

Проблему решила такая конструкция в init:

   Comment("Подождите, производится запрос исторических данных...");
   int P = 0;
   while(P < 120) 
    {
     NowDay = iTime(Symbol(), PERIOD_D1, 0);
     if (GetLastError() != 4066) break;
     Sleep(1000);
     P++;
    }
   Comment(""); 

По справочнику MQL4 iTime должна возвращать -1, если данные еще не обновлены, но на практике она возвращает последний известный результат. В итоге оказалось, что нужно вне зависимости от того, что возвращает iTime, проверять код ошибки. Подозреваю, что такая проблема получается со всеми массивами-таймсериями - нужно ждать их обновления.

Хотя есть и другой, непрограммный, способ решения - попереключаться между ТФ, с которых будет производится получение данных. Таким образом, они обновятся.

 
TheXpert писал(а) >>
Скорей всего проблема в том, что Вы не инициализируете какую-то переменную.

Да.. вы были правы))

 
Scriptong писал(а) >>

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

Совсем недавно столкнулся с похожей проблемой. Эксперт должен быть выставить сделку, если в этот день сделки еще не открывались. В тестере тоже все было ОК, но в реале эксперт почти всегда открывал сделку. Рабочий ТФ эксперта H1, а данные он запрашивал с D1. Я был очень удивлен, когда в переменной NowDay, в которой хранилось начало текущего дня, оказалось значение начала дня за неделю назад.

Проблему решила такая конструкция в init:

По справочнику MQL4 iTime должна возвращать -1, если данные еще не обновлены, но на практике она возвращает последний известный результат. В итоге оказалось, что нужно вне зависимости от того, что возвращает iTime, проверять код ошибки. Подозреваю, что такая проблема получается со всеми массивами-таймсериями - нужно ждать их обновления.

Хотя есть и другой, непрограммный, способ решения - попереключаться между ТФ, с которых будет производится получение данных. Таким образом, они обновятся.

Есть такой грех. Давно заметил. Небольшая пауза помогает.

 
Scriptong писал(а) >>

По справочнику MQL4 iTime должна возвращать -1, если данные еще не обновлены, но на практике она возвращает последний известный результат. В итоге оказалось, что нужно вне зависимости от того, что возвращает iTime, проверять код ошибки. Подозреваю, что такая проблема получается со всеми массивами-таймсериями - нужно ждать их обновления.

Нет этого в справочнике. Зато есть:

"Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries())."

 
stringo >>:

Нет этого в справочнике. Зато есть:

"Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries())."

Пардон, не -1, а 0:

Возвращает значение времени открытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Речь идет о доступе к текущему графику (то есть график открыт), но другому его таймфрейму. Для меня остается непонятным - почему при ошибке iTime возвращает ненулевое значение? Вот и все.

Причина обращения: