CustomRatesUpdate + CustomTicksAdd: пропадает M1-история пользовательского символа - страница 2

Alain Verleyen #:

Если они будут воспроизведены, их исправят.

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

Хорошо!
Кажется у проблемы потери исторических данных графика много вариаций.
Буду выкладывать в эту тему рабочие демонстраторы по мере готовности.
ForumGapDemonstrator_Type1_v5.

После обновления графика M1 через ChartSetSymbolPeriod() функция CopyRates() перестаёт возвращать ранее доступную M1-свечу. При этом все исходные тики остаются доступными через CopyTicksRange().

Последовательность эксперимента:
1. Создаётся новый пользовательский символ без предварительной истории.
2. Открывается график M1.
3. Через CustomTicksAdd() добавляются четыре тика в пределах одной минуты — 2024.04.17 12:02:00–12:02:30.
4. Терминал формирует одну M1-свечу.
5. Через CopyRates() подтверждается наличие одной M1-свечи, через CopyTicksRange() — четырёх тиков.
6. Вызывается ChartSetSymbolPeriod(chart, symbol, PERIOD_M1) при уже установленном периоде M1.
7. История повторно проверяется через указанные функции.

Согласно [официальной документации ChartSetSymbolPeriod()](https://www.mql5.com/en/docs/chart_operations/chartsetsymbolperiod), повторный вызов с текущим символом и таймфреймом является допустимым способом обновления графика (Refresh).

Результат после Refresh:
M1-бары / Тики 
PRE_0 — до Refresh 1 / 4
POST_0 — после Refresh 0 / 4
POST_1 — через 5 секунд 0 / 4

Функции чтения истории не сообщают об ошибке (GetLastError() = 0).

Два режима демонстратора

Режим A — с переключением таймфрейма после Refresh
После обнаружения проблемы выполняется дополнительная последовательность M1 → M5 → M1.

Результат:
- CopyRates(M1) возвращает 0.
- CopyTicksRange() возвращает 4 тика.
- После возврата на M1 свеча больше не отображается на графике.

Режим B — без переключения таймфрейма после Refresh
После Refresh график остаётся на M1.

Результат:
- CopyRates(M1) возвращает 0.
- CopyTicksRange() возвращает 4 тика.
- Свеча продолжает отображаться на графике, несмотря на недоступность через CopyRates(), ручное обновление графика в терминале безрезультатно

Documentation on MQL5: ChartSetSymbolPeriod / Chart Operations
Documentation on MQL5: ChartSetSymbolPeriod / Chart Operations
  • www.mql5.com
Changes the symbol and period of the specified chart. The function is asynchronous, i.e. it sends the command and does not wait for its execution...
Файлы:
ForumGapDemonstrator_type2_v10

Исчезновение M1-баров пользовательского символа после обновления графика через ChartSetSymbolPeriod()
После обновления графика перестают возвращаться ранее сформированные минутные бары M1, хотя исходные тики остаются доступными.

== Последовательность воспроизведения:
1. Создаётся новый пользовательский символ без предварительной истории.
2. Открывается его график M1.
3. Через CustomTicksAdd() добавляются 24 тика — по четыре тика в каждую из шести последовательных минут. Терминал формирует шесть M1-баров.
4. График переключается с M1 на M5 через ChartSetSymbolPeriod(). Проверка подтверждает, что все шесть M1-баров сохранились.
5. Повторно вызывается ChartSetSymbolPeriod() **с тем же символом и тем же периодом M5**, то есть инициируется обновление графика.
6. После этого история M1 и тики повторно проверяются. Затем график возвращается на M1.

Согласно [документации ChartSetSymbolPeriod()](https://www.mql5.com/ru/docs/chart_operations/chartsetsymbolperiod), вызов функции с текущими символом и таймфреймом может использоваться для обновления графика, аналогично команде Refresh.

== Фактический результат:
CopyRates(M1)/CopyTicksRange() 
До переключения: 6 / 24
После M1 → M5:   6 / 24 
После Refresh M5 → M5: 0 / 24
Повторная проверка через 5 секунд: 0 / 24
После возврата на M1" 0 / 24

Log:
ForumGapDemonstrator_type2_v10.mq5: START
BUILD terminal=6283 compiler=6283
SETUP symbol=FG_1792927509_0609 chart=26011631516471 prehistory=0 dots=0 extra_ticks=0
CHECK stage=PRE_SWITCH M1=6 ticks=24
EVENT [01] READY: six M1 candles and 24 ticks
EVENT [02] SWITCH M1 -> M5: ChartSetSymbolPeriod
CALL ChartSetSymbolPeriod symbol=FG_1792927509_0609 requested_tf=5 sent=1 error=0
CHECK stage=SWITCH_1 M1=6 ticks=24
EVENT [03] AFTER_SWITCH: M1=6, ticks=24, no loss
EVENT [04] REFRESH M5 -> M5: ChartSetSymbolPeriod (same symbol, same period)
CALL ChartSetSymbolPeriod symbol=FG_1792927509_0609 requested_tf=5 sent=1 error=0
CHECK stage=POST_0 M1=0 ticks=24
CHECK stage=POST_1 M1=0 ticks=24
EVENT [05] AFTER_REFRESH: M1=0,0 ticks=24,24
EVENT [06] RETURN M5 -> M1
CALL ChartSetSymbolPeriod symbol=FG_1792927509_0609 requested_tf=1 sent=1 error=0
CHECK stage=FINAL_M1 M1=0 ticks=24
EVENT [07] RESULT M1_LOST: pre_M1=6 post_M1=0,0 final_M1=0 ticks=24 symbol=FG_1792927509_0609
ForumGapDemonstrator_type2_v10.mq5: END

Документация по MQL5: ChartSetSymbolPeriod / Операции с графиками
Документация по MQL5: ChartSetSymbolPeriod / Операции с графиками
  • www.mql5.com
Меняет значения символа и периода указанного графика. Функция работает асинхронно, то есть отдает команду и не ждет окончания ее выполнения...
Проблема подтверждена и сообщена компании MetaQuotes.