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

 

Je me suis appuyé à l'origine sur cet article: https://www.mql5.com/ru/articles/43.

Mais le code qui s'y trouve ne permet que de vérifier et de récupérer les données de l'indicateur dans les tableaux tampons, et il n'y a pas d'exemple de la façon de travailler avec les données de l'indicateur reçues. J'ai regardé le livre de référence, il y a principalement des exemples de code pour les indicateurs, j'y ai pris setindexbuffer. Je veux savoir dans quel sens il faut "creuser". Je m'en suis lassé hier, j'ai passé une demi-journée ici.

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • www.mql5.com
В MQL5 существует несколько вариантов вызова индикаторов, и осуществляются они в основном при помощи функций IndicatorCreate() и iCustom(). Причем эти функции лишь возвращают хендл индикатора, и дальнейшая работа с индикаторами ведется именно через него. Так что же такое хендл? Как работать с функциями IndicatorCreate() и iCustom()? И как...
 
Sayberix:

Je l'ai déjà essayé. Mais dans l'assistant, elle est générée avec des classes. Je voudrais au moins comprendre le code de manière simple - le code, je le comprends au moins un peu. Pourriez-vous nous indiquer comment corriger le code afin d'obtenir les valeurs de l'indicateur dans l'EA ?

Exemple : Comment obtenir les valeurs de l'indicateur iEnvelopes à partir de l'EA

//+------------------------------------------------------------------+
//|                         Example iEnvelopes values on a chart.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//---
int      handle_iEnvelopes;                     // variable for storing the handle of the iEnvelopes indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iEnvelopes
   handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);
//--- if the handle is not created
   if(handle_iEnvelopes==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iEnvelopes 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()
  {
//---
   string text="";
   double upper[],lower[];
   ArraySetAsSeries(upper,true);
   ArraySetAsSeries(lower,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper) ||
      !iGetArray(handle_iEnvelopes,LOWER_LINE,start_pos,count,lower))
     {
      return;
     }
   string text_upper="",text_lower="";
   for(int i=count-1; i>=0; i--)
     {
      text_upper  = text_upper   + "Upper"+"["+IntegerToString(i)+"]"+" "+DoubleToString(upper[i],Digits()+1)  +" | ";
      text_lower  = text_lower   + "Lower"+"["+IntegerToString(i)+"]"+" "+DoubleToString(lower[i],Digits()+1)  +" | ";
     }
   Comment(text_upper+"\n"+text_lower);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
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))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      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)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


Résultat :


 
Vladimir Karputov:

Exemple : comment obtenir les valeurs de l'indicateur iEnvelopes à partir d'un EA

Merci beaucoup ! Je vais m'en occuper !

 
Vladimir Karputov:


Vladimir, dis-moi s'il te plaît : d'où vient UPPER_LINE et LOWER_LINE? Si nous n'avons que le manche de l'indicateur, l'avons-nous obtenu directement du manche ?

 
Sayberix:

Vladimir, dis-moi s'il te plaît : d'où vient UPPER_LINE et LOWER_LINE? Si nous n'avons obtenu que la poignée de l'indicateur, avons-nous aussi obtenu la poignée en une seule fois ?

Je ne comprends pas votre question. C'est un ensemble de lettres sans signification. Veuillez reformuler votre question - ne vous pressez pas de taper, réfléchissez à votre question et tapez calmement.

 
Vladimir Karputov:

Je ne comprends pas votre question. Un ensemble de lettres sans signification. Veuillez reformuler votre question - ne vous précipitez pas, réfléchissez à votre question et tapez calmement.

Dans l'argument de la fonction :

iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper)

vous avez utilisé UPPER_LINE.

D'où vient cette valeur de paramètre, de la poignée que vous avez obtenue plus tôt :

handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);

?

 
Sayberix:

Dans l'argument de la fonction :

vous avez utilisé UPPER_LINE.

D'où vient la valeur de ce paramètre, de la poignée de main reçue précédemment :

?

Non. Cette valeur est tirée de l'aide d'iEnvelopes.

Документация по MQL5: Технические индикаторы / iEnvelopes
Документация по MQL5: Технические индикаторы / iEnvelopes
  • www.mql5.com
//|                                              Demo_iEnvelopes.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |                   ma_period=14;              ...
 

Après-midi. Lors de l'exécution d'un EA sur la devise GBPUSD, j'ai défini un indicateur dans le code pour EURUSD, l'EA se bloque au démarrage. Cependant, si j'exécute l'EA sur EURUSD et que je spécifie GBPUSD comme indicateur, tout fonctionne. A quoi peut-il être lié ?

   CSignalAC *filter0=new CSignalAC;

   if(filter0==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating filter0");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

   signal.AddFilter(filter0);

//--- Set filter parameters

   filter0.Symbol("EURUSD");

   filter0.Weight(Signal_AC_Weight);
 
Nikita Bushuev:

Après-midi. Lorsque j'exécute l'EA sur la devise GBPUSD, je règle l'indicateur dans le code pour EURUSD, l'EA se bloque au démarrage. Cependant, si je lance le conseiller expert sur l'EURUSD et que je spécifie GBPUSD comme indicateur, tout fonctionne. A quoi cela peut-il être dû ?

1. Générez un EA en utilisant l'assistant MQL5 - par exemple, spécifiez 'GBPUSD' pour l'EA et 'EURUSD' pour le module de signaux. Vous obtiendrez un exemple de code DROIT. Étudiez le code. À l'avenir, évitez simplement l'édition manuelle et générez le code à l'aide de l'assistant MQL5.

2. Si vous avez spécifié 'GBPUSD' pour un EA, vous devez exécuter cet EA UNIQUEMENT sur 'GBPUSD'.

Dossiers :
1.mq5  13 kb
 
Vladimir Karputov:

1. Générez un EA en utilisant l'assistant MQL5 - spécifiez par exemple 'GBPUSD' pour l'EA et 'EURUSD' pour le module de signal. Vous obtiendrez un exemple de code DROIT. Étudiez le code. À l'avenir, évitez simplement l'édition manuelle et générez le code à l'aide de l'assistant MQL5.

2. Si vous avez spécifié 'GBPUSD' pour un Expert Advisor, alors vous devez exécuter cet EA UNIQUEMENT sur 'GBPUSD'.

Vladimir, j'ai généré le code en utilisant l'assistant MQL5. J'ai essayé votre EA, il ne fonctionne pas non plus pour moi lorsque je l'exécute sur la devise GBPUSD.

Il est indiqué ce qui suit dans le journal :

2020.08.16 13:01:20.793 Core 1  EURUSD: symbol to be synchronized
2020.08.16 13:01:20.793 Core 1  EURUSD: symbol synchronized already, 18 bytes received
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   cannot load indicator 'Accelerator Oscillator' [4804]
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   CSignalAC::InitAC: error initializing object
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   CExpert::InitIndicators: error initialization indicators of signal object
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   OnInit: error initializing indicators
2020.08.16 13:01:20.793 Core 1  tester stopped because OnInit returns non-zero code 1
Raison: