Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 2948
- Рейтинг:
- Опубликован:
- 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.
Пример
//+------------------------------------------------------------------+ //| Пример использования 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() выдаст количество всех объектов.
Наверняка в реализации есть недоработки, но мне нужно было хоть какое-нибудь решение. Я конечно буду еще дорабатывать эту библиотеку и надеюсь на помощь сообщества.

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

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

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

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