Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1243

 

En un principio me basé en este artículo:https://www.mql5.com/ru/articles/43

Pero el código allí es sólo hasta el momento de la comprobación y la obtención de los datos del indicador en matrices de búfer, además no hay ningún ejemplo de cómo trabajar con los datos del indicador recibido. Miré a través del libro de referencia, hay principalmente ejemplos de código para los indicadores, recogí setindexbuffer de ella. Quiero saber por dónde "cavar". Me cansé ayer, he pasado medio día aquí.

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

Ya lo he probado. Pero en el asistente se genera allí con las clases. Me gustaría al menos entender el código de una manera sencilla - el código lo entiendo al menos un poco. ¿Podría aconsejar cómo corregir el código para obtener los valores de los indicadores en el EA?

Ejemplo: Cómo obtener los valores del indicador iEnvelopes desde el 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);
  }
//+------------------------------------------------------------------+


Resultado:


Archivos adjuntos:
 
Vladimir Karputov:

Ejemplo: cómo obtener los valores del indicador iEnvelopes de un EA

¡Muchas gracias! Lo investigaré.

 
Vladimir Karputov:


Vladimir, por favor, dime: ¿de dónde saca UPPER_LINE y LOWER_LINE? Si sólo tenemos la manija del indicador, ¿la obtuvimos directamente de la manija?

 
Sayberix:

Vladimir, por favor, dime: ¿de dónde saca UPPER_LINE y LOWER_LINE? Si sólo conseguimos la manilla indicadora, ¿también conseguimos la manilla a la vez?

No entiendo su pregunta. Es un conjunto de letras sin significado. Por favor, reformule su pregunta: no se apresure a escribir, piense en su pregunta y escriba con calma.

 
Vladimir Karputov:

No entiendo su pregunta. Un conjunto de letras sin significado. Por favor, reformule su pregunta: no se apresure a escribir, piense en su pregunta y escriba con calma.

En el argumento de la función:

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

has utilizado UPPER_LINE.

De dónde viene este valor del parámetro, de la manija que obtuviste antes:

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

?

 
Sayberix:

En el argumento de la función:

has utilizado UPPER_LINE.

De dónde viene este valor del parámetro, del handshake recibido previamente:

?

No. Este valor está tomado de la ayuda de iEnvelopes

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

Por la tarde. Cuando se ejecuta el EA en la moneda GBPUSD, puse el indicador en el código para EURUSD, el EA se bloquea en el arranque. Sin embargo, si ejecuto el Asesor Experto en EURUSD y especifico GBPUSD como indicador, todo funciona. ¿Con qué puede estar relacionado?

   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:

Por la tarde. Cuando se ejecuta un EA en la moneda GBPUSD, puse un indicador en el código para EURUSD, el EA se bloquea en el arranque. Sin embargo, si ejecuto el EA en EURUSD y especifico GBPUSD como indicador, todo funciona. ¿A qué puede deberse?

1. Genere un EA utilizando el Wizard MQL5 - por ejemplo, especifique "GBPUSD" para el EA y "EURUSD" para el módulo de señales. Obtendrá un código de muestra RIGHT. Estudia el código. En el futuro, simplemente evita la edición manual, y genera el código utilizando el Asistente MQL5.

2. Si ha especificado "GBPUSD" para un Asesor Experto, debe ejecutar este EA SOLO en "GBPUSD".

Archivos adjuntos:
1.mq5  13 kb
 
Vladimir Karputov:

1. Genere un EA usando el Wizard MQL5 - especifique por ejemplo 'GBPUSD' para el EA y 'EURUSD' para el módulo de señales. Obtendrá un código de muestra RIGHT. Estudia el código. En el futuro, simplemente evita la edición manual, y genera el código utilizando el Asistente MQL5.

2. Si ha especificado "GBPUSD" para un Asesor Experto, entonces debe ejecutar este Asesor Experto SÓLO en "GBPUSD".

Vladimir, he generado el código utilizando el MQL5 Wizard. He probado su EA, también no funciona para mí cuando lo ejecuto en la moneda GBPUSD.

Dice lo siguiente en el registro:

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