How I assemble my advisor by trial and error - page 42

 

I will add another function to the Expert Advisor

sometimes it is necessary not to immediately trigger the line, but when it has crossed and fixed the bar

https://www.mql5.com/ru/forum/310846/page9#comment_11404620

https://www.mql5.com/ru/code/25309

 
Aleksandr Klapatyuk:

I will add another function to the Expert Advisor

sometimes it is necessary not to immediately trigger the line, but when it has crossed and fixed the bar

https://www.mql5.com/ru/forum/310846/page9#comment_11404620

https://www.mql5.com/ru/code/25309

kind of cheated -

from the trend line - if it crosses and the bar remains there, the signal will go off

input string   t10="----- Trend Line Name ------";      // Trend Line Name
input string   InpNameAverage          = "AVERAGE 0";   // Trend Line Name Средняя
//---

test

another indicator has cheated - upper and lower Horizontal line, middle Trend line

demonstration version - how it works in combination with this indicator

Photo by

If the green line goes together with the blue one, it would be fine.

 

another version for the test

there are now three trend lines in the indicator and the Expert Advisor opens a position from them

input string   t10="----- Trend Line Name ------";      // Trend Line Name
input string   InpNameAverage          = "AVERAGE 0";   // Trend Line Name
input string   InpNameAverage0         = "TOP 0";       // Trend Line Name
input string   InpNameAverage1         = "LOWER 0";     // Trend Line Name

Photo by

 
Aleksandr Klapatyuk:

another version for the test

Now there are three trend lines in the indicator and the Expert Advisor opens positions from them


Here's a version - how I did it - it is fully working from the trend lines which you drew manually

the settings - which it has

//---
input double InpLots          = 0.1;           // Lots
input int    InpTakeProfit    = 50;            // Take Profit (in pips)
input string t0="----- Trend Line Name ------";// Trend Line Name
input string InpNameAverage   = "AVERAGE 0";   // Trend Line Name
input string InpNameAverage0  = "TOP 0";       // Trend Line Name
input string InpNameAverage1  = "LOWER 0";     // Trend Line Name
//---
//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version     "5.50"
#property description "It is important to make sure that the expert works with a normal"
#property description "chart and the user did not make any mistakes setting input"
#property description "variables (Lots, TakeProfit, TrailingStop) in our case,"
#property description "we check TakeProfit on a chart of more than 2*trend_period bars"

#define  MACD_MAGIC 1234502
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
input double InpLots          = 0.1;           // Lots
input int    InpTakeProfit    = 50;            // Take Profit (in pips)
input string t0="----- Trend Line Name ------";// Trend Line Name
input string InpNameAverage   = "AVERAGE 0";   // Trend Line Name
input string InpNameAverage0  = "TOP 0";       // Trend Line Name
input string InpNameAverage1  = "LOWER 0";     // Trend Line Name
//---
datetime ExtLastINAverage         = 0; // "0" -> D'1970.01.01 00:00';
datetime ExtLastINAverage0        = 0; // "0" -> D'1970.01.01 00:00';
datetime ExtLastINAverage1        = 0; // "0" -> D'1970.01.01 00:00';
datetime ExtPrevBars              = 0; // "0" -> D'1970.01.01 00:00';
//---
int ExtTimeOut=10; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| MACD Sample expert class                                         |
//+------------------------------------------------------------------+
class CSampleExpert
  {
protected:
   double            m_adjusted_point;             // point value adjusted for 3 or 5 points
   CTrade            m_trade;                      // trading object
   CSymbolInfo       m_symbol;                     // symbol info object
   CPositionInfo     m_position;                   // trade position object
   CAccountInfo      m_account;                    // account info wrapper
   //--- indicators
   int               m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double            m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double            m_ema_current;
   double            m_ema_previous;
   //---
   double            m_take_profit;

public:
                     CSampleExpert(void);
                    ~CSampleExpert(void);
   bool              Init(void);
   void              Deinit(void);
   bool              Processing(void);

protected:
   bool              InitIndicators(void);
   bool              TrendOpened(void);
   bool              TrendOpened0(void);
   bool              TrendOpened1(void);
  };
//--- global expert
CSampleExpert ExtExpert;
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CSampleExpert::CSampleExpert(void) : m_adjusted_point(0),
   m_handle_ema(INVALID_HANDLE),
   m_ema_current(0),
   m_ema_previous(0),
   m_take_profit(0)
  {
   ArraySetAsSeries(m_buff_EMA,true);
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSampleExpert::~CSampleExpert(void)
  {
  }
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters                 |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- initialize common information
   m_symbol.Name(Symbol());                  // symbol
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
   m_take_profit     =InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints(3*digits_adjust);
//---
   if(!InitIndicators())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Initialization of the indicators                                 |
//+------------------------------------------------------------------+
bool CSampleExpert::InitIndicators(void)
  {
//--- create EMA indicator and add it to collection
   if(m_handle_ema==INVALID_HANDLE)
      if((m_handle_ema=iCustom(m_symbol.Name(),Period(),"2 Obj Volatility_StepChannel"))==INVALID_HANDLE)
        {
         printf("Error creating EMA indicator");
         return(false);
        }
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::TrendOpened(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   if(ObjectFind(0,InpNameAverage)<0)
      return(true);

   MqlRates ratesAverage[];
   ArraySetAsSeries(ratesAverage,true);
   int start_pos=0,count=3;
   if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
      return(false);

   if(ratesAverage[0].time==ExtLastINAverage)
      return(true);

   double value_by_time=ObjectGetValueByTime(0,InpNameAverage,ratesAverage[1].time);
   if(value_by_time==0.0)
      return(true);

   if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
     {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- open position
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }
      res=true;
     }
   if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
     {
      double price=m_symbol.Bid();
      double tp   =m_symbol.Ask()-m_take_profit;
      if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::TrendOpened0(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   if(ObjectFind(0,InpNameAverage0)<0)
      return(true);

   MqlRates ratesAverage[];
   ArraySetAsSeries(ratesAverage,true);
   int start_pos=0,count=3;
   if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
      return(false);

   if(ratesAverage[0].time==ExtLastINAverage0)
      return(true);

   double value_by_time=ObjectGetValueByTime(0,InpNameAverage0,ratesAverage[1].time);
   if(value_by_time==0.0)
      return(true);

   if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
     {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- open position
      if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }
      res=true;
     }
   if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
     {
      double price=m_symbol.Bid();
      double tp   =m_symbol.Ask()-m_take_profit;
      if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::TrendOpened1(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   if(ObjectFind(0,InpNameAverage1)<0)
      return(true);

   MqlRates ratesAverage[];
   ArraySetAsSeries(ratesAverage,true);
   int start_pos=0,count=3;
   if(CopyRates(m_symbol.Name(),Period(),start_pos,count,ratesAverage)!=count)
      return(false);

   if(ratesAverage[0].time==ExtLastINAverage1)
      return(true);

   double value_by_time=ObjectGetValueByTime(0,InpNameAverage1,ratesAverage[1].time);
   if(value_by_time==0.0)
      return(true);

   if(ratesAverage[1].open<value_by_time && ratesAverage[1].close>value_by_time)
     {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- open position
      if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }
      res=true;
     }
   if(ratesAverage[1].open>value_by_time && ratesAverage[1].close<value_by_time)
     {
      double price=m_symbol.Bid();
      double tp   =m_symbol.Ask()-m_take_profit;
      if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
         printf("Position by %s to be opened",m_symbol.Name());
      else
        {
         printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Open parameters : price=%f,TP=%f",price,tp);
        }      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool CSampleExpert::Processing(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- refresh indicators
   if(BarsCalculated(m_handle_ema)<2)
      return(false);
   if(CopyBuffer(m_handle_ema,0,0,2,m_buff_EMA)!=2)
      return(false);
//   m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
   m_ema_current    =m_buff_EMA[0];
   m_ema_previous   =m_buff_EMA[1];
//--- it is important to enter the market correctly,
//--- but it is more important to exit it correctly...
//--- first check if position exists - try to select it
//--- no opened position identified
//--- no opened position identified
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==ExtPrevBars)
      return(true);
   ExtPrevBars=time_0;
     {
      //--- try to close or modify long position
      if(TrendOpened()||TrendOpened0()||TrendOpened1())
         return(true);
     }
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- create all necessary objects
   if(!ExtExpert.Init())
      return(INIT_FAILED);
//--- secceed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert new tick handling function                                |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   static datetime limit_time=0; // last trade processing time + timeout
//--- don't process if timeout
   if(TimeCurrent()>=limit_time)
     {
      //--- check for data
      if(Bars(Symbol(),Period())>2*0)
        {
         //--- change limit time by timeout in seconds if processed
         if(ExtExpert.Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
При создании графического объекта функцией ObjectCreate() необходимо указать тип создаваемого объекта, который может принимать одно из значений перечисления ENUM_OBJECT. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
Files:
0002.mq5  28 kb
 
Aleksandr Klapatyuk:

here's the version - how I did it - it's fully operational from the trend lines you draw manually

the settings that it has.

no way! - to set it up - and no broker will let you sign up

Snapshot2

 
Aleksandr Klapatyuk:

here's the version - how I did it - it's fully operational from the trend lines you draw manually

the settings that it has.

Looks like a good indicator

Expert without settings - gives a result of this indicator2 Obj Volatility_StepChannel.mq5

Snapshot3

 

added, number of positions, open to one side

input uint   maxLimits        = 1;             // Кол-во Позиции Открыть в одну сторону
input double InpLots          = 0.1;           // Lots
input int    InpTakeProfit    = 50;            // Take Profit (in pips)
Files:
0003.mq5  29 kb
 
Aleksandr Klapatyuk:

added, number of positions, open to one side

added from the average Trend line - when opened, it draws a Horizontal line it moves behind the price and from it you can set a command

there are a few more adjustments

//---
input uint   maxLimits                   = 1;             // Кол-во Позиции Открыть в одну сторону
input double InpLots                     = 0.1;           // Lots
input int    InpTakeProfit               = 50;            // Take Profit (in pips)
input string t0="----- Trend Line Name ------";           // Trend Line Name
input string InpNameAverage              = "AVERAGE 0";   // Trend Line Name
input string InpNameAverage0             = "TOP 0";       // Trend Line Name
input string InpNameAverage1             = "LOWER 0";     // Trend Line Name
input string t1="---   Obj:Trailing Line --- ";           // Trailing Obj:Line
input string InpObjUpName                = "BUY";         // Obj: TOP (Horizontal Line) ВВЕРХУ
input ENUM_TRADE_COMMAND InpTradeCommand = open_sell;     // Obj:  command:
input string InpObjDownName              = "SELL";        // Obj: LOWER (Horizontal Line) ВНИЗУ
input ENUM_TRADE_COMMAND InTradeCommand  = open_buy;      // Obj:  command:
input ushort InpObjTrailingStop          = 25;            // Obj: Trailing Stop (distance from price to object, in pips)
input ushort InpObjTrailingStep          = 5;             // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string t2="------ Obj: Revers Buy and Sell --";     // Obj: Revers Buy and Sell
input bool   ObjRevers                   = false;         // Obj: Revers
//---

Shot4

Files:
0004.mq5  78 kb
 
Aleksandr Klapatyuk:

added from the mid-trend line - when opened, it draws a Horizontal line that moves behind the price and can be commanded from it

There's a little bit more adjustment

I also added some options - from the trend line there is an option to draw horizontal lines at a given distance

//---
input uint   maxLimits                   = 1;             // Кол-во Позиции Открыть в одну сторону
input double InpLots                     = 0.1;           // Lots
input int    InpTakeProfit               = 50;            // Take Profit (in pips)
input string t0="----- Trend Line Name ------";           // Trend Line Name
input string InpNameAverage              = "AVERAGE 0";   // Trend Line Name
input bool   InpObjHLine                 = false;         // Obj: HLine
input string InpNameAverage0             = "TOP 0";       // Trend Line Name
input bool   InpObjHLine0                = false;         // Obj: HLine
input string InpNameAverage1             = "LOWER 0";     // Trend Line Name
input bool   InpObjHLine1                = false;         // Obj: HLine
input string t1="---   Obj:Trailing Line --- ";           // Trailing Obj:Line
/*
input string InpObjUpNamex               = "BUYx";        // Obj: TOP (Horizontal Line) ВВЕРХУ
input string InpObjDownNamex             = "SELLx";       // Obj: LOWER (Horizontal Line) ВНИЗУ
*/
input int    InpStep                     = 15;            // Obj: Шаг сетки, пунктов("0" -> false)
input string InpObjUpName                = "BUY";         // Obj: TOP (Horizontal Line) ВВЕРХУ
input ENUM_TRADE_COMMAND InpTradeCommand = open_buy;      // Obj:  command:
input string InpObjDownName              = "SELL";        // Obj: LOWER (Horizontal Line) ВНИЗУ
input ENUM_TRADE_COMMAND InTradeCommand  = open_sell;     // Obj:  command:
input ushort InpObjTrailingStop          = 25;            // Obj: Trailing Stop (distance from price to object, in pips)
input ushort InpObjTrailingStep          = 5;             // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string t2="------ Obj: Revers Buy and Sell --";     // Obj: Revers Buy and Sell
input bool   ObjRevers                   = false;         // Obj: Revers
//---

Photo by

to avoid horizontal lines popping out - zero should be set

input int    InpStep                     = 15;            // Obj: Шаг сетки, пунктов("0" -> false)
input ushort InpObjTrailingStop          = 25;            // Obj: Trailing Stop (distance from price to object, in pips)
Files:
0005.mq5  84 kb
 
Aleksandr Klapatyuk:

A few more options - from the trend line there is an option to drop horizontal lines at a given distance

to prevent horizontal lines from dropping out - zero should be set


another option from the horizontal line

to test - you need this indicatorhttps://www.mql5.com/ru/code/1114

input string t1="---   Obj:Trailing Line --- ";           // Trailing Obj:Line
input string InpObjUpNamex               = "R2";          // Obj: TOP (Horizontal Line) ВВЕРХУ
input string InpObjDownNamex             = "S2";          // Obj: LOWER (Horizontal Line) ВНИЗУ
input int    InpStep                     = 15;            // Obj: Шаг сетки, пунктов("0" -> false)

Snapshot2

Pivot Lines TimeZone
Pivot Lines TimeZone
  • www.mql5.com
Индикатор рисует уровни Pivot, промежуточные уровни Pivot и уровни Camarilla. Уровни могут отображаться индикаторными буферами (по всей истории) и/или только текущие уровни горизонтальными линиями. DayStartHour - Час времени начала дня. DayStartMinute - Минуты времени начала дня. PivotsBufers - Отображать уровни Pivot индикаторными буферами...
Files:
0006.mq5  87 kb