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

 

После сегодняшнего множественного апдейта иногда вот такая ошибка проскакивала, сфоткал её:




 
Загрузил в МТ4 котировки фьючерса, старая история сильно битая с пропусками баров. 
Сейчас столкнулся с такой проблемой - МТ4 'не видит' некоторые соседние бары в Тестере.
Именно некоторые, т.к. в других ситуациях пропуски баров проблемой не является.

В самом начале после start() вывожу строки:
Print("");
Print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
Print("Time[0] = ", Time[0] );
Print("Time[1] = ", Time[1] );
Print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");



Bar[1] - Время 23:49:







Bar[0] следующий за Bar[1] - Время 10:30:



Но в лог-файле Тестера они как соседние бары отсутствуют:

EURUSD,M1: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
EURUSD,M1: Time[1] = 2009.09.01 23:46:00
EURUSD,M1: Time[0] = 2009.09.01 23:49:00
EURUSD,M1: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

EURUSD,M1: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
EURUSD,M1: Time[1] = 2009.09.02 10:30:00
EURUSD,M1: Time[0] = 2009.09.02 10:31:00
EURUSD,M1: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



Т.е. отсутствует случай когда Бар 10:30 следует за Баром 23:49 (что в результате приводит к проблемам в работе).
С чем это может быть связано? (похоже на баг)

Файлы:
 

Правильно ли я понимаю, что спецификатор delete нет смысла использовать, если может быть использована ссылка/указатель на базовый класс? Или в таких случаях необходимо закрытое наследование? Как принято поступать?

class Base
  {
public:
   void method() { Print(__FUNCSIG__); }
  };

class Foo : public Base
  {
   void method() = delete;
  };

void OnStart()
  {
   Foo foo;
   f(foo);
  }

void f(Base &b)
  {
   b.method();
  }
 
Vladislav Boyko #:
Или в таких случаях необходимо закрытое наследование?

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

class Base
  {
public:
   void method() { Print(__FUNCSIG__); }
   void method2() { Print(__FUNCSIG__); }
  };

class Foo : private Base
  {
   void method() = delete;
public:
   void method2() { Base::method2(); }
  };

void OnStart()
  {
   Foo foo;
   foo.method2();
  }

В общем, не до конца понимаю логику использования delete в этом контексте.

Умные дядьки предлагают для "чистого кода" наследоваться, вместо того, чтобы править существующий оттестированный код. Ага, легко сказать.

Хотя, вероятно, я просто изначально наплужил с архитектурой.
 
При активной загрузке исторических данных, когда в таймере вызывается CopyRates (), крайне нестабильно ведёт себя iBarShift и даже iBars. Выдаётчасто-1 на тех участках, где данные уже загружены. Решается только вычислением номера бара собственными силами, когда в памяти приходится держать свой массив времени открытия баров.
Написать воспроизводящий проблему код могу, если будет запрос со стороны.  разработчиков.  Проблема очень старая, которая не решается много лет. 
Раньше решал своими функциями ( fBarShift), в которых использовалась функция iBars. Но и она теперь глючит.
 
Nikolai Semko #:
При активной загрузке исторических данных, когда в таймере вызывается CopyRates (), крайне нестабильно ведёт себя iBarShift и даже iBars. Выдаётчасто-1 на тех участках, где данные уже загружены. Решается только вычислением номера бара собственными силами, когда в памяти приходится держать свой массив времени открытия баров.
Написать воспроизводящий проблему код могу, если будет запрос со стороны.  разработчиков.  Проблема очень старая, которая не решается много лет. 
Раньше решал своими функциями ( fBarShift), в которых использовалась функция iBars. Но и она теперь глючит.

ИМХО, iBarShift не место в пятерке, как и другим iXXX. От буфферизации таймсерий отказались (которая была в четверке), но продолжаем писать, делая вид, как будто буфферизация есть.

Nikolai Semko #:
Решается только вычислением номера бара собственными силами, когда в памяти приходится держать свой массив времени открытия баров.

Единственное правильное решение, ИМХО.

 
Vladislav Boyko #:

ИМХО, iBarShift не место в пятерке, как и другим iXXX. От буфферизации таймсерий отказались (которая была в четверке), но продолжаем писать, делая вид, как будто буфферизация есть.

Единственное правильное решение, ИМХО.

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

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

 
Vladislav Boyko #:
От буфферизации таймсерий отказались (которая была в четверке)

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

Новая версия платформы MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5

Renat Fatkhullin, 2023.03.08 16:41

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

Преставьте себе, что перед вызовом OnTick происходит CopyRates всей истории в фоновой буфер робота. Конечно, с массой трюков для ускорения. В любом случае, это затратно по памяти и достаточно дорого. Обновление буфера добавляет латенси у реакции на OnTick.

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

Причем учтите, то копируется только текущий чарт, что позволяет достаточно быстро работать iOpen/iHigh/iLow/iClose функциям на своем чарте. А вот доступ к другим таймфреймам и символам уже через Copy семантику, что выливается в синхронизированный доступ к базе истории как в пятерке.


Пятерка в этом отношении более честна и экономна:

  1. Нет фоновых буферов и фоновой работы вне пределов MQL5
  2. Экономнее расход памяти
  3. Никто не добавляет задержек при реакции на OnTick
Так как пятерка имеет на порядок больше данных, то попытка делать и обновлять фоновые буферы просто убила бы систему.
 
lynxntech #:
для быстрого и без поддержания активности на других рабочих периодах, можно использовать индикатор шпион

Точно не знаю, о каком шпионе вы говорите, но для поддержания активности графика достаточно и холостого запроса

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

Новая версия платформы MetaTrader 5 build 3620: улучшения веб-терминала, поддержка ONNX и ускоренное умножение матриц в MQL5

Renat Fatkhullin, 2023.03.08 19:00

Тогда с каждым тиком буду запрашивать 1 элемент графика. Для того, чтобы терминал продолжал обновлять этот график. Это позволит всегда получать данные без лишних задержек и приключений. Наверное...😄

(речь идет о "чужом" графике)

Если хотите поддерживать активность таймфрейма, то холостой запрос данных это обеспечит.

 
Vladislav Boyko #:

Точно не знаю, о каком шпионе вы говорите, но для поддержания активности графика достаточно и холостого запроса

в поиске есть, 

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

найти через поиск можно