Discussão do artigo "Estendendo a biblioteca padrão do MQL5 e reutilizando o código"

 

Novo artigo Estendendo a biblioteca padrão do MQL5 e reutilizando o código foi publicado:

A biblioteca padrão do MQL5 torna mais fácil a sua vida como desenvolvedor. No entanto, ela não implementa todas as necessidades de todos os desenvolvedores no mundo, então, se você achar que precisa de mais algum material de customização, você pode dar um passo a mais e estender. Este artigo o orienta através da integração do indicador técnico Zig-Zag MetaQuotes' na biblioteca padrão. Ficamos inspirados pela filosofia de design MetaQuotes' para alcançar o nosso objetivo.

Em poucas palavras, a IPA do MQL5 é destinada para que você se ​beneficie da reutilização, confiabilidade, flexibilidade e facilidade de manutenção do código. Isto é o que a teoria diz, mas, além de tudo isso, se você pretende continuar a avançar em MQL5 e desenvolver coisas mais sofisticadas, tais como Experts Advisors multi-moedas, em primeiro lugar você deve ser capaz de codificar no modo da biblioteca padrão, então seus aplicativos estão garantidos em uma vida bem sucedida.

Figura 2. Começamos baixando o ZigZag MetaQuotes' a partir do nosso terminal MetaTrader 5

Autor: Jordi Bassaganas

[Excluído]  

Muito obrigado. Muito informativo.

 

Tento entender o que esse código significa neste artigo: por que temos um * perto do CINDICATOBUFFER e depois usamos at.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

Gostaria de receber uma explicação detalhada

Obrigado

 
rodlivar:<br/ translate="no">

Eu tento entender o que esse código significa neste artigo, por que temos um * perto do CINDICATOBUFFER e depois usamos at.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

Gostaria de receber uma explicação detalhada

Obrigado

* indica um ponteiro. Explicação detalhada neste artigo Usando os ponteiros de objetos em MQL5
 

string

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

Não consigo encontrar o caminho para o indicador.

Qual é a maneira correta de especificar o caminho aqui? Os indicadores que estou tentando chamar estão na pasta padrão

 
Tango_X:

string

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

Não consigo encontrar o caminho para o indicador.

Qual é a maneira correta de especificar aqui? Os indicadores que estou tentando chamar estão na pasta padrão.

O Ziguezague padrão está na pasta Examples - você precisa adicionar o nome da pasta ao caminho


 
Rashid Umarov:

O Zigzag padrão está na pasta Examples - você precisa adicionar o nome da pasta no caminho



2017.07.12 10:38:05.703 Proba2(EURUSD.m,M1) cannot load custom indicator 'Examples\ZigZag' [4302]

O que há de errado? tudo está exatamente como na sua imagem.
 
Tango_X:

2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) cannot load custom indicator 'Examples\ZigZag'[4302]

O que há de errado? Tudo está exatamente como na sua imagem.

Quem dará uma olhada no código de erro?

ERR_MARKET_NOT_SELECTED

4302

Símbolo não selecionado no MarketWatch

 
Rashid Umarov:

Quem examinará o código de erro?

ERR_MARKET_NOT_SELECTED

4302

Símbolo não selecionado no MarketWatch


Coloquei NULL - funciona, coloquei "EURUSD" - não funciona!!!!

bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- verificar histórico
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- criar
   //m_handle=iCustom(symbol,period, "Examples\\\ZigZag",depth,deviation_create,backstep);
     //m_handle=iCustom("EURUSD",period, "Examples\\\ZigZag",depth,deviation_create,backstep); - NÃO funciona
     m_handle=iCustom(NULL,period,"Examples\\ZigZag",depth,deviation_create,backstep);       - работает
//--- verifique o resultado
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicador criado com sucesso
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- erro de inicialização
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
 
Consegui! A questão foi resolvida! Tenho um nome de símbolo com um prefixo - "EURUSD.m".
 
//+------------------------------------------------------------------+
//|| Criar o indicador "Zig Zag|
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- verificar histórico
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- criar
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- verifique o resultado
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicador criado com sucesso
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- erro de inicialização
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- linha de status de renderização
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- salvar configurações
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- criar buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- erro
   return(false);
  }


Ajude-me a entender como a direção de indexação da matriz do buffer do indicador é definida aqui, ou seja, da mesma forma que ArraySetAsSeries. A direção padrão é do presente para o passado, mas preciso fazê-la do passado para o presente. Desde ontem, estou tendo dificuldades com essa pergunta.