Скачать MetaTrader 5

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

4 февраля 2014, 07:27
MetaQuotes Software Corp.
12
4 891

В новом 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. Графики без "дыр"
Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (12)
danrusm
danrusm | 17 фев 2014 в 15:00

Когда разработчик поймёт что специальный язык программирования не нужен, нужен просто API.

Справку в отдельное окно вывели, зачем?

Andrey Egorov
Andrey Egorov | 19 фев 2014 в 14:26

Проблема вызова индикатора из кода для синтетических инструментов

есть офлайновые графики синтетических инструментов, которые догружаются по таймеру из hst файла

индикаторы на этих графиках отображаются как и раньше, но из кода значение индикаторов получить не получается

код

double ma_small = iMA(NULL,frac_per,20,1,MODE_SMA,PRICE_CLOSE,1);

double ma_big = iMA("XXX",frac_per,50,1,MODE_SMA,PRICE_CLOSE,1);

Print("Check " + ma_small + " ma_big " + ma_big );

выдает

Check ma_small 0 ma_big 0

уже многое перепробовал, не пойму в чем причина

в старом релизе таких проблем раньше не было
Andrey Egorov
Andrey Egorov | 19 фев 2014 в 14:33
как можно откатить на старую версию ?
МихалbIч
МихалbIч | 27 фев 2014 в 06:03

Здравствуйте! Программирую на MQL4 с 2005-го. Думаю, многим известны мои программы по импорту графиков в МТ4: http://pmntrade.ru/mt4_quotes_importer.html и http://pmntrade.ru/mt4_quik_quotes_online.html. Т.к. программой пользуются достаточно много трейдеров, пришлось переделывать код под новую версию в экстренном порядке. И вот что я могу сообщить о нововведениях....

1. Самое приятное новшество для меня - отладчик. Теперь можно видеть значение любых переменных, процессы обработки кода и т.п. Кто не научился пользоваться очень рекомендую. Я научился интуитивно, но должна быть где-то соответствующая статья.
2. Прежде всего изменился НЕ монопольный вызов FileOpen и др. файловых функций. Теперь нужны ключи FILE_SHARE_READ|FILE_SHARE_WRITE.
3. Теперь МТ4 ругается при вызове массива с несуществующим индексом. Раньше я вызывал My_array[1], хотя массив содержал только один элемент [0]. Пришлось немало помучаться.
4. Внимание! Частое применение FileFlush теперь сильно тормозит обработку. Применяем так, записали все необходимые данные в файл, поставили FileFlush. Не нужно пихать FileFlush внутрь цикла, с записью.
5. Сравнение типа "while(bank_pos<FileSize(bank_hand))", теперь оборачиваются предупреждением. Теперь нужно "x=FileSize(bank_hand);" и "while(bank_pos<x)". Не столь важно.
6. Переменная не может содержать точку. Раньше можно было назвать "1.", теперь ошибка. Не велика потеря.
7. Появление структуры MqlRates, я воспринял нейтрально. Новые коды буду писать с её применение, а старые оставлю как есть. Выгрузка структуры разом "FileWriteStruct", работает быстрее, чем предыдущие способы.
У меня вопрос к знатокам: Как удалить файл истории *.hst, находящийся в "каталог_терминала\history\server_name"?

Aleksandr Novikov
Aleksandr Novikov | 4 мар 2014 в 12:17

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

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

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

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

Интерактивная площадка для моделирования случайных результатов Интерактивная площадка для моделирования случайных результатов

В статье представлена интерактивная площадка, реализованная в виде файла Excel, которая моделирует результаты тестирования советников на исторических данных. Она поможет читателям в исследовании и получении более четкого представления о показателях эффективности отчетов MetaTrader, которые служат для оценки работы торговых систем. Изложение материала организовано таким образом, чтобы дать пользователю возможность окунуться в атмосферу практического опыта.

Три аспекта ручного автотрейдинга. Часть 1 - Торговля Три аспекта ручного автотрейдинга. Часть 1 - Торговля

Эта статья открывает цикл статей по вопросам автоматизации ручного трейдинга на платформе МetaТrader 4. Каждая из них будет посвящена одному отдельному аспекту ручного автотрейдинга: автоматизация ручной торговли, автоматизация отображения текущего состояния торговли и автоматизация формирования отчетов о результатах торговли. В этой статье я расскажу об одной интересной технике для написания советников, управляемых трейдером вручную.

Структура данных в MetaTrader 4 build 600 и выше Структура данных в MetaTrader 4 build 600 и выше

Начиная с 600 билда MetaTarder 4, изменилась структура, а также место хранения файлов клиентского терминала. Теперь MQL4-программы разнесены по отдельным каталогам в зависимости от типа программы (эксперты, индикаторы, скрипты). Данные терминала в большинстве случаев теперь хранятся в специальном каталоге данных отдельно от места установки терминала. В данной статье мы подробно опишем, каким образом осуществляется перенос данных, а также причины введения такой системы хранения.

Обновление на новый MetaTrader 4 билд 600 и выше Обновление на новый MetaTrader 4 билд 600 и выше

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