Explicação detalhada do iCustom

 

Olá.

Sou novo em codificação, e estou aprendendo muito, no entanto, tenho algo que não consigo entender no momento. Estou tentando chamar o resultado de um teste em um dos meus indicadores, para uma ea, para que ele possa adicioná-lo a seus próprios testes antes de colocar uma profissão. A ea é uma simples cruz média móvel. O indicador é um indicador de tendência ou variação. Anexei o código do indicador.

Gostaria de obter ajuda e, se possível, explicar de forma simples para que eu possa colocar minha cabeça em torno de como ela deve ser configurada dentro do indicador, para que a ea o reconheça. Uma vez que eu tenha o indicador ordenado, passarei para a ea.

O indicador tem dois testes, nos quais eu gostaria de acrescentar a função iCustom. Nesta fase, quero apenas adicioná-lo em um teste, não importa qual, como estou tentando entendê-lo. Qualquer pessoa disposta a ajudar e explicar de forma simples, seria muito benéfico - parece que não consigo encontrar nada on-line que o explique para que eu o entenda. O resultado do teste poderia ser simplesmente "verdadeiro".

Obrigado antecipadamente pelo seu tempo.
Mike

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Yellow
#property  indicator_color2  Red
#property  indicator_width1  1

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;

int i, limit, counted_bars;
static string Pair1;

datetime CurrentTimeStamp;

//---- indicator buffers
double     STDBuffer[];
double     stddevma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
   IndicatorDigits(Digits+1);
     
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE); // 
   SetIndexStyle(1,DRAW_LINE);

      
//---- indicator buffers mapping
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);

   
   if (PairName == "") Pair1 = Symbol();
   else Pair1 = PairName;

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("SFX TOR: "+Pair1+"("+StdDev.MA.Period+")");
   SetIndexLabel(0,"StdDev");
   SetIndexLabel(1,"StdDev MA");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {

   counted_bars=IndicatorCounted();
   
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- macd counted in the 1-st buffer
  for(int i=limit-1; i>=0; i--){
     STDBuffer[i]=iStdDev(Pair1,0,StdDev.MA.Period, StdDev.MA.Shift, StdDev.MA.Method, StdDev.MA.Price, i);
     }
  for(i=limit-1; i>=0; i--){
     stddevma[i] = iMAOnArray(STDBuffer, 0, MA.Fast.Period, MA.Fast.Shift, MA.Fast.Method, i);
     } 
    
//Execute on bar Open
    if( CheckOncePerBar == true ){
      if( CurrentTimeStamp == Time[0] )
         return( 0 );
   }
   
   CurrentTimeStamp = Time [0];
   
//Tests
        
      if( STDBuffer[1] > stddevma[1] ){
      if( STDBuffer[2] <= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");
      }   
   }
   else{ // if it's not greater then it is either lesser than or equal
      if( STDBuffer[2] >= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");  
      }
   }
          
//---- done
   return(0);
  }
 

O iCustom permite que você acesse seus buffers de Indicadores... é tão simples quanto isso.

Por exemplo, você está escrevendo uma EA que tem uma estratégia baseada em 2 Indicadores, você poderia construir o código do Indicador na EA, isso é possível mas está um pouco envolvido já que os buffers de Indicadores não funcionam nas EA, você teria que usar arrays e manuseá-los de forma "em série" . . a alternativa é ter os Indicadores funcionando e acessar seus buffers a partir da EA . . isto é o que o iCustom facilita. Não são necessárias mudanças nos Indicadores . . . a EA simplesmente acessa os amortecedores de que precisa nos valores de deslocamento que precisa. Na chamada iCustom também pode passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador como aplicável.

 
RaptorUK:

O iCustom permite que você acesse seus buffers de Indicadores ... é tão simples quanto isso.

Por exemplo, você está escrevendo uma EA que tem uma estratégia baseada em 2 Indicadores, você poderia construir o código do Indicador na EA, isso é possível mas está um pouco envolvido já que os buffers de Indicadores não funcionam nas EA, você teria que usar arrays e manuseá-los de forma "em série" . . a alternativa é ter os Indicadores funcionando e acessar seus buffers a partir da EA . . isto é o que o iCustom facilita. Não são necessárias mudanças nos Indicadores . . . a EA simplesmente acessa os amortecedores de que precisa nos valores de deslocamento que precisa. Na chamada iCustom também pode passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador como aplicável.


Obrigado por esse RaptorUK, porém é com a codificação propriamente dita que estou tendo dificuldades. Sou muito novo na MQL4, e estou fazendo isso há apenas alguns meses, e ainda estou aprendendo - por isso preciso de uma explicação simples da codificação e de como configurá-la no indicador.

Obrigado

Mike

 

RaptorUK:

Na chamada iCustom também pode passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador, conforme aplicável

Correção ...

No iCustom , chame-lhe

DEVE

também passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador, conforme aplicável.
 
NewCoder47:


Obrigado por esse RaptorUK, porém é com a codificação real que estou tendo dificuldades. Sou muito novo na MQL4, e tenho feito isso apenas há alguns meses, e ainda estou aprendendo - por isso estou precisando de uma explicação simples sobre a codificação e como configurá-la no indicador.

Obrigado

Mike

O que evidentemente está faltando aqui é que você não usa o iCustom no indicador. O indicador é uma peça de código independente. Sua EA pode agora dar uma olhada no que está acontecendo no indicador, usando o comando iCustom .

https://docs.mql4.com/indicators/iCustom

https://forum.mql4.com/42002

 
dabbler:

Correção ...

No iCustom , chame-lhe

DEVE

também passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador, conforme aplicável.
É possível deixar os valores externos em branco. O indicador iCustom() utilizaria então os seus valores padrão.
 
dabbler:

Correção ...

No iCustom , chame-lhe

DEVE

também passar quaisquer variáveis externas que sejam necessárias para configurar o Indicador, conforme aplicável.

Tenho lido diferentes declarações a este respeito . . Eu nunca usei o iCustom, portanto não posso falar por experiência própria . . mas sua declaração é verdadeira mesmo quando as variáveis externas padrão são o que é necessário ?
 
RaptorUK:
Tenho lido diferentes declarações a este respeito . . Eu nunca usei o iCustom, portanto não posso falar por experiência própria . . mas sua declaração é verdadeira mesmo quando as variáveis externas padrão são o que é necessário ?
Sim. O problema é que os dois últimos parâmetros do iCustom são cruciais para que você não possa omitir nada.
 
dabbler:
Sim. O problema é que os dois últimos parâmetros do iCustom são cruciais para que não se possa omitir nada.
É claro . . . obrigado.
 
ubzen:
É possível deixar os valores externos em branco. O indicador iCustom() usaria então seus valores padrão.
Não, não se pode. Eu acabei de tentar. Ele não será compilado se você deixar de fora um dos parâmetros, deixando apenas um lugar vazio entre as vírgulas.
 
NewCoder47:


.... Sou muito novo na MQL4, e só o faço há alguns meses, e ainda estou aprendendo - por isso preciso de uma explicação simples sobre a codificação e como configurá-la no indicador....

Reconheço o indicador como o indicador de tendência do BarrowBoy_Or_Range. A chave para entender os Indicadores é entender os Arrays. Eu tinha um medo saudável dos Arrays até que percebi que os tenho usado desde o dia 1 quando usava o mql4. OrderSelect() e Ma_CrossOver Logics são algumas das primeiras coisas que se tem que entender para se fazer qualquer EA.

Como Raptor e Dabber apontaram. Eles são apenas uma série de Números contados para trás ou para frente. Os indicadores têm o valor agregado de utilizar mais ferramentas visuais do que os Peritos. Uma vez que este Indicador Personalizado emprega uma série de Indicadores padrão como Desvio Padrão e Médias Móveis, eu recomendo fazer estes cálculos dentro da EA.

Razão: