Questions des débutants MQL5 MT5 MetaTrader 5 - page 710

 
Kirill Andreev:
ne fonctionne pas, malheureusement.
Les méthodes ShortModified et LongModified.
 
Vladimir Karputov:
Les méthodes ShortModified et LongModified.
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_macd;                // MACD indicator handle
   int               m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double            m_buff_MACD_main[];           // MACD indicator main buffer
   double            m_buff_MACD_signal[];         // MACD indicator signal buffer
   double            m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double            m_macd_current;
   double            m_macd_previous;
   double            m_signal_current;
   double            m_signal_previous;
   double            m_ema_current;
   double            m_ema_previous;
   //---
   double            m_macd_open_level;
   double            m_macd_close_level;
   double            m_traling_stop;
   double            m_take_profit;

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

protected:
   bool              InitCheckParameters(const int digits_adjust);
   bool              InitIndicators(void);
   bool              LongClosed(void);
   bool              ShortClosed(void);
   bool              LongModified(void);
   bool              ShortModified(void);
   bool              LongOpened(void);
   bool              ShortOpened(void);
  };

Ils sont inscrits dans la classe. Je dois les ajouter comme une fonction séparée .... ?

Je n'arrive pas à trouver comment les faire. J'ai essayé de trouver des exemples d'ajout de classes de queue existantes, mais je n'en ai trouvé aucun.

 
Kirill Andreev:
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_macd;                // MACD indicator handle
   int               m_handle_ema;                 // moving average indicator handle
   //--- indicator buffers
   double            m_buff_MACD_main[];           // MACD indicator main buffer
   double            m_buff_MACD_signal[];         // MACD indicator signal buffer
   double            m_buff_EMA[];                 // EMA indicator buffer
   //--- indicator data for processing
   double            m_macd_current;
   double            m_macd_previous;
   double            m_signal_current;
   double            m_signal_previous;
   double            m_ema_current;
   double            m_ema_previous;
   //---
   double            m_macd_open_level;
   double            m_macd_close_level;
   double            m_traling_stop;
   double            m_take_profit;

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

protected:
   bool              InitCheckParameters(const int digits_adjust);
   bool              InitIndicators(void);
   bool              LongClosed(void);
   bool              ShortClosed(void);
   bool              LongModified(void);
   bool              ShortModified(void);
   bool              LongOpened(void);
   bool              ShortOpened(void);
  };

Ils sont inscrits dans la classe. Je dois les ajouter comme une fonction séparée .... ?

Je n'arrive pas à trouver comment les faire. J'ai essayé de trouver des exemples d'ajout de classes de queue existantes, mais je n'en ai trouvé aucun.

Il vous suffit de les copier dans votre code.
 
Vladimir Karputov:
Il vous suffit de le copier dans votre code.

void LongModified()
  {

double m_traling_stop=InpTrailingStop*m_adjusted_point;
   bool res=false;
//--- check for trailing stop
   if(InpTrailingStop>0)  
     {
      if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
        {
         double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits());
         double tp=m_position.TakeProfit();
         if(m_position.StopLoss()<sl || m_position.StopLoss()==0.0)
           {
            //--- modify position
            if(m_trade.PositionModify(Symbol(),sl,tp))
               printf("Long position by %s to be modified",Symbol());
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
               printf("Modify parameters : SL=%f,TP=%f",sl,tp);
              }
            //--- modified and must exit from expert
            res=true;
           }
        }
     }
//--- result
   return(res);
  }  

 

 

donne une erreur

La fonction 'return' - 'void' renvoie une valeur traal.mq5 482 4

 
Kirill Andreev:

void LongModified()
  {

double m_traling_stop=InpTrailingStop*m_adjusted_point;
   bool res=false;
//--- check for trailing stop
   if(InpTrailingStop>0)  
     {
      if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
        {
         double sl=NormalizeDouble(m_symbol.Bid()-m_traling_stop,m_symbol.Digits());
         double tp=m_position.TakeProfit();
         if(m_position.StopLoss()<sl || m_position.StopLoss()==0.0)
           {
            //--- modify position
            if(m_trade.PositionModify(Symbol(),sl,tp))
               printf("Long position by %s to be modified",Symbol());
            else
              {
               printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
               printf("Modify parameters : SL=%f,TP=%f",sl,tp);
              }
            //--- modified and must exit from expert
            res=true;
           }
        }
     }
//--- result
   return(res);
  }  

 

 

donne une erreur

La fonction 'return' - 'void' renvoie une valeur traal.mq5 482 4

Vous ne pouvez pas le copier SANS réfléchir. Regardez à nouveau la source originale.
 

