AM2
Андрей

 
Уровень 35

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


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

Рейтинг 280



Как написать простейший советник на MQL4?

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

Для начала сформулируем правила открытия и закрытия позиций.

Торговать будем по валютной паре евродоллар на пятиминутке используя сигналы индикаторов Moving Average и Stochastic. Покупаем, когда Moving Average растет и Stochastic снизился ниже уровня перепроданности. Продаем, когда Moving Average убывает и Stochastic вырос выше уровня перекупленности.

Чтобы облегчить задачу написания эксперта воспользуемся кодом советника Moving Average.mq4 из стандартной библиотеки MetaTrader 4.


//+------------------------------------------------------------------+
//|                                         Moving Average.mq4       |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net  |
//+------------------------------------------------------------------+
#define MAGICMA  20050610

extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 12;
extern double MovingShift        = 6;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                       // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+


Немного изменим шапку эксперта и укажем свои внешние переменные:


//+------------------------------------------------------------------+
//|                                                     alya-bob.mq4 |
//|                                           Copyright © 2011, AM2. |
//|                                             www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, AM2."
#property link      "www.forexsystems.biz"

#define MAGICMA  20110426

extern double StopLoss           = 0.0035;
extern double TakeProfit         = 0.007;
extern double MovingPeriod     = 20;
extern double MovingShift        = 0;
extern int StochOversold         = 30;
extern int StochOverbought      = 70;



Так как советник у нас простейший убираем из кода функции LotsOptimized() для расчета лота и CheckForClose() предназначенную для закрытия позиций при определенном условии.

Далее запишем значения необходимых индикаторов и условия открытия позиций в функции CheckForOpen():


 double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
   double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);
   double ma2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);
   double st=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);

//---- buy 
   if(ma1>ma2 && ma0>ma1  && Close[1]>ma0 && st<StochOversold)  
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }     
 
//---- sell   
   if(ma1<ma2 && ma0<ma1 && Close[1]<ma0 && st>StochOverbought)  
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     



И в завершение нашего задания подкорректируем содержание функции start():


//+------------------------------------------------------------------+
//|              Start function                                      |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
  }
//+------------------------------------------------------------------+



Вот и весь эксперт!


//+------------------------------------------------------------------+
//|                                                     alya-bob.mq4 |
//|                                           Copyright © 2011, AM2. |
//|                                             www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, AM2."
#property link      "www.forexsystems.biz"

#define MAGICMA  20110426

extern double StopLoss           = 0.0035;
extern double TakeProfit         = 0.007;
extern double MovingPeriod       = 20;
extern double MovingShift        = 0;
extern int StochOversold         = 30;
extern int StochOverbought       = 70;
extern double Lots               = 0.1;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average   
   int    res;  
//---- 
   double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double st=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
//---- buy 
   if(ma1>ma2 && ma0>ma1  && Close[1]>ma0 && st<StochOversold)  // Moving  Average растет, Stochastic ниже уровня перепроданности и цена выше Moving  Average
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }      
//---- sell   
   if(ma1<ma2 && ma0<ma1 && Close[1]<ma0 && st>StochOverbought)  // Moving  Average убывает, Stochastic выше уровня перекупленности и цена ниже Moving  Average
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
  }
//+------------------------------------------------------------------+


Удачи вам и больших профитов уважаемые трейдеры и программисты!
  • +3
  • Просмотров: 105150
  • 26 апреля 2011, 10:17
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

+
0
Спасибо за полезный материал, AM2. Под Вашу публикацию создана группа «Программирование на MQL». Теперь материалы, посвященные кодингу, можно размещать в данной группе.
avatar

Inside Сообщений: 986 - модератор

  • 26 апреля 2011, 10:59
+
0
спасибо… буду вникать… так как помочь никто не хочет
avatar

  4  basal24 Сообщений: 66

  • 26 апреля 2011, 15:13
+
0
вы принимаете заказы на разработку?
avatar

  0  shrk Сообщений: 16

  • 26 апреля 2011, 20:17
+
+1
Для меня кодинг только хобби.
Если интересует что то большее обратитесь к профессионалам:
www.mql5.com/ru/job
avatar

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

  • 26 апреля 2011, 21:16
+
0
полезный материал, примного благодарна
avatar

  0  bigma Сообщений: 20 - Bigla

  • 27 апреля 2011, 14:27
+
0
mql4you.ru/- уроки MQL программирования.
avatar

  68  shulgindv Сообщений: 5442

  • 30 апреля 2011, 15:46
+
0
К чему ссылка здесь в чужом уроке? Никто ведь не спрашивает, где еще можно поучится. Или вы говорите автору, что мол можешь не изобретать велосипед, все без тебя есть? Так давайте нахрен на любую тему найдем по ссылке и на любой вопрос будем отправлять в поисковик? Ведь все уже написано переписано без нас.
avatar

  11  pilot Сообщений: 410

  • 30 апреля 2011, 16:51
