MQL для тебя

MQL для чайников, программирование на MQL4, MQL5

Архив рубрики «MQL Школа»

Рекомендуемый ДЦ - Alpari !

Добрый день, Уважаемые подписчики!
Сегодня я публикую очередной урок по пришедшему мне вопросу:

Уважаемый Александр.
Имеется ли в 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

Рекомендуемый ДЦ - Forex4you !

Недавно мне пришло письмо: Уважаемый Александр Парнюк! если вас не затруднит подскажите пожалуйста как написать индикатор на основе 4х цен свечного графика? Визуально это должно выглядеть как обычный свечной или баровский график только свечи не показывают тренд а выровнены по цене открытия по нулевой оси, т.е. бычьи свечи будут над осью Х а медвежьи под ней но цена открытия всегда на ней и главное тени (весь обьем взятого интервела времени) можно конечно представить как макд только в столбце тело свечи отображено одним цветом а тени другим чтоб явно читались четыре цены.

Подобного урока по индикаторам форекс у меня нет. Поэтому сегодня я решил показать как пишутся такие индикаторы. Для начала запускаем мастер создания советников forex:

Мастер создания советников

Выбираем «Пользовательский индикатор». В следующем окне указываем название Нашего индикатора форекс. Так как входные параметры нам не нужны — оставим их не заполненными:

Параметры индикатора

На следующем окне указываем что индикатор будет выводиться в отдельном окне, указываем цвета Нашего индикатора и тип вывода (линия, гистограмма, стрелки):

Буфера индикатора

Мы выбрали тип рисования — гистограмма для отображения значений в виде вертикальных линий. После нажатия кнопочки «Готово» будет сгенерирован код индикатора форекс для MT4:

//±-----------------------------------------------------------------+
//| Cand.mq4 |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//±-----------------------------------------------------------------+
int init()
{SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,ExtMapBuffer2);
return(0);}
//±-----------------------------------------------------------------+
int deinit() {return(0);}
//±-----------------------------------------------------------------+
int start()
{int counted_bars=IndicatorCounted();
return(0);}
//±-----------------------------------------------------------------+

Для начала нам необходимо увеличить ширину линий, которыми рисуются свечи. Что бы визуально свечи отличались от теней не только цветом. Для этого зададим ширину линий по умолчанию:

#property indicator_width1 2
#property indicator_width2 1

Для линий первого буфера (свечей) мы задали ширину в 2 пиксела, а для линий второго буфера (теней) мы задали ширину в 1 пиксель.
Осталось заполнить буферы значениями по свечам. Для этого пробежимся в цикле по свечам и занесем в первый буфер высоту свечи (Close[]-Open[]), а во второй высоту тени (High[]-Low[]). Так как свечи бывают бычьи (Close>Open) и медвежьи (Close<Open), а высота тени всегда High>Low, то необходимо еще определить знак. В итоге код нашего цикла получиться:

int limit;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars-- ;
limit=Bars-counted_bars;
for(int i=0; i<limit; i++)
{ExtMapBuffer1[i]=Close[i]-Open[i];
int zn=1;
if(Close[i]<Open[i]) zn=-1;
ExtMapBuffer2[i]=(High[i]-Low[i])*zn;
}

Вот что у нас получилось в итоге:

График с индикатором

Скачать: индикатор Сand.mq4

Рекомендуемый ДЦ - Alpari !

На прошлом уроке по изучению языка MQL4 мы научились использовать индикаторы Forex в своих советниках для MT4. Но сразу возникает вопрос: «А как быть, если мы не нашли необходимого нам индикатора?» - Конечно же мы его можем написать сами на языке MQL4.

Поэтому на сегодняшнем уроке мы будем изучать: "Как создать свой индикатор для MT4".

Возьмем для примера «Стратегию форекс на внутреннем Баре». Прочитав данную стратегию — мы понимаем что нам не хватает подсветки этого самого "внутреннего бара".

Давайте исправим эту ситуацию, написав свой индикатор форекс.

Запускаем мастер создания советников в MetaEditor:

Мастер создания индикаторов

Назовем наш создаваемый индикатор форекс - "inBar" и добавим параметр для изменения цвета подсветки:

Параметры индикатора

Следующее окно оставим без изменений:

Назначение буферов вывода

После нажатия кнопочки «Готово» получим пустой шаблон индикатора для Metatrader4:

//±-----------------------------------------------------------------+
//| inBar.mq4 |
//| Copyright © 2010. |
//| http://mql4you.ru |
//±-----------------------------------------------------------------+
#property copyright "Copyright © 2010."
#property link "http://mql4you.ru"
#property indicator_chart_window
extern color BoxColor=Red;
//±-----------------------------------------------------------------+
int init() {return(0);}
//±-----------------------------------------------------------------+
int deinit() {return(0);}
//±-----------------------------------------------------------------+
int start()
{int counted_bars=IndicatorCounted();
return(0);}
//±-----------------------------------------------------------------+ 

(далее…)

Рекомендуемый ДЦ - Forex4you !

Сегодня разберемся, как работать в языке MQL4 с внешними индикаторами. Невозможно встроить все индикаторы форекс в терминал Metatrader. Постоянно появляются новые индикаторы Forex и усовершенствуються старые индикаторы. Поэтому разработчики терминала Metatrader4 позаботились о работе с внешними индикаторами в языке MQL.

Рассмотрим например индикатор форекс "ZigZag":

Индикатор ZigZag

Он не встроен в терминал MT4, хотя и поставляется вместе с ним. Если взглянуть на график валютной пары, то прекрасно видно преимущества данного индикатора Forex.

Было бы здорово, если бы трейдер покупал внизу и продавать вверху точек излома индикатора  ZigZagа. Стратегию я такую не нашел. Поэтому просто проверю — действительно это так или нет. Но для начала необходимо сформулировать условия торговли: — покупаем когда ZigZag рисует линию вниз. — продаем когда ZigZag рисует линию вверх. — окончание линии ZigZagа анализируем при открытии следующей свечи — стоп-лосс ставим на 5 пунктов вниз или вверх от экстремума ZigZagа — тейк-профит ставим в 5 раз больше величины стоп-лосса — при образовании нового фрактала, стоп-лосс переносим вслед за ценой

Правила сформулировали, теперь можно заняться созданием советника форекс для Metatrader 4 на языке MQL4.
(далее…)

Рекомендуемый ДЦ - Alpari !

Доброе время суток, Уважаемые читатели!
Хотел сегодня рассмотреть очередного советника форекс, но понял, что мне надоело копировать функции из одного советника в другой. Поэтому сегодня рассмотрим что такое «Библиотеки функций MQL» и как с ними работать.

Для создания библиотеки функций MQL4 вызываем мастера создания советников в Metaeditor-е торгового терминала MT4:

Мастер создания библиотек

Вводим имя библиотеки функций (например MyLib):

Параметры библиотеки функций

Копируем в созданную библиотеку наши функции GetLot(), NewOrder(), DelOrders(), DelOrder(), EditOrder() и CloseOrder(). Компилируем и получаем ошибку: (далее…)

Рекомендуемый ДЦ - Forex4you !

И так, продолжим изучать язык MQL4: сегодня мы разберемся как создавать советники форекс для MT4, на основе пользовательских индикаторов Metatrader 4. Для примера, попробуем создать советник форекс на основе индикаторов форекс по "Стратегии форекс «Линия баланса».

Создадим новый советник «expert2» и скопируем в него наши функции GetLot() и NewOrder().

Ордера в этой стратегии форекс закрываются по стоп-лоссу и поэтому функция CloseOrder() нам не нужна. Для начала необходимо изучить торговую стратегию. В ней сказано что торговля ведется только отложенными ордерами Buy Stop и Sell Stop.

Перепишем нашу функцию NewOrder() так, чтобы она умела открывать такие типы ордеров Forex — т.е. отложенные ордера Buy Stop и Sell Stop:

