AM2
Андрей

 
Уровень 34

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Как переделать советник на MQL4 под торговлю бинарными опционами

В настоящее время набирает обороты торговля бинарными опционами. И когда на нашем портале стала активно обсуждаться эта тема, я призадумался как можно реализовать данный советник. Оказалось все довольно просто. Для начала нам нужно найти брокера, который поддерживает торговлю бинариками на MetaTrader 4. Забиваем в Google запрос: брокеры бинарные опционы mt4. Вам можно даже не утруждаться, достаточно кликнуть по ссылке «запрос» :) . Открыв первую попавшуюся ссылку на первой странице, я сразу же увидел список из 7 брокеров:

Бинарные опционы на МТ4 платформе предоставляют следующие брокеры:

wforex.ru
grаndcapital.ru
mrcmarkets.ru
mikiforex.com
clmforex.com
lionstone.ru
lisfx.com

Кому данное количество покажется недостаточным, могут продолжить поиски самостоятельно.
На вопросе особенностей торговли бинарными опционами я останавливаться не буду, все это освящено в данном разделе: am2.opentraders.ru/26773.html

Открытие демо счета и установка терминала, я думаю также не вызовет у вас затруднений.

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


//+------------------------------------------------------------------+
//|                                                       Option.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Lot          = 5;   // лот
extern int    StopLoss     = 400; // лось
extern int    TakeProfit   = 800; // язь
extern int    Slip         = 30;  // проскальзывание
extern int    Magic        = 111; // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    res;
   double bid=MarketInfo(OrderSymbol(),MODE_BID);
   double ask=MarketInfo(OrderSymbol(),MODE_ASK);
//--- sell 
   if(High[1]<High[2] && High[3]<High[2])
     {
      res=OrderSend(Symbol(),OP_SELL,Lot,
      NormalizeDouble(bid,Digits),Slip,
      NormalizeDouble(bid+StopLoss*Point,Digits),
      NormalizeDouble(bid-TakeProfit*Point,Digits),
      "",Magic,0,Red);
      return;
     }
//--- buy 

   if(Low[1]>Low[2] && Low[3]>Low[2])
     {
      res=OrderSend(Symbol(),OP_BUY,Lot,
      NormalizeDouble(ask,Digits),Slip,
      NormalizeDouble(ask-StopLoss*Point,Digits),
      NormalizeDouble(ask+TakeProfit*Point,Digits),
      "",Magic,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1) OpenPos();
  }
//+------------------------------------------------------------------+



Начнем переделывать советник с настроек.


//--- Inputs
extern double Lot          = 5;   // лот
extern int    StopLoss     = 400; // лось
extern int    TakeProfit   = 800; // язь
extern int    Slip         = 30;  // проскальзывание
extern int    Magic        = 111; // магик


Три строчки в середине нам не понадобятся вообще, убираем их, остается такой код:


//--- Inputs
extern double Lot          = 5;   // лот
extern int    Magic        = 111; // магик


Переменную Lot я предпочел назвать Stavka и в комментарии подписать «ставка в валюте».
Далее добавим в настройки время истечения ставки:


extern string Expiration   = "5"; // время истечения в минутах


Для брокера "Grand Capital" есть возможность указания точного времени экспирации. Например:

11H45m — опцион будет принят на 11 часов 45 минут;
1hour 10 Min 33 sec – опцион будет принят на 1 час, 10 минут и 33 секунды;
23:11:45 — экспирация опциона произойдет в 23:11:45;
14Hour :11m – экспирация произойдет в 14 часов 11 минут.

Сейчас наши настройки будут выглядеть следующим образом:


//--- Inputs
extern double Stavka       = 5;   // ставка в валюте
extern string Expiration   = "5"; // время истечения в минутах
extern int    Magic        = 111; // магик


Теперь Займемся модификацией торговой функции:


//--- sell 
   if(High[1]<High[2] && High[3]<High[2])
     {
      res=OrderSend(Symbol(),OP_SELL,Lot,
      NormalizeDouble(bid,Digits),Slip,
      NormalizeDouble(bid+StopLoss*Point,Digits),
      NormalizeDouble(bid-TakeProfit*Point,Digits),
      "",Magic,0,Red);
      return;
     }
//--- buy 

   if(Low[1]>Low[2] && Low[3]>Low[2])
     {
      res=OrderSend(Symbol(),OP_BUY,Lot,
      NormalizeDouble(ask,Digits),Slip,
      NormalizeDouble(ask-StopLoss*Point,Digits),
      NormalizeDouble(ask+TakeProfit*Point,Digits),
      "",Magic,0,Blue);
      return;
     }
//---


Вместо проскальзывания и стопов поставим нолики, а переменную Lot назовем Stavka, в поле для комментов "" вставим время экспирации из настроек Expiration. И вот наша торговая функция приняла такой компактный вид:


