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

Автор: lexy Пятница, Сентябрь 5th, 2014 Нет комментариев

Рубрика: Разное

В новом 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. Графики без «дыр»
Прикрепленные файлы:
 PeriodConverter.mq4 (6.1 Kb)
 period_converter_509.ex4 (6.5 Kb)
 period_converter_509.mq4 (6.5 Kb)
 period_converter_580.mq4 (6.6 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты