![Оффлайновые графики и новый MQL4](https://c.mql5.com/i/articles/overlay.png)
Оффлайновые графики и новый MQL4
В новом MQL4 изменился формат хранения исторических данных и появилась соответствующая структура MqlRates для удобного хранения значений Time, Open, Low, High, Close и Volume. За многие годы трейдеры написали на MQL4 свои программы, которые собирают и записывают собственные данные в HST-файлы для создания оффлайновых графиков. Каждый трейдер может быть уверен - все ранее скомпилированные EX4-файлы будут работать в новом терминале MetaTrader 4 так же, как и раньше.
Все старые EX4-программы работают в новом терминале MetaTrader 4
Как уже было сказано, при обновлении терминала с предыдущей версии на новую ни один пользовательский исполняемый EX4-файл, скомпилированный старым компилятором, не будет удален или подвержен каким-либо изменениям. Это значит, что все ваши наработанные программы, которые не входят в стандартную поставку терминала, будут автоматически скопированы в новое место хранения и будут по-прежнему доступны для запуска в терминале.
Оффлайновые графики в терминале MetaTrader 4
В стандартной поставке новой версии клиентского терминала идет обновленный скрипт PeriodConverter, который создает HST-файлы в новом формате. Но если у вас есть собственные программы, написанные на основе старого скрипта period_converter, скомпилированные предыдущей версией компилятора, то они будут работать как и прежде.
Например, у нас есть в скомпилированном виде некий скрипт period_converter_509.ex4, созданный еще старой версией. При обновлении он автоматически был скопирован в новое место хранения и также доступен в терминале для запуска из Навигатора. Набрасываем его на график EURUSD M1 для создания собственной истории EURUSD M2.
По умолчанию указан множитель 3, выставляем его равным 2. И обязательно ставим запускаемому скрипту разрешение на вызов DLL для возможности управления автономным графиком EURUSD M2, который мы откроем после формирования соответствующей для него истории.
Как только скрипт сообщил в журнал "Эксперты" о формировании файла с данными, идем в меню "Файл - Открыть автономно" и находим строку EURUSD M2. Эти данные подготовлены нашим скриптом.
После открытия автономного графика наш скрипт, который по-прежнему работает на EURUSD M1 и продолжает преобразовывать вновь поступающие в режиме реального времени тики, определяет, что открыт автономный график с указанным таймфреймом, и начинает с периодичностью раз в две секунды посылать ему команды на обновление.
Попробуйте сами проделать все описанные действия: скачайте приложенный исполняемый period_converter_509.ex4 и положите его в папку <каталог данных>\MQL4\Scripts.
Обновление старого скрипта для нового компилятора
Рано или поздно вам может понадобиться изменить исходный код своей программы и скомпилировать его в новом редакторе MetaEditor. На примере данного скрипта period_converter_509 покажем, как двумя небольшими правками учесть изменения в языке MQL4. Мы можем, конечно, скомпилировать исходный код period_conveter_509.mq4 в том виде как есть, без изменений, и он будет работать. Но лучше учесть изменения в языке и внести в код небольшие правки.
Режим совместного доступа при открытии файла нужно указывать явно
Следует иметь в виду, что в старом MQL4 все файлы открывались в режиме совместного использования. В новом MQL4 при открытии файлов необходимо явно указывать флаги FILE_SHARE_WRITE и FILE_SHARE_READ для совместного использования. В случае их отсутствия файл будет открыт в монопольном режиме, что не позволит больше никому его открывать, пока он не будет закрыт монополистом. А нам как раз и требуется создаваемый скриптом файл исторических данных открыть в терминале MetaTrader 4 в виде автономного графика. Поэтому просто добавляем эти два флага в вызов функции FileOpenHistory():
// 1-st change - add share flags ExtHandle=FileOpenHistory(c_symbol+i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);
FileFlush() теперь записанные данные сбрасывает на диск немедленно
В старом скрипте излишне часто используется функция FileFlush(). Совершенно не обязательно при первоначальном создании файла вызывать ее после каждой записи данных бара. Достаточно это сделать в самом конце, когда будут записаны все подготовленные данные нестандартного символа и/или таймфрейма. Дело в том, что в новой версии языка MQL4 реализация функции FileFlush() была изменена с целью моментального сброса данных на физический диск. В старой версии использовалась отложенная запись данных, и многократные вызовы не приводили к замедлению работы скрипта.
last_fpos=FileTell(ExtHandle); last_volume=Volume[i]; //--- запись данных сформированного бара FileWriteInteger(ExtHandle, i_time, LONG_VALUE); FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE); // 2-nd change - remove FileFlush from here //FileFlush(ExtHandle);
Получившийся после этих двух правок файл сохраним как period_converter_580.mq4 и скомпилируем. Вы можете его скачать из приложенных к статье файлов. Открываем еще один график EURUSD M1 и запускаем скрипт с параметром 3 для создания трехминутного нестандартного графика EURUSD.
После создания файла данных открываем его как автономный график EURUSD M3.
Как и ожидалось, запущенный скрипт period_converter_580 после открытия этого графика обнаружил его и вывел сообщение в журнал. В дальнейшем он точно также будет посылать автономному графику команду на обновление не чаще, чем один раз в 2 секунды.
Новый скрипт PeriodConverter
В стандартной поставке новой версии клиентского терминала MetaTrader 4 также идет скрипт PeriodConverter, который выполняет те же задачи, что и его предшественник. Но он имеет небольшие отличия, так как написан в новом стиле оформления исходного кода и использует новые возможности языка MQL4.
Самое главное отличие от предыдущей версии - это использование новой структуры MqlRates, предназначенной для работы с данными ценового бара в новом формате:
if(time0>=rate.time+periodseconds || i==0) { if(i==0 && time0<rate.time+periodseconds) { rate.tick_volume+=(long)Volume[0]; if(rate.low>Low[0]) rate.low=Low[0]; if(rate.high<High[0]) rate.high=High[0]; rate.close=Close[0]; } last_fpos=FileTell(ExtHandle); last_volume=(long)Volume[i]; FileWriteStruct(ExtHandle,rate); cnt++; if(time0>=rate.time+periodseconds) { rate.time=time0/periodseconds; rate.time*=periodseconds; rate.open=Open[i]; rate.low=Low[i]; rate.high=High[i]; rate.close=Close[i]; rate.tick_volume=last_volume; } }
Разработчики программ на MQL4, которые активно пользовались автономными графиками, быстро оценят удобство нового подхода.
Структура для хранения информации о ценах, объемах и спреде
struct MqlRates { datetime time; // время начала периода double open; // цена открытия double high; // наивысшая цена за период double low; // наименьшая цена за период double close; // цена закрытия long tick_volume; // тиковый объем int spread; // спред long real_volume; // торговый объем };
Компилируем новый скрипт PeriodConverter и запускаем его, как и предыдущие, на новом графике EURUSD M1.
На этот раз мы готовим данные для оффлайнового графика EURUSD M4, поэтому множитель равен 4.
После подготовки данных так же открываем автономный график.
Заключение
- Оффлайновые графики в новом терминале работают как и прежде. Поддерживается как новый формат исторических данных, так и предыдущий.
- Старые EX4-файлы работают в новом терминале без потери функциональности.
- Новые MQL4-программы начинайте писать с использованием новых возможностей языка, откройте весь его потенциал.
Статьи по теме:
![SQL и MQL5: Работаем с базой данных SQLite](https://c.mql5.com/2/0/MQL5_SQLite_avatar.png)
![Создание цифровых фильтров, не запаздывающих по времени](https://c.mql5.com/2/0/gmomentum-test-logo-200x200-7398.png)
![Структура данных в MetaTrader 4 build 600 и выше](https://c.mql5.com/2/13/1143_38.png)
![Рецепты MQL5 - Разработка мультивалютного индикатора волатильности на MQL5](https://c.mql5.com/2/0/avatar1__1.png)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Написал статью о проблеме Торговля на офф.лайн графиках Renko, так же о проблеме отписал в сервисдеск на что получил ссылку на данную статью.
Я не программист! Что обычный трейдер или пользователь MT4 может из этого понять и применить, что бы решить проблему? Лично я ничего не понял как решить проблему!
Что надо делать с этими скриптами, о которых говорится в статье, что бы эксперты, установленные на офф.лайн графики начали работать!?
Кто может, объясните пожалуйста внятным обычным русским языком.
можно поставить MT5..
так худо-бедно есть синтетики, а для размещения всякой внешки CustomCharts. При всех техно-проблемах - это жирнючий плюсик в карму 5-ки и повод на неё перейти
можно поставить MT5..
так худо-бедно есть синтетики, а для размещения всякой внешки CustomCharts. При всех техно-проблемах - это жирнючий плюсик в карму 5-ки и повод на неё перейти
А жирнючий "минусик" это язык mql5 :)))
А жирнючий "минусик" это язык mql5 :)))
язык MQL один и тот-же в обеих платформах.
Отличаются API платформ и есть косметические различия у библиотек