//--- sell 
   if(High[1]<High[2] && High[3]<High[2])
     {
      res=OrderSend(Symbol(),OP_SELL,Stavka,bid,0,0,0,Expiration,Magic,0,Red);
      return;
     }
//--- buy 

   if(Low[1]>Low[2] && Low[3]>Low[2])
     {
      res=OrderSend(Symbol(),OP_BUY,Stavka,ask,0,0,0,Expiration,Magic,0,Blue);
      return;
     }
//---


Больше ничего менять не нужно и можно скомпилировать наш код в MetaEditor и ставить на график опционов "Выше Ниже".


//+------------------------------------------------------------------+
//|                                                       Option.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Stavka       = 5;   // ставка в валюте
extern string Expiration   = "5"; // время истечения в минутах
extern int    Magic        = 111; // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    res;
   double bid=MarketInfo(OrderSymbol(),MODE_BID);
   double ask=MarketInfo(OrderSymbol(),MODE_ASK);
//--- sell 
   if(High[1]<High[2] && High[3]<High[2])
     {
      res=OrderSend(Symbol(),OP_SELL,Stavka,bid,0,0,0,Expiration,Magic,0,Red);
      return;
     }
//--- buy 

   if(Low[1]>Low[2] && Low[3]>Low[2])
     {
      res=OrderSend(Symbol(),OP_BUY,Stavka,ask,0,0,0,Expiration,Magic,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1) OpenPos();
  }
//+------------------------------------------------------------------+




П.С. Если у вас не получается переделать советник или вы больше доверяете это дело специалистам, добро пожаловать в Стол Заказов. :) 
  • +3
  • Просмотров: 20799
  • 16 сентября 2015, 13:46
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Создание символьных ссылок в системе Windows
06 сентября 2015
02 октября 2015

Комментарии (20)

+
0
Вот молодец Андрей, правильный вектор. Прям мысли читаешь. Спасибо за топик.
Попробую-ка теперь по колдовать. Может удастся зачаровать пару сов.
avatar

  10  session Сообщений: 165

  • 16 сентября 2015, 13:52
+
0
Вот вставил в код
extern string Expiration = «5»; // время истечения в минутах
А что и где еще нужно прописать что бы заработало?
//+------------------------------------------------------------------+
//|                                                       Cliker.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

#include <stdlib.mqh>

//--- Inputs
extern string Expiration = «5»; // время истечения в минутах
extern int    StopLoss      = 500;       //стоплосс рыночного ордера
extern int    TakeProfit    = 500;       //тейкпрофит рыночного ордера
extern int    OrdersType    = 0;         //0-ВЫКЛ. 1-Sell 2-buy
extern int    BuyInterval   = 5;         //интервал в секундах для бай
extern int    SellInterval  = 5;         //интервал в секундах для селл
extern int    Slip          = 30;        //проскальзывание
extern int    Count         = 10;        //чило открываемых ордеров
extern int    Magic         = 20150613;  //магик
extern double Lots          = 0.1;       //лот

int res,err;
double sl,tp;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   Comment("");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   double BID=MarketInfo(Symbol(),MODE_BID);
   double ASK=MarketInfo(Symbol(),MODE_ASK);
//--- sell 
   if(OrdersType==2)
     {
      if(StopLoss==0) sl=0; else sl=BID+StopLoss*Point;
      if(TakeProfit==0) tp=0; else tp=BID-TakeProfit*Point;
      res=OrderSend(Symbol(),OP_SELL,Lots,fND(BID),Slip,fND(sl),fND(tp),"ОРДЕР SELL",Magic,0,Red);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      Sleep(SellInterval*1000);
     }

   if(OrdersType==1)
     {
      //--- buy 
      if(StopLoss==0) sl=0; else sl=ASK-StopLoss*Point;
      if(TakeProfit==0) tp=0; else tp=ASK+TakeProfit*Point;
      res=OrderSend(Symbol(),OP_BUY,Lots,fND(ASK),Slip,fND(sl),fND(tp),"ОРДЕР BUY",Magic,0,Blue);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      Sleep(BuyInterval*1000);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(CountTrades()<Count) OpenPos();
   Comment("\n Открыто позиций ",CountTrades());
//---
  }
//+------------------------------------------------------------------+

Редактирован: 16 сентября 2015, 15:10
avatar

  10  session Сообщений: 165

  • 16 сентября 2015, 14:57
+
0
Торговую функцию еще нужно править, где OrderSend(...);
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 16 сентября 2015, 15:07
+
0
Просто через запятую влепить Expiration?
avatar

  10  session Сообщений: 165

  • 16 сентября 2015, 15:13
+
0
Да вместо коммента
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 16 сентября 2015, 15:15
+
0
У меня там нет комента.
Так выдает ошибку.
<code>res=OrderSend(Symbol(),OP_BUY,Lots,fND(ASK),Slip,fND(sl),fND(tp),"ОРДЕР BUY",Expiration,Magic,0,Blue);</code>

Если бы был в советнике комент то его и так можно бы было использовать для экспирации.
Редактирован: 16 сентября 2015, 15:17
avatar

  10  session Сообщений: 165

  • 16 сентября 2015, 15:16
+
+1
Вместо «ОРДЕР BUY». Только смотрите внимательно за параметрами, сравнивайте с рабочим кодом:


res=OrderSend(Symbol(),OP_SELL,Lot(),pr,Slip,sl,tp,"",Magic,0,Red);



res=OrderSend(Symbol(),OP_BUY,Lots,fND(ASK),Slip,fND(sl),fND(tp),Expiration,Magic,0,Blue);
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 16 сентября 2015, 15:30
+
0
Спасибо, Андрей, все получилось.
Отличная тема для нас — люмпинов.
avatar

  10  session Сообщений: 165

  • 16 сентября 2015, 16:08
+
0
Спасибо за инструкцию :) 

Можете подсказать, как добавить мартингейл в советник?
avatar

  14  beton2011 Сообщений: 895

  • 21 сентября 2015, 19:31
+
0
Можете подсказать, как добавить мартингейл в советник?


По этому поводу тоже есть статья: mql.opentraders.ru/1663.html
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 21 сентября 2015, 20:16
+
0
А на бинарах будет работать?

Я переделал советник под бинары, ордера открываются но не работает мартингейл встроенный в советнике.
avatar

  14  beton2011 Сообщений: 895

  • 21 сентября 2015, 20:27
+
0
Это нужно смотреть, что там работает а что нет.
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 21 сентября 2015, 20:29
+
0
Статья хорошая, но на БО не работает.
avatar

  0  OLEG2017 Сообщений: 4

  • 24 декабря 2017, 18:03
+
0
вопрос такой, в тестере стратегий можно гонять такой советник? У меня выдает ошибку при открытии ордера «tester cannot calculate prices»
avatar

  0  bear001 Сообщений: 2

  • 10 июля 2016, 20:20
+
0
Для бинаров я отдельные функции пишу, чтобы прибыльность проверить.
avatar

  34  AM2 Автор Сообщений: 15880 - Андрей

  • 10 июля 2016, 21:09
+
0
я тоже пишу, просто думал можно ли стандартным тестером при тестировании открывать ордера.
avatar

  0  bear001 Сообщений: 2

  • 10 июля 2016, 21:28
+
0
Отдельную функцию для тестирования вы имеете в виду? Или отдельная функция для мартина?
avatar

  0  OLEG2017 Сообщений: 4

  • 24 декабря 2017, 18:00
+
0
Добавьте мартина плиз. ( 
avatar

  14  Syte Сообщений: 399

  • 1 марта 2017, 21:46
+
0
Вроде сделал как написано, а не работает мартин. Выставляет тем же объемом
//+------------------------------------------------------------------+
//| Option.mq4                                                       |
//| Copyright 2015, AM2                                              |
//| www.forexsystems.biz                                             |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link "www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots     = 1;   // ставка в валюте
extern string Expiration = "BO exp:60"; // время истечения в минутах
extern int    Magic      = 111; // магик

int LossCount = 0;
double LotsArray[]={1,2,4,8,16,32,64,128};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int res;
   double bid=MarketInfo(OrderSymbol(),MODE_BID);
   double ask=MarketInfo(OrderSymbol(),MODE_ASK);
   
   
//--- sell 
   if(High[1]<High[2] && High[3]<High[2])
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble (bid,Digits),0,0,0,Expiration,Magic,0,Red);
      return;
     }
//--- buy 

   if(Low[1]>Low[2] && Low[3]>Low[2])
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble (ask,Digits),0,0,0,Expiration,Magic,0,Blue);
      return;
     }
//---

  }
    double Lots()
 {
   double Lot = Lots;
   int total = OrdersHistoryTotal();
   for (int i = 0; i < total; i++)
    {
     OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
       {
         if (OrderProfit() > 0)
          {
            Lot=LotsArray[0];
            LossCount = 0;    
          }         
          else
           {
            Lot=LotsArray[LossCount+1];
            LossCount++;
           }
       }
    }
   return(Lot);
}

//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
 

//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1) OpenPos();
  }
//+------------------------------------------------------------------+
avatar

  14  Syte Сообщений: 399

  • 1 марта 2017, 21:51
+
0
И всё же: есть кто нибудь у кого получилось прикрутить мартина на БО в MT4?
avatar

  0  OLEG2017 Сообщений: 4

  • 24 декабря 2017, 17:56

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари