Wie ich meinen Berater durch Versuch und Irrtum zusammenstelle - Seite 42

 

Ich werde dem Expert Advisor eine weitere Funktion hinzufügen

Manchmal ist es notwendig, die Linie nicht sofort auszulösen, sondern erst dann, wenn sie den Balken überschritten und fixiert hat.

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

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

 
Aleksandr Klapatyuk:

Ich werde dem Expert Advisor eine weitere Funktion hinzufügen

Manchmal ist es notwendig, die Linie nicht sofort auszulösen, sondern erst, wenn sie den Balken überschritten und fixiert hat.

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

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

irgendwie betrogen -

von der Trendlinie - wenn sie sich kreuzt und der Balken dort bleibt, wird das Signal ausgelöst

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

Test

ein anderer Indikator hat geschummelt - obere und untere horizontale Linie, mittlere Trendlinie

Demo-Version - wie es in Kombination mit diesem Indikator funktioniert

Foto von

Wenn die grüne Linie zusammen mit der blauen Linie verläuft, wäre das in Ordnung.

 

eine andere Version für den Test

Es gibt jetzt drei Trendlinien im Indikator, und der Expert Advisor eröffnet eine Position aus diesen Linien.

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

Foto von

 
Aleksandr Klapatyuk:

eine andere Version für den Test

Jetzt gibt es drei Trendlinien im Indikator, und der Expert Advisor eröffnet Positionen anhand dieser Linien


Hier ist eine Version - wie ich es gemacht habe - es funktioniert vollständig mit den Trendlinien, die Sie manuell gezeichnet haben

die Einstellungen - die sie hat

//---
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. Дальнейшие уточнения свойств созданного объекта возможно с помощью функций по работе с графическими объектами.
Dateien:
0002.mq5  28 kb
 
Aleksandr Klapatyuk:

hier ist die Version - wie ich es gemacht habe - es ist voll funktionsfähig von den Trendlinien, die Sie manuell zeichnen

die Einstellungen, die er hat.

keine Möglichkeit, es einzurichten - und kein Makler wird Sie sich anmelden lassen

Schnappschuss2

 
Aleksandr Klapatyuk:

hier ist die Version - wie ich es gemacht habe - es ist voll funktionsfähig von den Trendlinien, die Sie manuell zeichnen

die Einstellungen, die es hat.

Scheint ein guter Indikator zu sein

Experte ohne Einstellungen - gibt ein Ergebnis dieses Indikators2 Obj Volatility_StepChannel.mq5

Schnappschuss3

 

hinzugefügt, Anzahl der Positionen, nach einer Seite offen

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

hinzugefügt, Anzahl der Positionen, nach einer Seite offen

hinzugefügt von der durchschnittlichen Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von der aus Sie einen Befehl setzen können

Es gibt noch einige weitere Anpassungen

//---
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
//---

Schuss4

Dateien:
0004.mq5  78 kb
 
Aleksandr Klapatyuk:

hinzugefügt von der mittleren Trendlinie - wenn sie geöffnet wird, zeichnet sie eine horizontale Linie, die sich hinter dem Preis bewegt und von diesem aus befohlen werden kann

Es gibt ein bisschen mehr Anpassung

Ich habe auch einige Optionen hinzugefügt - von der Trendlinie gibt es eine Option, um horizontale Linien in einem bestimmten Abstand zu zeichnen

//---
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
//---

Foto von

um zu vermeiden, dass horizontale Linien hervortreten, sollte Null eingestellt werden

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

Ein paar weitere Optionen - von der Trendlinie gibt es eine Option, um horizontale Linien in einem bestimmten Abstand zu entfernen

um zu verhindern, dass horizontale Linien ausfallen, sollte Null eingestellt werden


eine weitere Option aus der horizontalen Linie

zu testen - Sie benötigen diesen Indikatorhttps://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)

Schnappschuss2

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