Exemple d'un EA : sur un compte hadge, nous ouvrons deux positions opposées en une fois - sans aucun stop.

Il y a deux paramètres dans les réglages de l'EA:

  • TrailingStop (en pips)
  • TrailingStep (en pips)
TrailingStep protège contre les modifications trop fréquentes :

//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "Пример TrailingStop"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort   InpTrailingStop    =10;       // TrailingStop (in pips)
input ushort   InpTrailingStep    =5;        // TrailingStep (in pips)
//---
double         ExtTrailingStop=0.0;
double         ExtTrailingStep=0.0;
ulong          m_magic=15489;                // magic number
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
bool           FirstStart=true;              // true - first start
double         m_adjusted_point;             // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }
   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- 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=digits_adjust*m_symbol.Point();
   ExtTrailingStop=InpTrailingStop*m_adjusted_point;
   ExtTrailingStep=InpTrailingStep*m_adjusted_point;

   m_trade.SetExpertMagicNumber(m_magic);    // sets magic number

   FirstStart=true;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      m_trade.Buy(0.01);
      m_trade.Sell(0.01);
      FirstStart=false;
     }
//--- TrailingStop
   if(!RefreshRates())
      return;

//--- при таком методе мы будет сюда попадать на каждом тике.
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Bid()-ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Ask()+ExtTrailingStop<m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Bid()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Ask()+ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }
           }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
Dossiers :
 
Vladimir Karputov:

Exemple d'un EA : sur un compte hadge, nous ouvrons deux positions opposées en une fois - sans aucun stop.

Il y a deux paramètres dans les réglages de l'EA:

  • TrailingStop (en pips)
  • TrailingStep (en pips)
TrailingStep protège contre les modifications trop fréquentes :

//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "Пример TrailingStop"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input ushort   InpTrailingStop    =10;       // TrailingStop (in pips)
input ushort   InpTrailingStep    =5;        // TrailingStep (in pips)
//---
double         ExtTrailingStop=0.0;
double         ExtTrailingStep=0.0;
ulong          m_magic=15489;                // magic number
ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;
bool           FirstStart=true;              // true - first start
double         m_adjusted_point;             // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetMarginMode();
   if(!IsHedging())
     {
      Print("Hedging only!");
      return(INIT_FAILED);
     }
   m_symbol.Name(Symbol());                  // sets symbol name
   m_symbol.Refresh();                       // refreshes the symbol data
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- 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=digits_adjust*m_symbol.Point();
   ExtTrailingStop=InpTrailingStop*m_adjusted_point;
   ExtTrailingStep=InpTrailingStep*m_adjusted_point;

   m_trade.SetExpertMagicNumber(m_magic);    // sets magic number

   FirstStart=true;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(FirstStart)
     {
      m_trade.Buy(0.01);
      m_trade.Sell(0.01);
      FirstStart=false;
     }
//--- TrailingStop
   if(!RefreshRates())
      return;

//--- при таком методе мы будет сюда попадать на каждом тике.
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Bid()-ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- когда у позиции ещё нет StopLoss
               if(m_position.StopLoss()==0)
                 {
                  //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                  if(m_symbol.Ask()+ExtTrailingStop<m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
                    }
                 }
               //--- у позиции уже есть StopLoss
               else
                 {
                  //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
                  //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
                  if(m_symbol.Bid()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),
                                            NormalizeDouble(m_symbol.Ask()+ExtTrailingStop,m_symbol.Digits()),0.0);
                    }
                 }
              }
           }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetMarginMode(void)
  {
   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsHedging(void)
  {
   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


Merci, ça a marché même si ça n'a pas marché la première fois ! !!
 
Je me demande s'il y a trois maxima (minima), alors l'indice de celui qui donnera ArrayMaximum(ArrayMinimum) ?
 
Vladimir:
Je me demande, s'il y a trois maxima (minima), lequel indexera ArrayMaximum (ArrayMinimum) ?
Le maximum (minimum). Cette fonction n'a pas plus d'une valeur de sortie.
 
Vitalie Postolache:
La valeur maximale (minimale). Cette fonction n'a pas plus d'une valeur de sortie.
C'est ce que je demande. Il y a cinq numéros dans le tableau : 1.1012 1.1013 1.1013 1.1012, lequel des éléments sera considéré comme le maximum par la fonction ? Aucun d'entre eux, il y en a trois d'égale importance. Options de réponse : le premier rencontré, le dernier rencontré, n'importe lequel des maxima. Vous pouvez proposer d'autres options si vous le souhaitez. Le choix devrait être reflété dans la description de la fonction dans l'aide (documentation), mais je ne l'ai pas trouvé.