Discussão do artigo "Indicador NRTR e módulos de negociação baseados nele para o Assistente MQL5"

 

Novo artigo Indicador NRTR e módulos de negociação baseados nele para o Assistente MQL5 foi publicado:

Este artigo descreve o indicador NRTR e módulos de negociação criados com sua ajuda. Para estes fins, é criado um módulo de sinais de negociação que permite criar estratégias baseadas nas combinações do NRTR e indicadores adicionais que confirmam a tendência.

Indicador NRTR (Nick Rypock Trailing Reverse) é um indicador pensado por Konstantin Kopyrkin. Um dado curioso: o nome Nick Rypock é derivado do sobrenome Kopyrkin escrito para trás. 

Voltemos ao indicador. Ele é um canal de preço dinâmico. O autor ilustra sua ideia base com a seguinte figura:

Autor: Dmitrii Troshin

 

Não entendo como acessá-lo via iCustom ... por favor, explique

Deveria haver algo como

double iCustom (
stringsymbol, // nome do símbolo
int timeframe, // timeframe
stringname, // nome do indicador de pasta/usuário
... // lista de parâmetros de entrada do indicador
int mode, // fonte de dados
int shift// deslocamento
);

isso é especificamente em nosso caso

//+------------------------------------------------------------------+
//| NRTRvolatile|
//+------------------------------------------------------------------+
//iBufferNumber
//0
//1 
//2 - sinal para cima
//3 - sinal para baixo
double indNRTRvolatile(string sSymbol=NULL,
                int tf=PERIOD_M5,
                int period=12,                  //período dinâmico
                double K=1,                       //fator de escala
                int iBufferNumber=0,
                int iShift=0)
{
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   double handle=iCustom(sSymbol,timeframe,"NRTRvolatile",period,K,iBufferNumber,iShift);
   
   if(handle<0)
     {
      Print("Objeto NRTRvolatile não criado: Erro",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,iShift));
}  


fornece apenas algumas bobagens, ou seja, os preços atuais se você consultar o buffer 2 ou 3

 
gedd:

Não entendo como acessá-lo por meio do iCustom ... por favor, explique

Os buffers 2 e 3 contêm sinais que são atualizados somente no momento da mudança de tendência.

Suporte/Resistência estão nos buffers 0,1 - essas são as linhas que vemos como linhas

CopyBuffer() - tem três sobrecargas, mas nenhuma delas tem três parâmetros.

Uma variante do código para obter os valores dos buffers

void OnStart()
{
double arr[];
int handle =iCustom(Symbol(),0,"NRTRvolatile",12,1);
CopyBuffer(handle,0,0,1,arr);
Print("Canal inferior",arr[0]);
CopyBuffer(handle,1,0,1,arr);
Print("Canal superior",arr[0]);
CopyBuffer(handle,2,0,1,arr);
Print("Sinalizar".,arr[0]);
CopyBuffer(handle,3,0,1,arr);
Print("Sinal para baixo".,arr[0]);
}

Este é o script

 
Dmitrii Troshin:

Os buffers 2 e 3 contêm sinais que são atualizados somente no momento da mudança de tendência.

Suporte/Resistência estão nos buffers 0,1 - essas são as linhas que vemos como linhas

CopyBuffer() - tem três sobrecargas, mas nenhuma delas tem três parâmetros.

Uma variante do código para obter os valores dos buffers

Este é um script


Sim, está mais claro agora.

Sobre CopyBuffer - é da biblioteca de compatibilidade mql4, mais precisamente de initmql4__1.mqh.

double CopyBufferMQL4(int handle,int index,int shift)
  {
   double buf[];
   switch(index)
     {
      case 0: if(CopyBuffer(handle,0,shift,1,buf)>0)
         return(buf[0]); break;
      case 1: if(CopyBuffer(handle,1,shift,1,buf)>0)
         return(buf[0]); break;
      case 2: if(CopyBuffer(handle,2,shift,1,buf)>0)
         return(buf[0]); break;
      case 3: if(CopyBuffer(handle,3,shift,1,buf)>0)
         return(buf[0]); break;
      case 4: if(CopyBuffer(handle,4,shift,1,buf)>0)
         return(buf[0]); break;
      default: break;
     }
   return(EMPTY_VALUE);
  }
 

provavelmente sim

//+------------------------------------------------------------------+
//| NRTRvolatile|
//+------------------------------------------------------------------+
//iBufferNumber
//0
//1 
//2 - sinal para cima
//3 - sinal para baixo
double indNRTRvolatile(string sSymbol=NULL,
                int tf=PERIOD_M5,
                int period=12,                  //período dinâmico
                double K=1,                       //fator de escala
                int iBufferNumber=0,
                int iShift=0)
{
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   double handle=iCustom(sSymbol,timeframe,"NRTRvolatile",period,K);
   
   if(handle<0)
     {
      Print("Objeto NRTRvolatile não criado: Erro",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,iBufferNumber,iShift));

}

 

É possível atualizar o NRTRvolatile para que uma caixa de mensagem seja exibida quando uma seta for adicionada?

 
gedd:

É possível atualizar o NRTRvolatile para que uma caixa de mensagem seja exibida ao adicionar uma seta?


Talvez nas funções LongCondition e ShortCondition.

int SignalNRTR::LongCondition(void)
   {
   int idx   =StartIndex();
   if(UpSignal(idx))
   { 
   Alert"Text";   
   return 100;
   }
   else return 0;
   }

para adicionar algo como Alert"Text". Não sei se isso funcionará. O problema é que não tenho mais esse código em meu computador. Tudo o que eu tinha no ano passado foi guardado no passado:) Portanto, não posso tentar. E ainda tenho a véspera de Ano Novo tocando em minha cabeça :)

 

No próprio indicador, em algum lugar por aqui

 // mudanças de tendência 
  
      if(trend>0) Buff_Up[i]=value;
      if(trend<0) Buff_Dn[i]=value;

      if(trend_prev<0  &&  trend>0) 
      {
      Alert("Text");
      Sign_Up[i]=value;
      Buff_Up[i]=0.0;
      }
      if(trend_prev>0 && trend<0)
      {
      Alert("Text");
      Sign_Dn[i]=value;
      Buff_Dn[i]=0.0;
      }
 

O caminho para os arquivos de inclusão deve ser corrigido para

#include <Expert\\ExpertSignal.mqh>
 

ambas as variantes são possíveis. Variante correta

#include <Expert\ExpertSignal.mqh>

você pode vê-la em outros módulos na pasta Include\Expert\Signal