English 中文 Español Deutsch 日本語 Português
Оффлайновые графики и новый MQL4

Оффлайновые графики и новый MQL4

MetaTrader 4Примеры | 4 февраля 2014, 07:27
10 094 16
MetaQuotes
MetaQuotes

В новом 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.


После подготовки данных так же открываем автономный график.


Как видите, все три версии скрипта работают одинаково. Все те, кому нравятся или необходимы для работы собственные графики символов или нестандартные таймфреймы, смогут и в дальнейшем не только пользоваться ими в новой версии терминала MetaTrader 4, но и при необходимости дорабатывать существующие исходные коды или создавать новые. Принципиальных изменений или трудностей с переходом на новые рельсы не возникнет.


Заключение

  1. Оффлайновые графики в новом терминале работают как и прежде. Поддерживается как новый формат исторических данных, так и предыдущий.
  2. Старые EX4-файлы работают в новом терминале без потери функциональности.
  3. Новые MQL4-программы начинайте писать с использованием новых возможностей языка, откройте весь его потенциал.

Статьи по теме:

  1. Тестирование экспертов на нестандартных таймфреймах
  2. Принцип замены времени в интрадей-торговле
  3. Новый взгляд на эквиобъемные графики
  4. Синтетические бары – новое слово в отображении ценовой графической информации
  5. Графики без "дыр"
Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (16)
Aleksandr Novikov
Aleksandr Novikov | 4 мар. 2014 в 12:17

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

Я не программист! Что обычный трейдер или пользователь MT4 может из этого понять и применить, что бы решить проблему? Лично я ничего не понял как решить проблему!

Что надо делать с этими скриптами, о которых говорится в статье, что бы эксперты, установленные на офф.лайн графики начали работать!?

Кто может, объясните пожалуйста внятным обычным русским языком.

Андрей Белый
Андрей Белый | 27 окт. 2023 в 17:41
Можно ли сделать индикатор, скрипт, шаблон, чтобы уменьшить часть  действий для выставления нестандартного таймфрейма или совсем свести к нулю? Ведь всё это нужно будет делать КАЖДЫЙ РАЗ, когда трейдер садится за торговлю.
А у меня на мт4  стоят 21 пара.

Моя задача, которую я пробую начал пробовать воплотить состоит в том, чтобы минимальными действиями сделать нестандартные таймфреймы, Очень интересует 3 минутный таймфрейм, на в МТ4. 
В МТ4 есть конвертер периодов и он имеет открытый код. Можете ли вы создать скрипт или индикатор и шаблон на основании его или иное, чтобы можно накинуть его одну пару - это будет шаблон например и с помощью его дозавершить уже накинув его на остальные нужные пары  и чтобы на них проявились трёхминутные таймфреймы? Ну и понятное с приставкой оффлайн. 
Если и неполное это действие сделать, то хотя бы насколько можно это сделать.

Спасибо.
Maxim Kuznetsov
Maxim Kuznetsov | 27 окт. 2023 в 20:43
Андрей Белый #:
Можно ли сделать индикатор, скрипт, шаблон, чтобы уменьшить часть  действий для выставления нестандартного таймфрейма или совсем свести к нулю? Ведь всё это нужно будет делать КАЖДЫЙ РАЗ, когда трейдер садится за торговлю.
А у меня на мт4  стоят 21 пара.

Моя задача, которую я пробую начал пробовать воплотить состоит в том, чтобы минимальными действиями сделать нестандартные таймфреймы, Очень интересует 3 минутный таймфрейм, на в МТ4. 
В МТ4 есть конвертер периодов и он имеет открытый код. Можете ли вы создать скрипт или индикатор и шаблон на основании его или иное, чтобы можно накинуть его одну пару - это будет шаблон например и с помощью его дозавершить уже накинув его на остальные нужные пары  и чтобы на них проявились трёхминутные таймфреймы? Ну и понятное с приставкой оффлайн. 
Если и неполное это действие сделать, то хотя бы насколько можно это сделать.

Спасибо.

можно поставить MT5..

так худо-бедно есть синтетики, а для  размещения всякой внешки CustomCharts. При всех техно-проблемах - это жирнючий плюсик в карму 5-ки и повод на неё перейти

Victor Golovkov
Victor Golovkov | 28 окт. 2023 в 05:40
Maxim Kuznetsov #:

можно поставить MT5..

так худо-бедно есть синтетики, а для  размещения всякой внешки CustomCharts. При всех техно-проблемах - это жирнючий плюсик в карму 5-ки и повод на неё перейти

А жирнючий "минусик" это язык mql5 :)))

Maxim Kuznetsov
Maxim Kuznetsov | 28 окт. 2023 в 09:28
Victor Golovkov #:

А жирнючий "минусик" это язык mql5 :)))

язык MQL один и тот-же в обеих платформах.

Отличаются API платформ и есть косметические различия у библиотек

SQL и MQL5: Работаем с базой данных SQLite SQL и MQL5: Работаем с базой данных SQLite
Данная статья рассчитана на программистов, проявившим интерес к использованию SQL в своих проектах. В статье читателям представляется функциональность SQLite, а также рассматриваются ее преимущества. Статья не требует знание функций SQLite, но минимальные знания SQL приветствуются.
Создание цифровых фильтров, не запаздывающих по времени Создание цифровых фильтров, не запаздывающих по времени
В статье рассматривается один из подходов к определению полезного сигнала (тенденции) потоковых данных. Небольшие практические тесты фильтрации (сглаживания) биржевых котировок демонстрируют потенциальную возможность создания цифровых фильтров (индикаторов), которые не запаздывают по времени и не перерисовываются на последних барах.
Структура данных в MetaTrader 4 build 600 и выше Структура данных в MetaTrader 4 build 600 и выше
Начиная с 600 билда MetaTarder 4, изменилась структура, а также место хранения файлов клиентского терминала. Теперь MQL4-программы разнесены по отдельным каталогам в зависимости от типа программы (эксперты, индикаторы, скрипты). Данные терминала в большинстве случаев теперь хранятся в специальном каталоге данных отдельно от места установки терминала. В данной статье мы подробно опишем, каким образом осуществляется перенос данных, а также причины введения такой системы хранения.
Рецепты MQL5 - Разработка мультивалютного индикатора волатильности на MQL5 Рецепты MQL5 - Разработка мультивалютного индикатора волатильности на MQL5
В этой статье рассмотрим разработку мультивалютного индикатора волатильности. Начинающие разработчики на MQL5 могут столкнуться с некоторыми сложностями при разработке мультивалютных индикаторов, но после прочтения этой статьи все станет намного проще. Основные вопросы при разработке мультивалютного индикатора относятся к синхронизации данных других символов по отношению к текущему символу, решению проблемы отсутствия части данных индикатора, определению начала "истинных" баров таймфрейма. Все это будет подробно рассматриваться в статье.