Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1243

 

Inizialmente mi sono basato su questo articolo:https://www.mql5.com/ru/articles/43

Ma il codice lì è solo fino al momento di controllare e ottenere i dati dell'indicatore negli array di buffer, inoltre non c'è nessun esempio di come lavorare con i dati dell'indicatore ricevuti. Ho guardato il libro di riferimento, ci sono principalmente esempi di codice per gli indicatori, ho preso setindexbuffer da esso. Voglio sapere da che parte "scavare". Mi sono stancato ieri, ho passato mezza giornata qui.

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

Già provato. Ma nel wizard si genera lì con le classi. Vorrei almeno capire il codice in modo semplice - il codice lo capisco almeno un po'. Potreste consigliarmi come correggere il codice per ottenere i valori dell'indicatore nell'EA?

Esempio: come ottenere i valori dell'indicatore iEnvelopes dall'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);
  }
//+------------------------------------------------------------------+


Risultato:


 
Vladimir Karputov:

Esempio: come ottenere i valori dell'indicatore iEnvelopes da un EA

Grazie mille! Ci darò un'occhiata!

 
Vladimir Karputov:


Vladimir, per favore dimmi: da dove prende UPPER_LINE e LOWER_LINE? Se abbiamo solo la maniglia dell'indicatore, l'abbiamo presa direttamente dalla maniglia?

 
Sayberix:

Vladimir, per favore dimmi: da dove prende UPPER_LINE e LOWER_LINE? Se abbiamo ottenuto solo la maniglia dell'indicatore, abbiamo ottenuto anche la maniglia in una volta sola?

Non capisco la sua domanda. È un insieme di lettere senza significato. Per favore riformuli la sua domanda - non abbia fretta di scrivere, pensi alla sua domanda e scriva con calma.

 
Vladimir Karputov:

Non capisco la sua domanda. Un insieme di lettere senza significato. Per favore riformuli la sua domanda - non si affretti a scrivere, pensi alla sua domanda e scriva con calma.

Nell'argomento della funzione:

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

hai usato UPPER_LINE.

Da dove viene questo valore di parametro, dall'handle che avete ricevuto prima:

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

?

 
Sayberix:

Nell'argomento della funzione:

hai usato UPPER_LINE.

Da dove viene questo valore di parametro, dall'handshake ricevuto in precedenza:

?

No. Questo valore è preso dall'aiuto di iEnvelopes

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

Pomeriggio. Quando si esegue un EA sulla valuta GBPUSD, ho impostato un indicatore nel codice per EURUSD, l'EA si blocca all'avvio. Tuttavia, se eseguo l'EA su EURUSD e specifico GBPUSD come indicatore, tutto funziona. A cosa può essere collegato?

   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:

Pomeriggio. Quando si esegue l'EA sulla valuta GBPUSD, ho impostato l'indicatore nel codice per EURUSD, l'EA si blocca all'avvio. Tuttavia, se eseguo l'EA su EURUSD e specifico GBPUSD come indicatore, tutto funziona. A cosa può essere dovuto?

1. Genera un EA usando Wizard MQL5 - per esempio, specifica 'GBPUSD' per l'EA e 'EURUSD' per il modulo di segnali. Otterrete un codice di esempio GIUSTO. Studiate il codice. In futuro, basta evitare la modifica manuale e generare il codice usando la procedura guidata MQL5.

2. Se hai specificato "GBPUSD" per un EA, devi eseguire questo EA SOLO su "GBPUSD".

File:
1.mq5  13 kb
 
Vladimir Karputov:

1. Genera un EA usando Wizard MQL5 - specifica per esempio 'GBPUSD' per l'EA e 'EURUSD' per il modulo del segnale. Otterrete un codice di esempio GIUSTO. Studiate il codice. In futuro, basta evitare la modifica manuale e generare il codice usando la procedura guidata MQL5.

2. Se hai specificato "GBPUSD" per un Expert Advisor, allora devi eseguire questo Expert Advisor SOLO su "GBPUSD".

Vladimir, ho generato il codice usando MQL5 Wizard. Ho provato il tuo EA, anche per me non funziona quando lo eseguo sulla valuta GBPUSD.

Nel registro c'è scritto quanto segue:

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