Как начать работу с MQL5 - страница 3

 

Простой советник со стоп-лоссом и тейк-профитом

Пример простого совет ника, который открывает одну позицию с указанными стоп-лоссом и тейк-профитом.


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

Стоп-лосс и тейк-профит


Переменные, объявленные на глобальном уровне программы (в "заголовке" советника):

Для отправки торговых приказов используйте торговый класс CTrade

#property version   "1.000"
//---
#include <Trade\Trade.mqh>
//---
CTrade         m_trade;                         // object of CTrade class
//--- input parameters


Входные параметры:

Я всегда предпочитаю устанавливать уровни Stop Loss и Take Profit в целых типах (точнее в 'ushort')

//--- input parameters
input ushort   InpStopLoss          = 150;      // Stop Loss, in points (1.00045-1.00055=10 points)
input ushort   InpTakeProfit        = 460;      // Take Profit, in points (1.00045-1.00055=10 points)
input ulong    InpMagic             = 200;      // Magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |


OnTick:

По PositionsTotal определяем, есть ли позиции или нет. Если позиций нет, то сначала получаем свежие цены (делаем это с помощью SymbolInfoTick). Внимание: это очень простая версия - здесь не так много необходимых проверок!

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(PositionsTotal()==0)
     {
      MqlTick tick;
      if(SymbolInfoTick(Symbol(),tick))
        {
         double sl=(InpStopLoss==0.0)?0.0:tick.ask-InpStopLoss*Point();
         double tp=(InpTakeProfit==0.0)?0.0:tick.ask+InpTakeProfit*Point();
         m_trade.Buy(0.01,Symbol(),tick.ask,sl,tp);
        }
     }
  }


Результат:

Простой советник со стоп-лоссом и тейк-профитом

Introduction to MQL5: How to write simple Expert Advisor and Custom Indicator
Introduction to MQL5: How to write simple Expert Advisor and Custom Indicator
  • www.mql5.com
MetaQuotes Programming Language 5 (MQL5), included in MetaTrader 5 Client Terminal, has many new possibilities and higher performance, compared to MQL4. This article will help you to get acquainted with this new programming language. The simple examples of how to write an Expert Advisor and Custom Indicator are presented in this article. We...
 

Создание хэндла индикатора iMA, получение значений индикатора

(Код: iMA Values on a Chart.mq5)

Главное правило: хэндл индикатора нужно получить один раз (оптимально сделать это в функции OnInit).

Входные параметры и переменная, в которой хранится хэндл индикатора:

//+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property version   "1.00"
//--- input parameters
input int                  Inp_MA_ma_period     = 12;          // MA: averaging period
input int                  Inp_MA_ma_shift      = 5;           // MA: horizontal shift
input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_SMA;    // MA: smoothing type
input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price
//---
int    handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |


Создание хэндла(проверка результата)

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }


Получение значений (я использую общую функцию iGetArray). Обратите внимание: для массива"array_ma" я использую"ArraySetAsSeries" - в этом случае в массиве "array_ma" элемент с индексом "0" соответствует самому правому бару на графике (bar # 0)

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double array_ma[];
   ArraySetAsSeries(array_ma,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,array_ma))
      return;

   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_ma[i],Digits()+1)+"\n";
//---
   Comment(text);
  }


Результат работы:

Значения iMA на графике

Рис. 1. Получение значений на барах #0, #1, #2



Файлы:
 

Простой советник iRSI

(Код: iRSI simple advisor)

Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.

Простой советник iRSI

//+------------------------------------------------------------------+
//|                                          iRSI simple advisor.mq5 |
//+------------------------------------------------------------------+
#property version   "1.005"
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                         // trading object
//--- input parameters
input int                  Inp_RSI_ma_period       = 14;          // RSI: averaging period 
input ENUM_APPLIED_PRICE   Inp_RSI_applied_price   = PRICE_CLOSE; // RSI: type of price
input double               Inp_RSI_Level_UP        = 70;          // RSI Level UP
input double               Inp_RSI_Level_DOWN      = 30;          // RSI Level DOWN
//---
int      handle_iRSI;                           // variable for storing the handle of the iRSI indicator
datetime m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iRSI
   handle_iRSI=iRSI(Symbol(),Period(),Inp_RSI_ma_period,Inp_RSI_applied_price);
