Explicação detalhada do iCustom - página 3

 
NewCoder47:

Obrigado Dabbler. Anexei o EA completo e o Indicador. Li as declarações no iCustom e entendi tudo, exceto a parte dos parâmetros,

O que entra nos parâmetros são os valores que você quer usar para as variáveis externas no Indicador . . neste caso, estes . .

//---- 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;
 

Vamos dar uma olhada novamente no arquivo de ajuda.

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
 

olhando para a definição da ... parte.

... - Parâmetros definidos (se necessário). Os parâmetros passados e sua ordem devem corresponder à ordem de esclarecimento e ao tipo de variáveis externas do indicador personalizado.


Você tem 9 variáveis externas e, portanto, precisa de 9 parâmetros na ordem correta e com o tipo correto

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Fácil de limpar.

Então você pergunta "Também, há alguma maneira de ver fisicamente quais valores estão sendo enviados para a EA"?

Claro.

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Sim, exceto que Null é uma gralha.

Comece com o indicador e gere o código.

Indicador
EA
Nome do arquivo indicador sem extensão, incluindo espaços em branco, se houver.
#define SFX "SFX"
#define, pois é constante. Defina-o uma vez para que não haja erros de digitação.
extern string PairName = "";     // Leave blank for ...

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=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
Os valores que NÃO afetam os tampões, podem ser tornados constantes.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Pode ter que ler o código para encontrar o significado dos tampões. Por exemplo
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
As chamadas então são
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

Obrigado por sua resposta.


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
Sim. O tempo todo. Estou falando de valores externos. E eu acho que você está falando de Buffers.

Sim UBZEN,


Eu também tentei o que você sugeriu e ele retornou o valor como está indicado no meu indicador....

é simples, fácil de adicionar ou usar com todos esses parâmetros longos.... especialmente o que tem arrays.......

Eu poderia me perder na compilação dos parâmetros, e não de vocês, os PRO'S aqui.

muito obrigado.... Eu estava procurando esta resposta por alguns dias

 
WHRoeder: As chamadas então são:
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
Que devem então ser encapsuladas.
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
RaptorUK:

O iCustom permite que você acesse seus amortecedores 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.

Caro RaptorUK (e outros que talvez possam ajudar),


no post citado você descreve duas maneiras de usar valores indicadores personalizados em um EA. A primeira é com o iCustom, da qual já estou ciente. A segunda é uma que eu realmente gostaria de aprender mais sobre porque tentei internalizar o código de indicadores personalizados no corpo do indicador principal antes, mas sem sucesso. Veja, quando transformei um indicador em uma função e o deixei retornar seu valor mais atual (o valor no elemento 0) eu sempre recebo o VALOR_ VAZIO para uma variável dupla ao invés do próprio valor calculado. Eu tentei usar a função iCustom, definindo o deslocamento para 0, o valor mais recente. Quando faço isso, o terminal começa retornando 0 junto com o erro STACK OVERFLOW na guia experts. No segundo tick ele retorna um valor, mas depois de cada par de valores impressos [0] ele dá outro erro STACK OVERFLOW, isto continua a repetir-se repetidamente. Como o iCustom retorna o valor 0 e STACK OVERFLOW na primeira inicialização (e somente após começar a dar valores corretos) não posso usar o icustom em minha EA porque ele chama o icustom por um símbolo diferente toda vez que Start() é ativado e chama vários indicadores personalizados para isso. Isto faz com que o EA trave. Não entendo porque recebo um erro STACK OVERFLOW sempre que quero que a icustom retorne o valor mais recente [0], mas eu certamente gostaria de saber. No entanto, prefiro internalizar o código de todos os indicadores que estão sendo chamados, transformando-os em funções dentro do indicador principal. Você disse algo sobre o uso de arrays e manuseá-los "como uma série". Você poderia, por favor, elaborar isto?

Eu adicionei um arquivo mq4 do indicador clássico ADX.mq4. Dentro do valor do ADX é impresso duas vezes. Uma pelo Icustom, e a segunda pelo código ADX que foi transformado em uma função dentro do ADX. Icustom(ADX) retorna um valor, mas ADX(símbolo,cronograma) não. Ele continua retornando o mesmo EMPTY_VALUE de 247456457457 ou algo mais uma e outra vez. Por favor, explique porque isto está acontecendo e como posso remediar isto tanto em um modelo EA como em um arquivo indicador personalizado mq4.


Com os melhores cumprimentos e agradecimentos


PS: anexar arquivo não parece estar funcionando. Mas você pode baixar tanto o indicador de exemplo CallicustomvsFunction como o indicador personalizado ADX em http://www.forexfactory.com/showthre...37#post8569537(meu nome lá é Codix)

Arquivos anexados:
 
  1. Não duplique o correio
  2. Não desvie outros fios; suas perguntas não são sobre como usar o iCustom.
 

Nos posts acima(https://www.mql5.com/en/forum/138577/page3#627521 e https://www.mql5.com/e n/forum/138577/page3#797401) eu usei pontos e separadores de palavras.

Isso não é permitido desde 3 de fevereiro de2014 (Build 600) Use um underscore ou uma caixa de camelo.

 
whroeder1:

Use um underscore ou um estojo de camelo.

Eu nunca soube que se chamava "caixa de camelo". Obrigado!
Razão: