Новая версия платформы MetaTrader 5 build 5800: Улучшенный торговый диалог и удобная работа с CSV в MetaEditor - страница 5

 
Stanislav Korotky #:

Красным - никогда так не было.

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[])
{
   //сдвиг
   ArrayCopy(buff, buff, 0, 1, rates_total-1);
   
   //вставка последнего значения
   buff[rates_total-1] = SymbolInfoDouble(_Symbol, SYMBOL_BID);
 

   return(rates_total);
}
Жёлтым выделил крайний индекс, по идее уже аллоцированного на +1 буфера в момент нового бара, куда кладётся актуальное значение!
Почему система этого не понимает?
Потому, что ошибка в поведении к которой вы приспособились!
И выдаёте это, что так было всегда. НЕТ не было так всегда, это появилось несколько лет назад, и все схавали.
 
Aleksandr Slavskii #:
У него не в этом проблема. Он просто не видит, что при увеличении индикаторного буфера происходит сдвиг не на один элемент, а на два.
А вот собственно, почему на два элемента сдвиг, вас не смущает такое поведение?
И вы это считаете нормальным? Просто приспособились к кривизне.
 
Roman #:
А вот собственно, почему на два элемента сдвиг, вас не смущает такое поведение?
И вы это считаете нормальным? Просто приспособились к кривизне.
Потому, что на один элемент сдвигает Ваш код при каждом тике. Но при новом баре МТ сам сдвигает на количество добавленных баров (обычно добавляется 1 бар).
 
Sergey Gridnev #:
Потому, что на один элемент сдвигает Ваш код при каждом тике. Но при новом баре МТ сам сдвигает на количество добавленных баров (обычно добавляется 1 бар).

Я вижу полное непонимание проблемы индикаторного буфера.

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

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[])
{
   //вставка последнего значения
   buff[rates_total-1] = SymbolInfoDouble(_Symbol, SYMBOL_BID);
 

   return(rates_total);
}
 
Roman #:
Запустите тогда в таком виде, может дойдёт, что на первом запуске ничего не будет отрисовываться.
Значения в левом верхнем углу подокна изменяются, а отрисовки нет.
Начнёт отрисовываться только с приходом нового бара.
Чтобы нарисовать линию нужно 2 точки. Одной мало. Попробуйте стрелку вместо линии.
 
Vladislav Boyko #:
Чтобы нарисовать линию нужно 2 точки. Одной мало. Попробуйте стрелку вместо линии.
Первая точка, присваиваем значение переданное в буфер в момент старта, вторая точка - последующие изменения значения.
В чём сложность такой реализации? Вроде профессионалы, а на таком пустяке спотыкаетесь.
Ведь раньше не было таких проблем, не со сдвигом буфера, не с начальной отрисовкой.
 
Комментарии, не относящиеся к этой теме, были перенесены в "Как по Вашему, какой ИИ лучше для кодинга на MQL4/5? (Можно выбрать несколько)".
 

У меня ещё возникла проблема в индикаторе.

На этот раз с MapViewOfFile из kernel32.dll

Суть проблемы: на первом запуске терминала и первом запуске индикатора, 
именованный MapViewOfFile отрабатывает корректно и возвращает указатель ранее созданного файла на память.
После удаления индикатора, файл на память закрываю корректно, а переменные заNULLяются.
Но после повторного запуска индикатора возникает ошибка из 
kernel32::GetLastError():

MapViewOfFile: ошибка получения указателя на первый элемент памяти Local\File_: 5

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

Кому из MQ разработчиков можно скинуть код, для воспроизведения ошибки ?

 
Roman #:
Жёлтым выделил крайний индекс, по идее уже аллоцированного на +1 буфера в момент нового бара, куда кладётся актуальное значение!
Почему система этого не понимает?
Потому, что ошибка в поведении к которой вы приспособились!
И выдаёте это, что так было всегда. НЕТ не было так всегда, это появилось несколько лет назад, и все схавали.

Желтым ваше выделенное срабатывает уже ПОСЛЕ того, как лишний вызов ArrayCopy сдвинул ВЕСЬ индикаторный буфер вместе с пустым новым элементом влево. Вы кладете значение в последний элемент, но строкой выше он был еще пустой и эта пустота скопирована в 1-й бар. Чего не понятно?

Всегда так работало в МТ5. Прям удивительно такие стандартные вещи объяснять.

 
Stanislav Korotky #:

Желтым ваше выделенное срабатывает уже ПОСЛЕ того, как лишний вызов ArrayCopy сдвинул ВЕСЬ индикаторный буфер вместе с пустым новым элементом влево. Вы кладете значение в последний элемент, но строкой выше он был еще пустой и эта пустота скопирована в 1-й бар. Чего не понятно?

Всегда так работало в МТ5. Прям удивительно такие стандартные вещи объяснять.

Да, в текущей реализации со сдвигом значений в ArrayCopy получается так как вы пишите. В понимании этого момента вопросов нет.

Как объясните тогда поведение без ArrayCopy ?
Когда отрисовка начинается только с приходом нового бара.
При этом значения в углу подокна изменяются.
Это же всё взаимосвязано, первая отрисовка и сдвиг буфера.
То есть первая отрисовка в текущей реализации
buff[rates_total-1] = SymbolInfoDouble(_Symbol, SYMBOL_BID);
будет только с приходом нового бара, возможно это и есть некорректный лаг буферного сдвига! 
Повторюсь, раньше же как то без пропусков всё отрисовывалось и начинало рисовать с момента старта, а не с приходом бара.
Это некорректное изменение появилось давно, просто не писал об этом.
Бета-версия платформы MetaTrader 5 build 5770: Расширение OpenBLAS и удобная работа с CSV в MetaEditor
Бета-версия платформы MetaTrader 5 build 5770: Расширение OpenBLAS и удобная работа с CSV в MetaEditor
  • 2026.04.15
  • www.mql5.com
В четверг 9 апреля 2026 года будет выпущена обновленная версия платформы MetaTrader 5 в бета-режиме...