int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0)
{while(!IsTradeAllowed()) Sleep(100);
if(Cmd==OP_BUY)
{PR=Ask;
if(TP==0 && TakeProfit>0) TP=Ask+TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=Ask-StopLoss*Point;}
if(Cmd==OP_SELL)
{PR=Bid;
if(TP==0 && TakeProfit>0) TP=Bid-TakeProfit*Point;
if(SL==0 && StopLoss>0) SL=Bid+StopLoss*Point;}
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,,0,0,CLR_NONE);
if(tic<0) Print(»Ошибка открытия ордера: ",GetLastError());
return(tic);}

Мы вынесли переменные для цены, тейк-профита, стоп-лосса в параметры функции и указали им значение по умолчанию «0». Теперь эту функцию можно вызывать как и раньше с 2 параметрами, а можно с указанием дополнительных параметров. Это нам пригодится для открытия отложенных ордеров форекс.

Кроме того в условии расчета тейк-профита и стоп-лосса мы проверяем эти параметры на соответствие «0». Это поможет избежать в дальнейшем ситуации когда мы передаем эти параметры, а функция их пересчитывает. (далее…)

Рекомендуемый ДЦ - Alpari !

На прошлом уроке Язык MQL — Урок 6 «эксперт Hedge Hog» мы написали советник Forex торгующий по стратегии Hedge Hog. Сегодня займемся его тестированием и оптимизацией в Metatrader.

Прежде чем использовать любой советник (эксперт) на реальном счете форекс необходимо убедиться в его работоспособности и разумеется — прибыльности.

Для этого необходимо выполнить следующие действия:
1. Проверить его на тестере стратегий MT4
2. Провести оптимизацию советника и проверить ее результат
3. Проверить, как работает советник форекс на демо-счете
4. Проверить советник на центовом счете форекс

Пункты 1,2,4 обязательны к выполнению! Пункт 3 желателен, но необязателен. Дело в том, что проверка на демо-счете и центовом счете занимают много времени. В отличии от тестера стратегий Metatrader 4 — торговля на них идет в реальном режиме времени. Поэтому один из этих этапов, начинающие трейдеры форекс частенько пропускают. Я настоятельно рекомендую НЕ пропускать 4 пункт - тестирование советника форекс на центовом счете. Советник может прекрасно работать на тестере и демо счете, а на реальном, как не странно, не торговать вовсе или «слить» ваш депозит. На реальном счете (центовый счет — это реальный счет с минимально разрешенными суммами депозита) присутствуют такие моменты, которых нет в тестере или на демо счете. Это отказы в обслуживании брокером форекс, проскальзывание цен и т.д.

Итак, начнем по порядку.

Запускаем тестер стратегий MT4 Запуск тестера , выбираем наш советник «expert1». Выбираем символ "EURUSD" как того требует стратегия Hedge Hog. Модель рекомендую выбрать "Все тики" как наиболее точный метод тестирования. Указываем интервал дат истории для тестирования. Я указал за декабрь месяц 2009 года. Выбираем Период на котором будет работать наш советник. Я выбрал часовой, хотя для нашего советника это не важно.

Настройки тестирования

Нажимаем кнопочку «Старт» и ждем окончания процесса тестирования советника.
У меня советник не совершил ни одной сделки. А в журнале появилось много ошибок. Дело в том что я использовал сервер Алпари для тестирования. У них 5 значные котировки, а стратегия «Hedge Hog» писалась для 4 значных котировок.

Это легко исправимо. Достаточно тейкпрофит увеличить в 10 раз (вместо 14 пунктов указать 140 пунктов). Нажимаем кнопочку «Свойства эксперта» и в появившемся окошке изменяем.

Свойства советника

Нажимаем «OK» и запускаем тестирование еще раз.
Теперь появились сделки. Открываем график: (далее…)

Рекомендуемый ДЦ - Forex4you !

Как я и обещал, сегодня мы займемся написанием эксперта Hedge Hog на языке MQL, но сначала давайте объединим уже полученные ранее знания и напишем собственные функции на MQL4.

Сразу возникает вопрос: «Что это нам даст?»

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

Функции MQL4 — это кирпичики из которых можно легко сложить рабочий эксперт MT4, не отвлекаясь каждый раз на одну и ту-же работу.

Расчет лота в MT4, поместим в функцию — "Функция расчета лота":
double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) return(0.0);
return(Lot);}

Обратите внимание на строчку: if(Lot*One_Lot>Free) return(0.0);

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

Для открытия ордера Metatrader 4, при помощи советника форекс,  напишем функцию — "Функция открытия ордера":
int NewOrder(int Cmd,double Lot)
{double TP=0; //тейкпрофит
 double SL=0; //стоплосс
 double PR=0; //Цена
 while(!IsTradeAllowed()) Sleep(100);
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask+TakeProfit*Point;
    if(StopLoss>0) SL=Ask-StopLoss*Point;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=Bid-TakeProfit*Point;
    if(StopLoss>0) SL=Bid+StopLoss*Point;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"«,0,0,CLR_NONE);
 if(tic<0) Print(»Ошибка открытия ордера: «,GetLastError());
return(tic);}

В этой функции на языке MQL мы использовали новые для нас команды MQL4:

Print() — Выдать сообщение в журнал.

GetLastError() — Номер последней ошибки.

Никогда не помешает знать об возникновении ошибки для будующей отладки эксперта. Кроме того мы поручили нашей функции MQL4 самой определять цену по типу ордера, расчет тейкпрофита и стоплосса.

Функция start() нашего скрипта сильно упростится:

 double Lot=GetLot(MaxRisk);
 if(Lot==0) {Alert(»Недостаточно средств!");return(0);}
 RefreshRates();
 if(Buy)  NewOrder(OP_BUY,Lot);
 if(Sell) NewOrder(OP_SELL,Lot);

Новая функция RefreshRates() — функция обновления данных в предопределенных переменных (Ask, Bid и т.д.) При запуске нашего скрипта в окне терминала Metatrader появляется окошко с параметрами. Пока мы их изменяем цена может изменится. Вот мы и обновим ее значение в переменных.

Теперь займемся советником Hedge Hog.

Для начала изучим: Стратегию Hedge Hog.

На первый взгляд — все просто. Нужно открывать каждый торговый день ан форекс, с понедельника по пятницу в 00:00 по GMT, два рыночных ордера в противоположные стороны (один на покупку, второй на продажу) без стоп-лоссов и с тейк-профитами в 14 пунктов равным объемом по валютной паре EURUSD.

Итак, для создания советника MT4, запускаем мастер в редакторе MetaEditor:

Мастер создания экспертов в редакторе MetaEditor

выбираем «Советник» и нажимаем «Далее>» (далее…)

Рекомендуемый ДЦ - Alpari !

На предыдущих уроках по изучению языка MQL мы написали скрипт Metatrader4 — «test» для расчета лота. Теперь мы знаем сколько использовать средств для торговли и можем спокойно открывать ордера в Metatrader 4 автоматически.

Но зачем их открывать в ручную если это можно поручить компьютеру? Да и не удобно запускать скрипт на Metatrader 4, а потом еще открывать ордер. Опять же цена между этими действиями не стоит на месте, а постоянно меняется и мы можем потерять несколько пунктов прибыли.

Давайте научим наш скрипт открывать ордера автоматически. Для этого, нам нужно определиться какие ордера он должен открывать. В MetaTrader можно использовать как рыночные ордера (открываемые по текущей цене) так и отложенные(автоматически открываемые брокером при достижении цены заданного уровня).

В нашем тестовом скрипте на MQL4, мы будем открывать рыночные ордера так как мы обучаемся, а любое обучение идет от простого к сложному.

Все эти типы ордеров програмно открываются одной и той же функцией: OrderSend().

Кроме того ордера бывают на покупку и на продажу валюты. Значит скрипту надо указать эти сведения.

Введем в параметры нашего скрипта еще 2 параметра:
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=false; //для открытия ордера на продажу

Оба параметра имеют логический (bool) тип. Значит они будут принимать только два значения: true (истина) и false (ложь). Мы установили их значение в false чтобы при запуске нашего скрипта в MT4 с параметрами по умолчанию ничего не происходило. Если бы мы установили их в true то при запуске с параметрами по умолчанию у нас открылось 2 ордера. Один на покупку, а второй на продажу. В большинстве случаев нам это не нужно. Будем при запуске говорить скрипту «какой ордер открыть».

Тип ордера мы теперь можем указать скрипту, но осталось непонятно как указать стоплосс и тейкпрофит. Согласитесь, что их тоже желательно указывать в параметрах. Например так:
extern int TakeProfit=100;
extern int StopLoss=100;
мы выбрали тип int (целое число), а скрипту поручим переводить их в пункты в зависимости от котировки валютной пары. Для этого достаточно их умножить на служебную переменную Point (размер пункта текущего инструмента в валюте котировки).

Но а как быть если наша стратегия не подразумевает установку тейкпрофита или стоплосса?
воспользуемся знакомой нам функцией проверки условия if:
double buyTP=0; //тейкпрофит для покупки
double sellTP=0; //тейкпрофит для продажи
double buySL=0; //стоплосс для покупки
double sellSL=0; //стоплосс для продажи
if(TakeProfit>0)
  {buyTP=Ask+TakeProfit*Point;
   sellTP=Bid-TakeProfit*Point;}
if(StopLoss>0)
  {buySL=Ask-StopLoss*Point;
   sellSL=Bid+StopLoss*Point;}

Здесь мы использовали фигурные скобки чтобы после проверки условия выполнялась не одна команда, а несколько.

Итак, наши команды для открытия ордеров будут выглядеть:
if(Buy) OrderSend(Symbol(),OP_BUY,Lot,Ask,3,buySL,buyTP,"«,0,0,CLR_NONE);
if(Sell) OrderSend(Symbol(),OP_SELL,Lot,Bid,3,sellSL,sellTP,»",0,0,CLR_NONE);

С помощью функции if() мы проверяем какой ордер нужно открыть. А функцией OrderSend() открываем.
Функция OrderSend() достаточно сложная и требует много параметров.

Давайте разберемся с ними: (далее…)

Рекомендуемый ДЦ - Forex4you !

На предыдущем уроке Язык MQL — Урок 3 «расчет лота» мы научили наш скрипт «test» рассчитывать лот в зависимости от свободных средств на торговом счете форекс. Но чего то ему не хватает, давайте взглянем еще раз на рисунок:

Расчет лота на MQL
Вот оно!!! — Лот у нас получился с 4 знаками после запятой. А брокер форекс требует 2 знака после запятой. Конечно в ручную не составит труда откинуть лишние 2 знака, но мы стремимся автоматизировать нашу торговлю, т.е. всю работу свалить на компьютер. Кроме того — на рисунке не понятно по какой валютной паре рассчитан автоматически лот. Да и цифру максимального риска не помешает видеть на экране монитора.

Итак, давайте продолжим улучшать наш скрипт «test».

Для начала заставим компьютер отбрасывать лишние цифры. Округлять нельзя. Ведь при округлении получится не то что нам надо (нам надо 0.06, а при округлении будет 0.07 - это больше указанного нами риска).

Для того чтобы узнать сколько знаков после запятой разрешено вашим брокером форекс — воспользуемся известной нам функцией MarketInfo(string symbol, int type).

Только вторым параметром будем передавать MODE_LOTSTEP шаг изменения размера лота.

double Step =MarketInfo(Symbol(),MODE_LOTSTEP); переменная Step будет содержать шаг изменения лота.
Если разделить наш лот на шаг (например 0.01) мы получим: 0.0684/0.01=6.84
Теперь возьмем целую часть от этого числа (функция MathFloor()) = 6 и умножим на шаг (0.01) получим 0.06 (то что и требовалось).

Объединим это с нашим расчетом:

double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
результат:

вывод информации в Metatrader 4

Получилось отлично.

Осталось добавить информацию о валюте и риске в выводимое окно.
Риск содержится в переменной MaxRisk, а текущая валюта выдается функцией Symbol().
Все это мы знаем из предыдущих уроков.

(далее…)