Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д. - страница 5

 
Renat Fatkhullin:

Покажите, пожалуйста, эталонный код индикатора, который все время хранит актуальные последние 2000 тиков каждого символа из Обзора рынка.

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

 
Renat Fatkhullin:

Надо смотреть код.

Вот в коде выше явно букет логических и ресурсных проблем.

Делаю примерно так, подскажите пожалуйста, как и что подправить если требуется:

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate (const int       rates_total,
                 const int       prev_calculated,
                 const datetime &time        [],
                 const double   &open        [],
                 const double   &high        [],
                 const double   &low         [],
                 const double   &close       [],
                 const long     &tick_volume [],
                 const long     &volume      [],
                 const int      &spread      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Надо смотреть код.

Вот в коде выше явно букет логических и ресурсных проблем.

В этом коде логические проблемы, или Я что-то упустил?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.

Stanislav Dray, 2018.11.14 16:28

Странные у вас отношения к баг-рапортам. Мне как бы деньги не платят, чтоб я что-то доказывал. Я как мог расписал ситуацию.

Проблема не только у меня, проблема появилась после вашего 30-го обновления, но всё равно вы намекаете что я мол сам дурак и вовсём виноваты какие-то тормознутые индикаторы.

А до этого они целый год не были тормознутые ?

Вот пример кода который завис спустя 25 минут после запуска на М30:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Надо писать индикатор с четким осознанием, что сразу вы все не получите.

В OnInit вы должны простимулировать загрузку истории нужных инструментов одиночными вызовами CopyXXX, а вот дожидаться надо полной инициализации в OnCalculate.

У вас же фаза инициализации с ошибкой по всей видимости - вы неправильно дожидаетесь данных и блокируетесь.

Попробую так сделать,

сейчас я делаю запросы в OnCalculate и там жду (не каждый тик конечно же а только первый раз при расчёте).

 
fxsaber:

Покажите, пожалуйста, эталонный код индикатора, который все время хранит актуальные последние 2000 тиков каждого символа из Обзора рынка.

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

Присоединяюсь! лучше даже не тики а бары.

Нужен пример Одобренного Истинного Мультивалютного Кода.

Иначе так и будем в потёмках...

 

Попробую локализовать ошибку, и отпишусь по мере нахождения

 
transcendreamer:

Присоединяюсь! лучше даже не тики а бары.

Нужен пример Одобренного Истинного Мультивалютного Кода.

Иначе так и будем в потёмках...

бары и тики - разные эпостаси живущие в МТ5 независимо. нужны обе.
 
Vladimir Karputov:

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

Уже хотел плюнуть на все, что тут твориться, но к сожалению, на продукт MQ, было мной потрачено около 10 лет. 

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

Честно я хотел, чтобы проблема была бы только в моих кривых руках, но нет проблема не только в них. Ниже будет скрин, предвосхищая странные объяснения со стороны технической поддержки, мол не правильно написанный код и 100500 других индикаторов и что вы хотите, будут проблемы. Нету никаких 100500 индикаторов кроме одного тестируемого, нету ни одного эксперта, в терминале открыто всего два инструмента, тест индикатора осуществляется на паре EURUSD 1M, данные индикатор подгружает с таймфрема М15 этого же инструмента, т.е. я не пытаюсь загрузить данные других инструментов, в обзоре рынка их всего несколько.

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

В индикаторе вызов функции iClose и iBars осуществляется только для отражения состояния в Commet(). В обзоре рынка время на момент создание скрина, в окне терминала текущее состояние вызова функций  iClose и iBars, далее в расчетной части индикатора используется функции  CopyXXXX. 

БАГ

Как видите индикатор был перезагружен в 16:31 и работал успешно(я даже уже было обрадовался), но обновление данных iClose прекратилась после 00:15, соответственно и функция CopyXXXX так же возвращает не обновленные данные, т.е. ошибка возникает где-то в недрах МТ.

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

 

Тоже решил вчера протестировать код от Станислава. Через несколько часов обновление времени прекратилось. Переключать таймфреймы не стал, а просто сделал обновление через контекстное меню графика и время пошло дальше.

Сегодня немного модифицировал код чтобы смотреть время и текущего ТФ.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

И буквально минут через 15 обновление на "не родном" ТФ прекратилось, а на текущем нормально обновлялось. После обновления графика, время опять пошло.

Терминал работает в портативном режиме. Система и сам терминал стоят на SSD диске.


 

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

Т.к. в каком то лахматом году, MQL5 был на столько не идеален (не оптимизирован), что работал без проблем, да он наверное поглощал много ресурсов, но он давал ожидаемый результат, а не то что сейчас, рулетка - либо повезет, либо нет.

Данная проблема, к примеру меня как разработчика коммерческих продуктов под MQL5, будет характеризовать не очень с хорошей стороны и в двойне это будет не приятно, если человек оплатит продукт приобретенный в маркете, а он просто будет глючным из-за подобных "БАГОВ".

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