Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Object Emulator - библиотека для MetaTrader 5

Просмотров:
2831
Рейтинг:
(38)
Опубликован:
2013.03.19 09:47
Обновлен:
2014.12.16 14:13
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Описание

MetaTrader 4 позволяет использовать объекты в экспертах во время тестирования. По окончании тестирования открывается график с наложенными на него объектами. Удобно видеть по стрелочкам, где эксперт мог бы совершить операцию, но условие этого не позволило. Примеров применения много...

В MetaTrader 5 нас лишили возможности использовать объекты при тестировании. Меня такая ситуация не устраивает! Что ж, вот вам костыль.

Предупреждение:

Эксперты уже сейчас для MetaTrader 5 создаются без использовании объектов. Object Emulator позволяет получать данные с объекта, но я не рекомендую так делать, потому что процесс тестирования замедляется в разы и есть некоторые отличия от официальных функций.

Object Emulator используйте только для отображения объектов на графике после тестирования.

Установка

Добавить в шаблон тестера tester.tpl индикатор ObjectEmul_indicator.

Для тех, кто не знает как это делается:

  • Открываете график по любой паре.
  • Кидаете на него ObjectEmul_indicator.
  • Правой кнопкой мыши (ПКМ) по графику.
  • Шаблоны => Сохранить шаблон, и указать имя файла "tester".

Использование

В тестере MetaTrader 5 убрали кнопку "Открыть график" на вкладке "Настройка". Если эксперт в тесте не совершит торговую операцию, то график не появится автоматически. Придется переключаться на "Бэктест", жать правой кнопкой мыши (ПКМ) и выбирать "Открыть график".

Перед использованием кинуть ObjectEmul_UnitTest_script на пустой график и прочесть лог на вкладке "Эксперты", чтобы узнать отличия от официальных функций для работы с объектами.

В главный файл эксперта добавить:

#include <ObjectEmul.mqh>
CObjectEmul _objs;

И пройтись заменой Object на _objs.Objct для стандартных функций.

Для вызова справки по объектным функциям в редакторе достаточно добавить букву "e" в "Object" и нажать F1.

Пример

EURUSD, H1, MetaQuotes Software Corp., MetaTrader 5, Demo

//+------------------------------------------------------------------+
//|    Пример использования Object Emulator                          |
//+------------------------------------------------------------------+
#include <ObjectEmul.mqh>
CObjectEmul _objs;

int ZigZag;
datetime lastbar=0;

double trianglePrice[3];
datetime triangleTime[3];
int triangleIndex=0;

int OnInit()
  {
   ZigZag=iCustom(_Symbol,_Period,"Examples\\ZigZag",5,5,3);
   MathSrand(GetTickCount());
   return(0);
  }

void OnTick()
  {
   datetime time[];
   CopyTime(_Symbol,_Period,0,15,time);
   if(lastbar==time[0]) return;
   lastbar=time[0];

   double zgbuffer[];
   if(CopyBuffer(ZigZag,0,0,15,zgbuffer)==0) {Print("CopyBuffer(ZigZag) Error"); return;}

   bool first=true;
   for(int x=0,count=ArraySize(zgbuffer);x<count && triangleIndex<3;x++)
     {
      // Здесь явно где-то косяк, но конечный результат мне нравится :)
      if(zgbuffer[x]>0 && first) {first=false; x+=3;}
      else if(zgbuffer[x]>0 && (triangleIndex==0 || trianglePrice[triangleIndex-1]!=zgbuffer[x]))
        {
         trianglePrice[triangleIndex]=zgbuffer[x];
         triangleTime[triangleIndex]=time[x];
         triangleIndex++;
         break;
        }
      else if(zgbuffer[x]>0) break;
     }

   if(triangleIndex<3) return;

   string objname="ObjectEmul_Demo_"+(string)(int)lastbar;

//////////////////////////
// Object Emulator

// Аналоги стандартных Object*()
   if(_objs.ObjctCreate(0,objname,OBJ_TRIANGLE,0,
      triangleTime[0],trianglePrice[0],triangleTime[1],trianglePrice[1]))
     {
      _objs.ObjctSetInteger(0,objname,OBJPROP_TIME,2,triangleTime[2]);
      _objs.ObjctSetDouble(0,objname,OBJPROP_PRICE,2,trianglePrice[2]);
      _objs.ObjctSetInteger(0,objname,OBJPROP_COLOR,(MathRand()%255)*(MathRand()%255)*(MathRand()%255));

      // Пример использования индексов
      int index=_objs.ObjctFindIndex(0,objname);
      if(index>-1) _objs.ObjctSetIntegerIndex(index,OBJPROP_FILL,0,true);
     }
   else Print("ObjctCreate Error");

// Object Emulation
//////////////////////////

   trianglePrice[0]=trianglePrice[1];
   triangleTime[0]=triangleTime[1];
   trianglePrice[1]=trianglePrice[2];
   triangleTime[1]=triangleTime[2];
   triangleIndex=2;
  }

Переменные

  • string FileName - Имя файла. Задано по умолчанию, но его можно менять.
  • bool SaveAuto = false - Сохранить ли объекты в файл при удалении объекта класса? По умолчанию значение "true" только для обычного теста.

Функции

Все графические Object*() реализованы, но имеют названия Objct*(). А вот аналогов TextSetFont(), TextOut() и TextGetSize() нет.

  • int Count() - Количество объектов.
  • void ReleaseAll() - Удаляет все объекты (быстрее чем ObjctDeleteAll).
  • bool LoadFile(string fname = "", bool print_error = false) - Загрузить объекты из файла.
  • bool SaveFile(string fname = "", bool print_error = false) - Сохранить объекты в файл.
  • void DrawAll() - Рисует все объекты на графике.

Так же имеются функции Objct*Index() для ускорения работы:

  • int ObjctFindIndex(long chart_id, string name) - в отличии от ObjctFind() возвращает порядковый номер объекта.

Чтобы избежать двусмысленности перегрузок мне пришлось выделить для индексов отдельные функции. Эти функции не вызывают ObjctFindIndex() для поиска и без контроля существования объекта к использованию не принадлежат!

ObjctSetInteger(0,"objname",OBJPROP_STYLE,STYLE_DASH) == ObjctSetIntegerIndex(ObjctFindIndex(0,"objname"),OBJPROP_STYLE,STYLE_DASH);

Функция LoadFile() использует эти функции, а функция Count() выдаст количество всех объектов.

Наверняка в реализации есть недоработки, но мне нужно было хоть какое-нибудь решение. Я конечно буду еще дорабатывать эту библиотеку и надеюсь на помощь сообщества.

Easy Trend Visualizer Easy Trend Visualizer

Простой визуализатор трендов

Donchian Channel Donchian Channel

Donchian channel — технический индикатор, разработанный Ричардом Дончяном.

Average Volumes (Volumes Forecasting) Average Volumes (Volumes Forecasting)

Индикатор отображает в отдельном окне не только объемы, но и их усредненное по истории значение. Усредненное значение объемов используется для построения прогноза величины объемов на текущий и последующий дни.

CCIArrows CCIArrows

Семафорный сигнальный индикатор, фиксирующий моменты пробоя техническим индикатором iCCI нулевого уровня и отображающим эти моменты цветными точками