+
0
Я же не даю ссылку на уроки пилотирования. Автор молодец, напротив я только за то чтобы публиковали данный материал, с удовольствием пытался вникнуть в суть программирования. Ваших тараканов оставьте при себе… Воспользовался ссылкой автора дабы пойти дальше в познании этого ремесла, запутавшись в паутине нашей всемирной сети я наткнулся на сайт заинтересовавший меня. Решил дать ссылку дабы не только мне она может быть полезной… Если администрация посчитает эту ссылку неуместной в данном контексте я не буду против на удаление ее, дабы гнев и критика соплеменников не дает мне спокойно существовать на данной ветке.
avatar

  68  shulgindv Сообщений: 5442

  • 30 апреля 2011, 17:40
+
0
Я же не даю ссылку на уроки пилотирования.

омг, пилотирование то тут причем? Типа попытка сострить? Неудачная попытка…
avatar

  11  pilot Сообщений: 410

  • 1 мая 2011, 17:42
+
0
Полезная ссылка — лишней не будет. Зачем же ругаться.
avatar

  10  vipsa Сообщений: 364 - Вики

  • 30 апреля 2011, 23:59
+
0
Спасибо!!! Статья супер, прям мысли мой читаете, раньше программки писала на С++, говорят похожие языки.
Надо бы попробовать.
avatar

  10  vipsa Сообщений: 364 - Вики

  • 30 апреля 2011, 23:57
+
0
кто реально поможет написать советника?
avatar

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

  • 4 мая 2011, 20:49
+
0
Если система прибыльная, что подтверждается стейтом с реала, то могут и помочь…
avatar

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

  • 4 мая 2011, 21:02
+
0
ничего не пойму писал вместе с уроком как и сказано но после написания компилируется с ошибками, потом поставил создать новый и просто скопировал всё с сайта и вставил, компилирую всё норм *wall* 
перебрал каждую буковку, только что пояснений не было у меня на русском языке всё идентично *wall* 
avatar

  0  palmystry Сообщений: 7

  • 22 апреля 2012, 18:41
+
0
здравствуйте как сделать чтобы можно было машку смещать назад.
avatar

  15  div15 Сообщений: 71 - div15

  • 12 сентября 2012, 05:29
+
0
меняйте параметр:
extern double MovingShift        = 0;
avatar

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

  • 12 сентября 2012, 13:00
+
0
А где все ети коди вставлять не подскажете???
avatar

  21  KORELI Сообщений: 2913 - LUKA

  • 12 сентября 2012, 13:08
+
0
extern double MovingShift = -10;
у меня только смешение вперед. если ставлю смешение назад советник не работает.
avatar

  15  div15 Сообщений: 71 - div15

  • 12 сентября 2012, 13:16
+
0
Извиняюс, можете помочь где все ети коди надо записать?
avatar

  21  KORELI Сообщений: 2913 - LUKA

  • 12 сентября 2012, 13:22
+
0
какие именно коди
avatar

  15  div15 Сообщений: 71 - div15

  • 12 сентября 2012, 13:27
+
0
Спасибо, пытаюсь одолеть пока простейшее.
avatar

  20  Nacha51 Сообщений: 5610 - Наталья

  • 15 сентября 2013, 08:31
+
0
Научу Вас программировать советников на MQL4

Репетитор по программированию на MQL4 для MetaTrader 4
Научу программировать собственные советники, индикаторы, скрипты.
Индивидуальные занятия по скайпу, могу уделять много времени на обучение.
Будем работать до результата. Получите большой практический опыт.
Вместе напишем советника по вашему алгоритму.
Форму обучения выстраиваем индивидуально.
После обучения сможете самостоятельно создавать собственные индикаторы и советники.
Занятия провожу лично, имею большой опыт программирования и трейдинга. Так же есть сертификат программиста MQL 4.
Звоните или пишите прямо сейчас, пообщаемся, отвечу на все вопросы.
Скайп: kresh91
Почта: mql.coach@gmail.com
avatar

  0  mql-coach Сообщений: 2

  • 21 ноября 2014, 19:36
+
0
доброго дня )допоможіть потрібно прописати советнік… щоб виставляв отложені ордера на покупку і продажу. тоді коли закривається свічка 9,30год на 30 минутному графіку… по максимумі і мінімумі свічки виставляються ордера на відстані 5 пунктів.
avatar

  0  uzuk416 Сообщений: 1 - uzuk416

  • 5 февраля 2015, 14:51
+
0
avatar

  45  Bishop Сообщений: 5811 - АЛЬФАХАМЕЦ-Машковод

  • 5 февраля 2015, 15:00
комментарий был удален 2017-02-04 19:31:17 admin

+
0
Первая школа по обучению разработки торговых роботов ...

Не спамь в чужих топиках
avatar

  45  Bishop Сообщений: 5811 - АЛЬФАХАМЕЦ-Машковод

  • 4 февраля 2017, 19:29

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