Скачать MetaTrader 5

Советник переодически не обновляет значения индикаторов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зачем продавать продукты в MetaTrader AppStore? Узнай из статьи!
gambit10
58
gambit10 2016.07.07 16:31 

Добрый день!

Возникла такая проблемка. Написал советника с помощью мастера MQL5(работает по сформированным свечам), казалось бы все работает, и заявки выставляет и трейлинг работает. Но время от времени эксперт не обновляет значения индикаторов, что нарушает всю логику работы. Не смотря на открытие нового бара он использует значения сформированные не для предыдущей закрытой свечи, а предшествующих ей свечей, причем в тестере такого поведения не наблюдается.

Приведу пример(на скрине).

В 17:05 открылась новая свеча и эксперт вывел в журнал значение MA, оно равно = 325.23853404 (если округлять то получаем 325.239). Как видно это значение со свечи открывшейся в 16:55, а должно быть с 17:00.

Так же в журнал выводится значение переменной m_last_tick_time, что говорит о том что последний тик был в 17:05:00. В журнале так же видно значение вызова Time(1), в котором как раз тоже наблюдается устаревшее значение времени 16:55.

 

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

 

Аккаунт НЕ демо. Торговля ведется на фондовой секции московской биржи. 

Файлы:
7tj9yf.PNG 103 kb
-Aleks-
7016
-Aleks- 2016.07.08 00:46  

Вы бы код показали...

Предположу, что при открытии свечи берется значение МА на текущем баре без сдвига - цена гуляет и индикатор пересчитывается - всё верно.

gambit10
58
gambit10 2016.07.08 11:53  
-Aleks-:

Вы бы код показали...

Предположу, что при открытии свечи берется значение МА на текущем баре без сдвига - цена гуляет и индикатор пересчитывается - всё верно.

Советник писался на основе статьи размещенной на этом сайте. Работает по пересечению двух скользящих средних. Насколько я могу судить берется все же значение не текущего бара, а уже сформированного.

К статье пилагаю код сигнального модуля и непосредственно самого эксперта. Так же вот непосредственно код метода LongCondition и методов для доступа к значениям скользящих средних:

   double            FastMA(const int index)             const { return(m_fast_ma.GetData(0,index)); }
   double            SlowMA(const int index)             const { return(m_slow_ma.GetData(0,index)); }

 

int MA_Cross::LongCondition()
  {
   int signal=0;
//--- для режима работы по тикам idx=0, в режиме работы по сформировавшимся барам idx=1
   int idx=StartIndex();
//--- значения средних на последнем сформировавшемся баре
   double last_fast_value=FastMA(idx);
   double last_slow_value=SlowMA(idx);
//--- значения средних на предпоследнем сформировавшемся баре
   double prev_fast_value=FastMA(idx+1);
   double prev_slow_value=SlowMA(idx+1);
   printf("LongCondition MA = %s", DoubleToString(last_fast_value));
//--- если быстрая скользящая пробила снизу вверх медленную на последних двух закрытых барах
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=m_pattern_0; // сигнал на покупку есть
      m_base_price=m_symbol.NormalizePrice(last_fast_value);
     }
//--- вернем значение сигнала
   return(signal);
  }
gambit10
58
gambit10 2016.07.12 15:35  

Выяснил еще один любопытный момент. Ранее я написал что в тестере все работает нормально, но это оказалось не совсем так. Советник работает нормально во всех режимах генерации тиков, кроме "Каждый тик на основе реальных тиков". Складывается ощущение что проблема в поступающих данных.

Брокер БКС.

gambit10
58
gambit10 2016.07.19 15:29  

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

Вот что ответили в сервисдеске:

Бары биржевых инструментов строятся исключительно по цене last. Если есть ненулевой бид и/или ненулевой аск, но при этом нулевой ласт, то эти цены не участвуют в формировании бара. То есть, тики есть, а бара нет.

При любых других режимах (кроме генерации на основе реальных тиков) цена ласт заведомо ненулевая, это такая особенность тестера. То есть, есть тики - бар формируется по-любому

 Таким образом нужно отфильтровать тики которые возникают не в результате изменения цены last. Для себя решил проблему добавлением следующего кода в метод CExpert::Refresh:

   if((m_symbol.Frags()&TICK_FLAG_LAST)==0)
      return(false);

 Вроде работает.

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