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

 
SanAlex:

Je suis autodidacte et je ne pourrai pas vous l'expliquer - j'ai simplement choisi les fonctions dont j'ai besoin, je sais que ceci va là et cela va là.

En gros, toutes les fonctions sont copiées des codes de Vladimir Karputov, pour lesquels je le remercie beaucoup ! - Il vous dira si vous avez des questions.

Vous êtes autodidacte, je viens de commencer à programmer, et ma tête est pleine de questions.

J'ai l'algorithme de cet EA dans ma tête et ce n'est pas un problème si je dois changer l'indicateur dans le processus, car il n'y a que deux tâches (point de direction - haut et point de direction - bas).

Pour l'instant, je pars du principe classique que le plus simple est le meilleur. C'est pourquoi je veux simplifier...... au maximum et en même temps tirer le meilleur parti de ce que je veux créer. Je vous propose de travailler ensemble sur mon algorithme - je pense que ce serait intéressant pour nous deux.
Si vous êtes intéressé, veuillez me contacter en personne.
 
Vladimir Karputov:

L'héritage implique la création d'une classe.

J'écris donc : de quelle classe dois-je hériter pour utiliser ces méthodes de leur bibliothèque standard ?

 
SanAlex:

Voici une autre option - une fois que la prise est déclenchée - elle s'ouvrira à nouveau dans la même direction.

Tout à fait exact, avec profit ! !!

A première vue - tout est correct.

Et le fait qu'il ne devrait pas y avoir de Stop Loss - tout est correct aussi.

Mais je ne comprends pas ce qui arrive à l'ordre, qui n'est pas fermé au Take Profit....... lorsque la direction du prix change.....(se ferme juste par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.

Et selon mon idée - l'ordre devrait rester, mais ici il devrait entrer en vigueur - une martin avec ses réglages :

input group "======== МАРТИН ========"; 
input int      MMType        = 1;        // 1 - вкл. , 2 - выкл.
input double   Multiplikator = 1.667;    // множитель следующего лота
input double   Step          = 150.0;    // Расстояние между ордерами

C'est-à-dire placer des ordres dans la direction opposée à la tendance avec un lot croissant et un take profit moyen. En bref, travailler comme un simple Martin, par exemple (Adviser Autoprofit 3), qui est dans la source ouverte dans le web, mais écrit en mql4.

À propos, la variante originale du travail de tendance, que vous avez correctement écrite, n'a pas été annulée lors de la collaboration avec Martin.

En bref, le travail de tendance est une tâche, que vous avez brillamment démontrée en partie, et la deuxième tâche est une martin.

Il n'est pas nécessaire que ces deux tâches soient liées entre elles - à mon avis, elles peuvent fonctionner de manière totalement indépendante.

 
Sprut 185:

Tout à fait juste, avec des bénéfices ! !!

A première vue - tout est correct.

Et le fait que le Stop Loss - ne devrait pas être là non plus - tout est correct.

Mais je n'ai pas compris où se trouvait l'oder, qui n'a pas clôturé au Take Profit....... lorsque la direction du prix change.....(il se ferme simplement par défaut, c'est-à-dire sur le signal de l'indicateur de changement de tendance)? Si c'est le cas, ce n'est pas mon intention.

Mais selon mon idée, l'ordre devrait rester, mais une martin avec ses réglages devrait entrer en vigueur ici :

Il en va de même pour l'autre côté, c'est-à-dire la mise en place d'ordres dans la direction opposée à la tendance avec une taille de lot croissante et un take profit moyen. En bref, travailler comme un simple Martin - par exemple (Autoprofit 3), qui est open source sur le web, mais écrit en mql4.

Une remarque à la fois : pas "ordre", mais "position".

 
Vladimir Karputov:

Une remarque à la fois : pas "ordre" mais "position".

Je m'excuse pour cette erreur.
Je vais en tenir compte et essayer de me corriger à l'avenir.
 
Sprut 185:

toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.

4 Sprut 185

//+------------------------------------------------------------------+
//|                                                  4 Sprut 185.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#define  MACD_MAGIC 1234502
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
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
//---
input double InpLots          =0.1;   // Lots
input int    InpTakeProfit    =50;    // Take Profit (in pips)
input bool   InpVariant       =false; // Option
input int    InpBar           =1;     // Bar
input bool   InpClOp          =false; // Close opposite
//---
double m_macd_current;
double m_signal_current;
double m_take_profit;
int    price_uno;
int    m_handle_macd; // MACD indicator handle
int    ExtTimeOut=10; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- initialize common information
   m_symbol.Name(Symbol());                  // symbol
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
//--- 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);
//--- create StepMA_NRTR indicator
   m_handle_macd=iCustom(NULL,0,"StepMA_NRTR");
   if(m_handle_macd==INVALID_HANDLE)
     {
      printf("Error creating StepMA_NRTR indicator");
      return(false);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick 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)
        {
         //--- change limit time by timeout in seconds if processed
         if(!InpVariant && Processing())
            limit_time=TimeCurrent()+ExtTimeOut;
         //--- change limit time by timeout in seconds if processed
         if(InpVariant && Processing_1())
            limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   ArraySetAsSeries(m_buff_MACD_main,true);
   ArraySetAsSeries(m_buff_MACD_signal,true);
   int start_pos=InpBar,count=3;
   if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
     {
      return(false);
     }
//---
   m_macd_current   =m_buff_MACD_main[0];
   m_signal_current =m_buff_MACD_signal[0];
//---
   if(m_position.Select(Symbol()))
     {
      //--- try to close or modify long position
      if(LongClosed())
         return(true);
      //--- try to close or modify short position
      if(ShortClosed())
         return(true);
     }
   else
     {
      //--- check for long position (BUY) possibility
      if(LongOpened())
         return(true);
      //--- check for short position (SELL) possibility
      if(ShortOpened())
         return(true);
     }
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing_1(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   bool StNRUp,StNRDn;
   ArraySetAsSeries(m_buff_MACD_main,true);
   ArraySetAsSeries(m_buff_MACD_signal,true);
   int start_pos=InpBar,count=3;
   if(!iGetArray(m_handle_macd,0,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd,1,start_pos,count,m_buff_MACD_signal))
     {
      return(false);
     }
//---
   m_macd_current   =m_buff_MACD_main[0];
   m_signal_current =m_buff_MACD_signal[0];
//---
   StNRUp=m_buff_MACD_main[0]<m_buff_MACD_signal[0];
   StNRDn=m_buff_MACD_main[0]>m_buff_MACD_signal[0];
//--- BUY Signal
   if(StNRUp)
     {
      if(InpClOp)
         if(ShortClosed())
            Sleep(1000);
      if(price_uno<0)
         LongOpened();
      price_uno=+1;
      return(true);
     }
//--- SELL Signal
   if(StNRDn)
     {
      if(InpClOp)
         if(LongClosed())
            Sleep(1000);
      if(price_uno>0)
         ShortOpened();
      price_uno=-1;
      return(true);
     }
//--- exit without position processing
   return(false);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool LongClosed(void)
  {
   bool res=false;
//--- should it be closed?
   if(m_macd_current>m_signal_current)
     {
      //--- close position
      if(InpClOp)
         ClosePositions(POSITION_TYPE_BUY);
      //--- processed and cannot be modified
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position closing                                 |
//+------------------------------------------------------------------+
bool ShortClosed(void)
  {
   bool res=false;
//--- should it be closed?
   if(m_macd_current<m_signal_current)
     {
      //--- close position
      if(InpClOp)
         ClosePositions(POSITION_TYPE_SELL);
      //--- processed and cannot be modified
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool LongOpened(void)
  {
   bool res=false;
//--- check for long position (BUY) possibility
   if(m_macd_current<m_signal_current)
     {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- check for free money
      if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
         printf("We have no money. Free Margin = %f",m_account.FreeMargin());
      else
        {
         //--- open position
         if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
            printf("Position by %s to be opened",Symbol());
         else
           {
            printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
            printf("Open parameters : price=%f,TP=%f",price,tp);
           }
         PlaySound("ok.wav");
        }
      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool ShortOpened(void)
  {
   bool res=false;
//--- check for short position (SELL) possibility
   if(m_macd_current>m_signal_current)
     {
      double price=m_symbol.Bid();
      double tp   =m_symbol.Ask()-m_take_profit;
      //--- check for free money
      if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,InpLots,price)<0.0)
         printf("We have no money. Free Margin = %f",m_account.FreeMargin());
      else
        {
         //--- open position
         if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
            printf("Position by %s to be opened",Symbol());
         else
           {
            printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
            printf("Open parameters : price=%f,TP=%f",price,tp);
           }
         PlaySound("ok.wav");
        }
      //--- in any case we must exit from expert
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
//| Check Freeze and Stops levels                                    |
//+------------------------------------------------------------------+
void FreezeStopsLevels(double &freeze,double &stops)
  {
//--- check Freeze and Stops levels
   double coeff=(double)1;
   if(!RefreshRates() || !m_symbol.Refresh())
      return;
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      if(1>0)
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      if(1>0)
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return;
  }
//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   double freeze=0.0,stops=0.0;
   FreezeStopsLevels(freeze,stops);
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
            if(m_position.PositionType()==pos_type)
              {
               if(m_position.PositionType()==POSITION_TYPE_BUY)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","BUY PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  bool take_profit_level=((m_position.TakeProfit()!=0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()==0.0);
                  bool stop_loss_level=((m_position.StopLoss()!=0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()==0.0);
                  if(take_profit_level && stop_loss_level)
                     if(!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                        Print(__FILE__," ",__FUNCTION__,", ERROR: ","SELL PositionClose ",m_position.Ticket(),", ",m_trade.ResultRetcodeDescription());
                 }
               PlaySound("ok.wav");
              }
  }
//+------------------------------------------------------------------+
//| Filling the indicator buffers from the indicator                 |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
 
SanAlex:

toutes les options que j'ai pu trouver - il ne semble pas y en avoir d'autres.


Que se passe-t-il si vous essayez d'utiliser 2 blocs indépendants dans votre Expert Advisor. Ensuite, l'un d'eux fonctionnera seul, puisque vous avez déjà travaillé sur la - tendance (en utilisant un indicateur)...........
Et le second par le signal fixé par le premier bloc - par position - et non par tendance.........


Je l'ai déjà écrit ci-dessus :

Ces deux tâches ne doivent pas nécessairement être liées - à mon avis, elles peuvent fonctionner de manière totalement indépendante.

Un tel algorithme que je propose (à mon avis) n'a pas encore été utilisé par les programmeurs. En tout cas, je n'ai pas trouvé une telle solution - sur Internet.

 
Sprut 185 Cet algorithme que je propose - (à mon avis) n'a pas encore été utilisé par les programmeurs. En tout cas, je n'ai pas trouvé une telle solution sur Internet.

il n'est probablement pas possible de le mettre en œuvre

il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens

   if(m_position.Select(Symbol()))

si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et cela ne devrait pas être présent dans le code (ligne ci-dessus)))

 
SanAlex:

il n'est probablement pas possible de le mettre en œuvre

il ne donne pas - sur le symbole, il doit y avoir une position (s'il est fermé sur un profit et rouvert une position) (et lorsque le signal opposé est appliqué - il ne peut pas ouvrir dans l'autre sens

si c'est juste à partir d'un signal (d'un point) il n'y a pas de problème . (et alors, il ne devrait pas être présent dans le code (ligne ci-dessus)))

Je vois - c'est probablement la raison pour laquelle je n'ai pas trouvé une telle solution sur Internet. Mais à mon avis, il doit y avoir une solution à ce problème.
Merci - je vais chercher une solution à ce problème......
Alors faisons une pause pour le moment.
 

Après la mise à niveau vers la version 2981, une erreur a commencé à apparaître dans la ligne

MqlTradeRequest request = {0}
cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'   OrderaiPosicii.mqh      11      34
Veuillez indiquer comment remplacer cette ligne.