MQL для чайников, программирование на MQL4, MQL5
15 Сен
Добрый день, Уважаемые подписчики!
Сегодня я публикую очередной урок по пришедшему мне вопросу:
Уважаемый Александр.
Имеется ли в MQL4 возможность работать с такими графическими объектами MetaTraderа, как трендовые, вертикальные и горизонтальные линии, каналы и т.д., имеющими в среде MetaTrader собственные имена и параметры? Если да — рассажите об этом в одном из своих уроков.
Давайте рассмотрим как работать с объектами MetaTraderа 4 на примере трендовой линии. Существует множество стратегий форекс, основаных на трендовых линиях. Например Стратегия форекс «3 касания» или Стратегия форекс «Trend Lines» и т.д. Обычно работают такие трговые стратегии на отскок цены от трендовой линии или на пробой трендовой линии. Рассмотрим как написать советника MT4 который будет отслеживать приближение цены к трендовой линии и открывать ордера с целью получить прибыль при ее отскоке. Конечно советник не будет полностью автоматическим. Трейдеру придется в ручную рисовать трендовую линию, но сидеть ждать подхода цены к трендовой линии будет не нужно.
Для начала определимся с параметрами, что нам нужно настраивать: — риск для расчета лота — тейкпрофит — стоплосс — расстояние от трендовой линии до установки ордера (цена может несколько пунктов не дойти до трендовой линии)
Подключим нашу библиотеку MyLib и укажем внешние параметры:
//±-----------------------------------------------------------------+
//| TrendLine.mq4 |
//| Copyright c 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright c 2010."
#property link "http://mql4you.ru"
#include <MyLib.mqh>
extern int MaxRisk=2;
extern int TakeProfit=600;
extern int StopLoss=30;
extern int Delta=5;
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {Comment("«);return(0);}
//±-----------------------------------------------------------------+
int start()
{
return(0);}
//±-----------------------------------------------------------------+
Проверим что есть трендовая линия и она в единственном экземпляре:
if(ObjectsTotal(OBJ_TREND)!=1)
{Comment(»Нарисуйте 1 трендовую линию!");
return(0);}
Получим ИМЯ трендовой линии:
for(int i=0;i<ObjectsTotal();i++)
{string name=ObjectName(i);
if(ObjectType(name)==OBJ_TREND) break;}
Проверим что трендовая линия нарисована правильно (по движению цены):
datetime t1=ObjectGet(name,OBJPROP_TIME1);
datetime t2=ObjectGet(name,OBJPROP_TIME2);
if(t1>t2)
{Comment("Неправильно нарисована трендовая линия!");
return(0);}
Продолжим линию (свойство луч):
ObjectSet(name,OBJPROP_RAY,true);
Определим тренд (вверх или вниз):
bool trend=false;
double p1=ObjectGet(name,OBJPROP_PRICE1);
double p2=ObjectGet(name,OBJPROP_PRICE2);
if(p1<p2) trend=true;
Определим текущее значение трендовой линии и сообщим ее параметры:
double pr=ObjectGetValueByShift(name,0);
Comment("Name=",name," Trend=",trend," Value=",pr);
Осталось подсчитать количество открытых ордеров и если их нет и цена подошла к трендовой линии открыть ордер.
Подсчитаем кол-во ордеров:
int oBuy=0,oSell=0;
for(i=OrdersTotal() −1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
{if(OrderType()==OP_BUY) oBuy++;
if(OrderType()==OP_SELL) oSell++;}
Если нет ордеров и цена подошла к трендовой линии — откроем ордер:
double tp=0,sl=0;
double Lot=GetLot(MaxRisk);
if(Lot==0.0) {Alert("Недостаточно средств!");return(0);}
if(oBuy+oSell==0 && trend && Bid>=pr && Bid<=pr+Delta*Point)
{if(TakeProfit>0) tp=Ask+TakeProfit*Point;
if(StopLoss>0) sl=Ask-StopLoss*Point;
NewOrder(OP_BUY,Lot,Ask,tp,sl);}
if(oBuy+oSell==0 && !trend && Ask<=pr && Ask>=pr-Delta*Point)
{if(TakeProfit>0) tp=Bid-TakeProfit*Point;
if(StopLoss>0) sl=Bid+StopLoss*Point;
NewOrder(OP_SELL,Lot,Bid,tp,sl);}
Советник форекс готов! Осталось его протестировать. Советники форекс подобного типа, тестируют только в визуальном режиме как в Уроке 10 «Работа с внешними индикаторами». Запустим тестирование и нарисуем трендовую линию:
Наблюдаем как идет тестирование. Вот цена подошла к трендовой линии и открылся ордер:
Далее цена развернулась и подошла к нашему профиту:
В итоге ордер закрылся по тейкпрофиту и мы получили прибыль:
Как видно из тестов, созданный нами эксперт МТ4, работает. Его можно использовать как для торговли, так и для тренировки умения рисовать трендовые линии в тестере стратегий Metatrader 4.
Скачать: советник TrendLine
Если Вы хотите изучать язык MQL или вам понравилась данная публикация - Вы можете подписаться на получение новых материалов сайта mql4you.ru по |
17 комментариев на «Язык MQL — Урок 13 «Работа с графическими объектами MT4»»
Отличный пример, спасибо!
Подскажите каким образом можно организовать хранение промежуточных данных(между запусками советника\скрипта\индикатора), в привязке к объектам?
Аркадий
Для целей хранения данных между запусками в MQL существуют «глобальные переменные». Функция GlobalVariableSet() сохраняет значение, а GlobalVariableGet() извлекает. Посмотреть их можно нажав клавишу F3 в терминале или через меню: Сервис-Глобальные переменные.
palt, т.е. спасибо за ответ!
Я посмотрел эту функцию она может сохранять только double значения.
Можно ли как то организовать сохранение чего то вроде Hashmap ? т.е. по 1 ключу сохранить структуру в которой будут и даблы и инты и строчки?
Аркадий
В таком случае советую почитать про работу с файлами. Функции: FileOpen(), FileClose(), FileWrite() и т.д.
palt, Да видимо придется делать через файлы, может в mt5 с этим что то придумают, в любом случае спасибо за ответ!
Здравствуйте, подскажите пожалуйста почему у меня вылазиет ошибка
'MyLib.mqh' — cannot open the program file
вроде бы делал все как написано, может пропустил чего...
уже исправил не сохранил май либ в папку инклуд
Уважаемый Александр.
Не могли бы вы подсказать:
Почему при запросе:
datetime t1=ObjectGet(name,OBJPROP_TIME1);
t1 присваивается 10-тизначное значение. И совсем не похожее на тип datetime — значение даты и времени (например: 01.01.2010 12:00).
С Уважением.
ДЕНЬ ДОБРЫЙ! ВЫ ПРОДЕЛАЛИ ОГРОМНУЮ И НУЖНУЮ РАБОТУ ПО ОБУЧЕНИЮ НОВИЧКОВ КОИМ САМ И ЯВЛЯЮСЬ. ХОЧУ ВАС ЗА ЭТО ИСКРЕННЕ ПОБЛАГОДАРИТЬ !!!
Я С ВОПРОСОМ ПО СОВЕТНИКУ ОПИСАНОМУ ВЫШЕ. ПОСЛЕ ПОЛУЧЕНИЯ ПРИБЫЛИ ОН ЗАКРЫВАЕТСЯ — УРА!!!
А ЕСЛИ СОВЕТНИК ЗАКРОЕТСЯ С УБЫТКОМ, ЧТО ПРОИЗОЙДЁТ ДАЛЬШЕ?
И ГЛАВНЫЙ ВОПРОС — ЕСЛИ ЗАКРОЕТСЯ С УБЫТКОМ — КАК СДЕЛАТЬ ЧТОБЫ СОВЕТНИК ОТКРЫЛСЯ ВНОВЬ ТАМ ЖЕ ГДЕ ОТКРЫВАЛСЯ В ПЕРВЫЙ РАЗ???
БЛАГОДАРЮ вАС ЗА ОТВЕТ
С УВАЖЕНИЕМ, ВЯЧЕСЛАВ .
Это тип datetime (содержит время в секундах, прошедшее с 01.01.1970). Чтобы привести к читаемуму виду надо воспользоваться функцией TimeToStr();
Согласно приведенному алгоритму советник будет открывать ордера каждый раз при приближении цены к трендовой линии (если нет открытых ордеров). Поэтому не имеет значения — закроется ордер по профиту или лосю.
Установил на MT4 советник Trend Line. Когда переношу его на график то ничего не происходит с графиком, лишь в правом верхнем углу появляется название советника? Как заставить его заработать? Как ???
Неужели нельзя никак автоматизировать вычисление трендовой линии, хотя бы с погрешностями?
Это было бы идеально — научить программу вычислять тренд.
Спасибо вам за уроки, щас пытаюсь создать своего робота... с нетерпением жду продолжения...
Вопрос может не по теме — подскажите пожалуйста правильный пример функции «подгона стопа», то есть если цена подошла к +20 пунктов от цены открытого ордера, стоп подставился на +10, и так постоянно до закрытия...
Заранее спасибо!
Вячеслав
Внимательнее читайте статью. В ней сказано что трендовую линию необходимо рисовать в ручную.
Dima
Все возможно. Я даже где-то видел такой скрипт.
виталий
Вот пример простого трала:
int TrailingStop=10;
int TrailingStep=10;
for(int i=OrdersTotal() −1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{if(OrderType()==OP_BUY)
if(Bid-OrderOpenPrice())>TrailingStop*Point)
if(OrderStopLoss()TrailingStop*Point)
if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0)
EditOrder(Ask+TrailingStop*Point);}
Оставьте отзыв