Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов - страница 38

 
Alexey Navoykov:

Баг компилятора.  Не выдаётся ошибка при модификации константного объекта:

А можно попросить, поясните пожалуйста почему должна быть ошибка? Ведь массив arr[] не является константой? Разве "костантность" 'a' обязательно должна распространяться и на все члены структуры?

 

Есть индикатор, выдаёт такой результат:


в OnInit() добавляю 

atr_handle=iATR(_Symbol,0,ATR_Period);

Нигде не использую! Только получаю хэндл! Но результат становится такой:


Заметил, что не это фиксировано: один раз нажимаю "Компилировать" - всё возвращается, второй - снова не верно. Оказалось, что

получение хэндла переключает серийность массивов

 Если ПОСЛЕ получения хэндла прописать ArraySetAsSeries - всё работает стабильно.

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

 
Alexey Viktorov:

А можно попросить, поясните пожалуйста почему должна быть ошибка? Ведь массив arr[] не является константой? Разве "костантность" 'a' обязательно должна распространяться и на все члены структуры?

Конечно на все.  Иначе какой смысл константной структуры.
 

Индикатор раньше работал стабильно, а теперь стали появляться ошибки такого содержания

2019.03.25 18:55:39.979 Donchian_Channel_Target (Si-6.19,M1)    %s CopyTime error = %disNewBar4401

Из хэлпа

ERR_HISTORY_NOT_FOUND

4401

Запрашиваемая история не найдена

Индикатор работает только с тем инструментом и ТФ, на котором размещен.

Если нужно, могу сбросить в личку представителям MQ. А впрочем вот код, приводящий к этой ошибке, почему она появляется?

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());

   if(prevBarTime!=tm[0])
     {
      prevBarTime=tm[0];
      return true;
     }
   return false;
  }
 
Aleksey Vyazmikin:

Индикатор раньше работал стабильно, а теперь стали появляться ошибки такого содержания

Из хэлпа

ERR_HISTORY_NOT_FOUND

4401

Запрашиваемая история не найдена

Индикатор работает только с тем инструментом и ТФ, на котором размещен.

Если нужно, могу сбросить в личку представителям MQ. А впрочем вот код, приводящий к этой ошибке, почему она появляется?

Присоединяюсь к вопросу.

То же самое при использовании iBarShift.

Надеюсь, разработчики обращают внимание на эти сообщения.

 
Ilya Baranov:

Присоединяюсь к вопросу.

То же самое при использовании iBarShift.

Надеюсь, разработчики обращают внимание на эти сообщения.

Разработчики тут при чём? Проверять получение данных и обрабатыапть результат запроса лежит на плечах программиста. Нужно просто выйти из OnCalculate() с возвратом нуля.
 
Artyom Trishkin:
Разработчики тут при чём? Проверять получение данных и обрабатыапть результат запроса лежит на плечах программиста. Нужно просто выйти из OnCalculate() с возвратом нуля.

Так почему технически это стало появляться - история то явно имеется.

 
Artyom Trishkin:
Разработчики тут при чём? Проверять получение данных и обрабатыапть результат запроса лежит на плечах программиста. Нужно просто выйти из OnCalculate() с возвратом нуля.

Поведение раньше было другое. Текущий ТФ обрабатывался без проблем (т.е. данные были готовы с текущего ТФ еще до запроса). Это, конечно, не опровергает тот факт, что данные нужно проверять и синхронизировать, однако что-то действительно изменилось. Ну сейчас просто нужно раз в минуту вызывать принудительную подгрузку истории (например CopyTime()) для сохранения данных текущего символа/ТФ, что достаточно странно с учетом того, что мы работаем на графике этого же символа/ТФ. Зачем терминал "забывает" эти данные - не понятно... Возможно оптимизировали что-то.

 
Aleksey Vyazmikin:

Так почему технически это стало появляться - история то явно имеется.

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

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

для индикаторов можно более простой код обнаружения нового бара на текущем ТФ  использовать, примерно так:

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[])
  {
   static datetime LastBarTime = 0;
   if(time[rates_total-1]!=LastBarTime)
   {
      LastBarTime = time[rates_total-1];
      Print("Новый бар !!!");
   }
 
Igor Makanu:

для индикаторов можно более простой код обнаружения нового бара на текущем ТФ  использовать, примерно так:

if( rates_total > prev_calculated )
  {
   // Новый бар. Использовать после того, как обработался первый запуск (prev_calculated > 0)
  }
Причина обращения: