Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1243

 

Confiei inicialmente neste artigo:https://www.mql5.com/ru/articles/43

Mas o código só existe até ao momento de verificar e obter dados indicadores em matrizes tampão, além disso, não há exemplo de como trabalhar com dados indicadores recebidos. Procurei no livro de referência, existem principalmente exemplos de códigos para os indicadores, peguei no setindexbuffer do mesmo. Quero saber para que lado "cavar". Cansei-me disso ontem, passei meio dia aqui.

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

Já o experimentei. Mas no feiticeiro gera lá com aulas. Gostaria pelo menos de compreender o código de uma forma simples - o código eu compreendo pelo menos um pouco. Pode aconselhar como corrigir o código a fim de obter valores indicadores na EA?

Exemplo: Como obter valores indicadores iEnvelopes da 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:


Arquivos anexados:
 
Vladimir Karputov:

Exemplo: como obter valores indicadores iEnvelopes a partir de um EA

Muito obrigado! Vou investigar!

 
Vladimir Karputov:


Vladimir, por favor diga-me: de onde vem a UPPER_LINE e LOWER_LINE? Se só conseguimos a pega indicadora, conseguimo-la directamente da pega?

 
Sayberix:

Vladimir, por favor diga-me: de onde vem a UPPER_LINE e LOWER_LINE? Se só conseguimos a pega indicadora, também conseguimos a pega de uma só vez?

Não compreendo a sua pergunta. É um conjunto de letras sem significado. Por favor, reformule a sua pergunta - não se apresse a escrever, pense sobre a sua pergunta e escreva calmamente.

 
Vladimir Karputov:

Não compreendo a sua pergunta. Um conjunto de letras sem significado. Por favor, reformule a sua pergunta - não se apresse a escrever, pense na sua pergunta e escreva calmamente.

No argumento da função:

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

usou UPPER_LINE.

De onde vem este valor de parâmetro, da pega que obteve anteriormente:

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

?

 
Sayberix:

No argumento da função:

usou UPPER_LINE.

De onde provém este valor de parâmetro, do aperto de mão previamente recebido:

?

Não. Este valor é retirado da ajuda do iEnvelopes

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

Tarde. Ao executar a EA na moeda GBPUSD, defino o indicador no código para EURUSD, a EA trava ao arrancar. Contudo, se eu gerir o Expert Advisor no EURUSD e especificar GBPUSD como o indicador, tudo funciona. A que pode 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:

Tarde. Ao executar uma EA na moeda GBPUSD, defino um indicador no código para EURUSD, a EA trava ao arrancar. No entanto, se eu executar a EA no EURUSD e especificar GBPUSD como o indicador, tudo funciona. A que pode isto ser devido?

1. Gerar uma EA usando o Wizard MQL5 - por exemplo, especificar 'GBPUSD' para a EA e 'EURUSD' para o módulo de sinais. Receberá um código de amostra CORRETO. Estudar o código. No futuro, basta evitar a edição manual, e gerar o código usando o MQL5 Wizard.

2. Se especificou 'GBPUSD' para um Consultor Especialista, deve executar esta EA SOMENTE em 'GBPUSD'.

Arquivos anexados:
1.mq5  13 kb
 
Vladimir Karputov:

1. Gerar uma EA usando o Wizard MQL5 - especificar por exemplo 'GBPUSD' para a EA e 'EURUSD' para o módulo de sinal. Receberá um código de amostra CORRETO. Estudar o código. No futuro, basta evitar a edição manual, e gerar o código usando o MQL5 Wizard.

2. Se especificou 'GBPUSD' para um Consultor Especialista, então deve executar este Consultor Especialista SOMENTE em 'GBPUSD'.

Vladimir, eu gerei o código usando o MQL5 Wizard. Experimentei a vossa EA, também não funciona para mim quando a administro na moeda GBPUSD.

Diz o seguinte no diário de bordo:

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
Razão: