Ищу решение, как обойти проблему, которую создает зачем-то принудительная сортировка по тикетам истории ордеров после каждого обновления истории торговли.
И тут такой БАГ!
Два одинаковых тикета в истории. Чтобы исключить GUI-ошибку, запускаю скрипт вывода последних тиков.
2283119237 != 2283119327
true
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Nikolai Semko, 2022.12.21 16:48
На самом деле проблема существует. Пока не могу понять источник.
Проблема в том, что в данном индикаторе, если использовать штатный iBarShift, то prev_calculated постоянно обнуляется, хотя это должно происходить только при первом запуске.
Если использовать мой старый вариант fBarShift, то обнуления prev_calculated не происходит.
Пока не могу понять, почему так происходит. Возможно Лилита права и что-то реально поломалось.
Тем более я уже не однократно замечал какие-то странные мигания (перерисовывания) индикаторов в последнее время. Думаю, реально что-то поломали, но вряд ли проблема с iBarShift. Проблема сидит где-то в другом месте MT5.
Просьба обратить внимание разработчиков на проблему. Давно замечал странные перерисовывания индикаторов. Возможная проблема в спонтанном обнулении prev_calculated при выполнении некоторых функций.
Давно обращал внимание на мигание, например, уровневых индикаторов. Мигает до тех пор, пока не загрузятся все бары на графике. Возможное решение - не давать рисовать линии, пока всё не загрузится, но тогда некоторые будут думать, что индикатор не работает. Тогда конечно можно выводить надпись "Loading". И всё же, решение на уровне терминала было бы логичнее. А также скорость перерисовки линий/прямоугольников с привязкой к X/Y тоже происходит с некоторым дёрганьем.
Итог, МТ5 затачивается под автоторговлю, но под работу с индикаторами пока что быстрее МТ4, хоть и не без изъянов. Да, да, всё понимаю, 21 век на дворе, все трейдеры уже в МТ5... но не точно
Просьба обратить внимание разработчиков на проблему. Давно замечал странные перерисовывания индикаторов. Возможная проблема в спонтанном обнулении prev_calculated при выполнении некоторых функций.
Ой, нет, прошу прощения.
Поспешил, не углубился в код другого разработчика.
там у нее в OnCalculate в трех местах стоит return(0)
Ой, нет, прошу прощения.
Поспешил, не углубился в код другого разработчика.
там у нее в OnCalculate в трех местах стоит return(0)
но все равно проблема существует.
Почему в данном индикаторе стандартный iBarShift(NULL,_Period,time[rates_total-1]) возвращает -1, тогда как моя функция fBarShift возвращает 0, как и должно быть?
В другом индикаторе пока не могу это воспроизвести.
2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1) PERIOD_H2 / BarShift: -1 2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1) iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1 2022.12.21 14:08:21.545 ATRCustom (USDCHF,H1) fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0 2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1) PERIOD_H2 / BarShift: -1 2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1) iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1 2022.12.21 14:08:24.049 ATRCustom (USDCHF,H1) fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0 2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1) PERIOD_H2 / BarShift: -1 2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1) iBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = -1 2022.12.21 14:08:24.157 ATRCustom (USDCHF,H1) fBarShift(_Symbol,CustomPeriodTimeframe,time[rates_total-1]) = 0
но все равно проблема существует.
Почему в данном индикаторе стандартный iBarShift(NULL,_Period,time[rates_total-1]) возвращает -1, тогда как моя функция fBarShift возвращает 0, как и должно быть?
В другом индикаторе пока не могу это воспроизвести.
Да - это явный баг.
Если запустить такой индикатор:
#property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 int OnInit() { return(INIT_SUCCEEDED); } 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[]) { int shift = iBarShift(NULL,PERIOD_H2,time[rates_total-1]); Print("BarShift = " + string(shift)); return(rates_total); }
то будет выводить:
2022.12.21 21:00:57.331 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:00:59.344 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:01:01.231 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:01:02.760 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:01:02.922 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:01:07.069 Bug_iBarShift (EURUSD,M1) BarShift = 0 2022.12.21 21:01:10.444 Bug_iBarShift (EURUSD,M1) BarShift = 0
как и должно быть.
Но если в этом же окне или же в другом окне с тем же символом и ТФ запусть индикатор ATRCustom (см. выше), то каждый тик уже выдает следующее:
2022.12.21 21:07:13.386 Bug_iBarShift (EURUSD,M1) BarShift = -1 2022.12.21 21:07:13.673 Bug_iBarShift (EURUSD,M1) BarShift = -1 2022.12.21 21:07:19.722 Bug_iBarShift (EURUSD,M1) BarShift = -1 2022.12.21 21:07:20.827 Bug_iBarShift (EURUSD,M1) BarShift = -1
думаю проблема такая будет не только с iBarShift. Проблема более глубокая.
Причем не важно - indicator_separate_window или indicator_chart_window
Уважаемые разработчики, обратите внимание на путаницу с шаблонными типами (b3552):
class A {}; template <typename T> class X {}; template <typename T> void fun1(X<T*> & p) { Print(__FUNCSIG__); // void fun1<A*>(X<A*>&) T* tmp = NULL; //tmp = (T*)NULL; // при компиляции этой строки ошибка: //'*' - pointer to pointer is illegal // in template 'void fun1(X<T*>&)' specified with [T=A*] } void OnStart() { X<A*> a; fun1(a); }
При вызове fun1() c аргументом типа X<A*> ожидался тип шаблона T=A;
но, судя по результату FUNCSIG и ошибке компилятора к строке "tmp = (T*)NULL;", фактический T=A*.
При этом почему-то T* tmp=NULL компилируется без ошибок.
В системной либе есть такой метод в классе HashMap:
//+------------------------------------------------------------------+ //| Copies a range of elements from the map to a compatible | //| one-dimensional array. | //+------------------------------------------------------------------+ template<typename TKey,typename TValue> int CHashMap::CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0) { //--- resize array if(dst_start+m_count>ArraySize(dst_array)) ArrayResize(dst_array,dst_start+m_count);
Мне кажется он должен выглядеть вот так:
//+------------------------------------------------------------------+ //| Copies a range of elements from the map to a compatible | //| one-dimensional array. | //+------------------------------------------------------------------+ template<typename TKey,typename TValue> int CHashMap::CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0) { //--- resize array if(dst_start+m_count-m_free_count>ArraySize(dst_array)) ArrayResize(dst_array,dst_start+m_count-m_free_count);
В противном случае, если были вызовы метода Remove, метод CopyTo выдает массив большего размера, чем метод Count()

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В пятницу 16 декабря 2022 года будет выпущена обновленная версия платформы MetaTrader 5. Обновление содержит следующие изменения:
MetaTrader 5 Client Terminal build 3550
MetaTrader 5 Web Terminal build 3550
Обновление будет доступно через систему Live Update.