Explicación detallada de iCustom - página 3

 
NewCoder47:

Gracias Dabbler. He adjuntado el EA completo y el indicador. He leído los enunciados de iCustom, y entiendo todo excepto la parte de los parámetros,

Lo que va en los parámetros son los valores que quieres usar para las variables externas en el Indicador... en este caso estas...

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

Veamos de nuevo el archivo de ayuda.

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

Mirando la definición de la parte ...

... - Parámetros pasados (si es necesario). Los parámetros pasados y su orden deben corresponder con el orden de desclasificación y el tipo de variables externas del indicador personalizado.


Tienes 9 variables externas y por lo tanto necesitas 9 parámetros en el orden correcto y con el tipo correcto

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

Muy fácil.

Entonces preguntas "Además, ¿hay alguna forma de ver físicamente qué valores se están enviando al 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);

Sí, excepto que Null es un error tipográfico.

Empieza con el indicador y genera el código.

Indicador
EA
Nombre de archivo del indicador sin extensión, incluyendo los espacios en blanco si los hay.
#define SFX "SFX"
#define ya que es constante. Definirlo una vez para que no haya errores tipográficos.
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;
Los valores que NO afectan a los buffers, se pueden hacer constantes.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Puede tener que leer el código para encontrar el significado de los buffers. Por ejemplo
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
Las llamadas entonces son
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)
 

Gracias por su respuesta.


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

 
ubzen:
Sí. Todo el tiempo. Estoy hablando de Extern Values. Y supongo que estás hablando de Buffers.

Sí UBZEN,


También probé lo que me sugeriste y me devolvió el valor que se indica en mi indicador....

es simplemente, fácil de añadir o utilizar con todos los parámetros de largo .... especialmente el que con arrays.......

Yo podría perderse en la compilación de los parámetros no ustedes............ los PRO aquí

muchas gracias.... Estuve buscando esta respuesta durante unos días

 
WHRoeder: Las llamadas entonces son:
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 luego deben 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:

iCustom le permite acceder a los buffers de sus Indicadores... es así de simple.

Por ejemplo, usted está escribiendo un EA que tiene una estrategia basada en 2 Indicadores, usted podría construir el código del Indicador en el EA, eso es posible pero es un poco complicado ya que los buffers de los Indicadores no funcionan en los EAs, usted tendría que usar arrays y manejarlos de una manera "como serie" . . la alternativa es tener los Indicadores corriendo y acceder a sus buffers desde el EA . . esto es lo que iCustom facilita. No es necesario hacer cambios en los Indicadores . . . el EA simplemente accede a los buffers que necesita en los valores de desplazamiento que necesita. En la llamada de iCustom también puede pasar cualquier variable externa que se necesite para configurar el Indicador según corresponda

Estimado RaptorUK (y otros que puedan ayudar),


en el post citado describes dos formas de utilizar valores de indicadores personalizados en un EA. La primera es con iCustom que ya conozco. La segunda es una que realmente me gustaría aprender más porque he intentado internalizar el código de los indicadores personalizados en el cuerpo del indicador principal antes, pero sin éxito. Verás, cuando convertí un indicador en una función y dejé que devolviera su valor más actual (el valor en el elemento 0) siempre obtengo el EMPTY_VALUE para una variable doble en lugar del propio valor calculado. He probado a utilizar la función iCustom, poniendo el desplazamiento a 0, el valor más reciente. Cuando hago esto el terminal comienza devolviendo 0 junto con el error STACK OVERFLOW en la pestaña de expertos. En el segundo tick devuelve un valor pero después de cada par de valores [0] impresos da otro error STACK OVERFLOW, esto se repite una y otra vez. Debido a que iCustom devuelve el valor 0 y STACK OVERFLOW en la primera inicialización (y sólo después comienza a dar valores correctos) no puedo usar icustom en mi EA porque llama al icustom para un símbolo diferente cada vez que Start() se activa y llama a múltiples indicadores personalizados para eso. Esto hace que el EA se bloquee. No entiendo por qué recibo un error de STACK OVERFLOW cada vez que quiero que el icustom devuelva el valor más reciente [0] pero me gustaría saberlo. Sin embargo, prefiero internalizar el código de todos los indicadores que están siendo llamados transformándolos en funciones dentro del indicador principal. Dijiste algo acerca de usar arrays y manejarlos de manera "como series". ¿Podría explicar esto?

He añadido un archivo mq4 del indicador clásico ADX.mq4. Dentro el valor de ADX se imprime dos veces. Una vez por Icustom, y la segunda por el código del ADX que se ha convertido en una función dentro del ADX. Icustom(ADX) devuelve un valor pero ADX(symbol,timeframe) no lo hace. Sigue devolviendo el mismo EMPTY_VALUE de 247456457457 o algo así una y otra vez. Por favor, explique por qué sucede esto y cómo puedo remediarlo tanto en una plantilla de EA como en un archivo de indicador personalizado mq4.


Un saludo y gracias de antemano


PD: el archivo adjunto no parece funcionar. Pero puede descargar tanto el indicador de ejemplo CallicustomvsFunction como el indicador personalizado ADX de http://www.forexfactory.com/showthre...37#post8569537(mi nombre allí es Codix)

Archivos adjuntos:
 
  1. No hagas doble post
  2. No secuestrar otros hilos; Sus preguntas no son sobre cómo utilizar iCustom.
 

En los mensajes anteriores(https://www.mql5.com/en/forum/138577/page3#627521 y https://www.mql5.com/en/forum/138577/page3#797401) he utilizado puntos y separadores de palabras.

Eso no está permitido desde el 3 de febrerode 2014 (Build 600) Utilice un guión bajo o camel case.

 
whroeder1:

Utilice un guión bajo o una mayúscula.

No sabía que se llamaba "camel case". Gracias.