//--- if the handle is not created 
   if(handle_iRSI==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iRSI indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
//---
   double rsi_1=iRSIGet(1);
   if(rsi_1==EMPTY_VALUE)
      return;
//---
   if(rsi_1>Inp_RSI_Level_UP)
      m_trade.Sell(1.0);
   else if(rsi_1<Inp_RSI_Level_DOWN)
      m_trade.Buy(1.0);
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
int d=0;
  }
//+------------------------------------------------------------------+
//| Get value of buffers for the iRSI                                |
//+------------------------------------------------------------------+
double iRSIGet(const int index)
  {
   double RSI[1];
//--- reset error code 
   ResetLastError();
//--- fill a part of the iRSI array with values from the indicator buffer that has 0 index 
   if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(EMPTY_VALUE);
     }
   return(RSI[0]);
  }
//+------------------------------------------------------------------+

Файлы:
 
Vladimir Karputov:

Простой советник iRSI

Советник работает только на новом баре. Сигнал для открытия позиции BUY: rsi на баре # 1> 'RSI Level UP'. Сигнал для открытия позиции SELL: rsi на баре № 1 < 'RSI Level DOWN'.

Да благословит вас Бог. Если вы хотите, чтобы сделка была заключена на следующем баре после получения подтверждения сигнала. Т.е. заключать сделку на следующем баре после подтверждения сигнала, какой бит кода нужно добавить
 
aodunusi :
Да благословит вас Господь. Если вы хотите, чтобы сделка заключалась на следующем баре после получения подтверждения сигнала. Т.е. заключать сделку на следующем баре после подтверждения сигнала, какой бит кода должен быть добавлен

Я вас не понимаю.

 
Vladimir Karputov:

Я не понимаю вас.

Как только сигнал rsi подтвержден, ордер должен быть взят (покупка или продажа). Мы хотим удерживать ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на той свече, на которой получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.

Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече
 
aodunusi :
Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на свече, на которой мы получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.

Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече

Я не понимаю: Вы советуете мне как торговать? Или вы хотите отложить сигнал (то есть проверить сигнал не на баре №1, а на баре №2)?

 
aodunusi:
Как только сигнал rsi подтвердился, нужно выставить ордер (на покупку или продажу). Мы хотим удерживать этот ордер на покупку до формирования следующей свечи, т.е. мы не торгуем на той свече, на которой получили подтверждение сделки, а на следующей свече, которая формируется / следующей цене открытия.

Как только параметры RSI будут соблюдены, удерживаем ордер на покупку и исполняем его на следующей свече
Торговля на закрытом баре?
Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), верно?

Это значит: торговля на закрытии бара.
Да, большинство систем - это системы "торговли на закрытии бара".
 
Sergey Golubev:
Торговля на закрытом баре?
Это значит: бар с сигналом закрывается и открывается новый бар - и мы можем открыть сделку после этого (если предыдущий бар с сигналом еще существует), правильно?

Это значит: торговля на закрытии бара.
Да, большинство систем - это системы "торговли на закрытом баре".
Да, именно это я и имел в виду... Когда есть сигнал, нужно подождать, пока бар закроется, и тогда срабатывает покупка. Пожалуйста, какой код я могу использовать, чтобы включить это?
 
aodunusi :
Да, именно это я и имел в виду... Когда есть сигнал, подождите, пока бар не закроется, затем сработает покупка. Пожалуйста, какой код я могу использовать, чтобы включить это?

Вам нужно переделать код: запрашивать данные не с одного бара, а с двух. И проверять условие не на одном баре - а на двух.

Это было ) :

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
//---
   double rsi_1=iRSIGet(1);
   if(rsi_1==EMPTY_VALUE)
      return;
//---
   if(rsi_1>Inp_RSI_Level_UP)
      m_trade.Sell(1.0);
   else if(rsi_1<Inp_RSI_Level_DOWN)
      m_trade.Buy(1.0);
  }


Будет:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
//---
   double rsi_2=iRSIGet(2);
   double rsi_1=iRSIGet(1);
   if(rsi_2==EMPTY_VALUE || rsi_1==EMPTY_VALUE)
      return;
//---
   if(rsi_2>Inp_RSI_Level_UP && rsi_1>Inp_RSI_Level_UP)
      m_trade.Sell(1.0);
   else if(rsi_2<Inp_RSI_Level_DOWN && rsi_1<Inp_RSI_Level_DOWN)
      m_trade.Buy(1.0);
  }
How to start with MQL5
How to start with MQL5
  • 2020.03.05
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...