Explicación detallada de iCustom

 

Hola.

Soy nuevo en la codificación, y estoy aprendiendo mucho, sin embargo he dado con algo que no consigo entender por el momento. Estoy tratando de llamar el resultado de una prueba en uno de mis indicadores, a un ea, para que lo agregue a sus propias pruebas antes de colocar una operación. El ea es un simple cruce de medias móviles. El indicador es un indicador de tendencia o ranging. He adjuntado el código del indicador.

Me gustaría que me ayudaran, y si es posible que me lo explicaran de forma sencilla para poder entender cómo debe estar configurado dentro del indicador, para que el ea lo reconozca. Una vez que tenga solucionado el indicador, pasaré al ea.

El indicador tiene dos pruebas, en las que me gustaría añadir la función iCustom. En este momento, sólo quiero añadirla en una prueba, no importa cuál, ya que estoy tratando de entenderla. Cualquiera que esté dispuesto a ayudar y explicarlo de forma sencilla, sería de gran ayuda - no puedo encontrar nada en línea que lo explique para que lo entienda. El resultado de la prueba podría ser simplemente "verdadero".

Gracias de antemano por su tiempo.
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);
  }
 

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 a iCustom también puede pasar cualquier variable externa que se necesite para configurar el indicador, según corresponda

 
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 sea el caso


Gracias por eso RaptorUK, sin embargo es la codificación real que estoy teniendo dificultades con. Soy muy nuevo en MQL4, y sólo he estado haciendo un par de meses, y todavía estoy aprendiendo - así que estoy necesitando una explicación sencilla de la codificación y cómo configurarlo en el indicador.

Gracias

Mike

 

RaptorUK:

En la llamada iCustom también puede pasar cualquier variable externa que se necesite para configurar el Indicador según corresponda

Corrección ...

En la llamada iCustom

DEBE

pasar también cualquier variable externa que se necesite para configurar el Indicador, según corresponda.
 
NewCoder47:


Gracias por eso RaptorUK, sin embargo es la codificación real que estoy teniendo dificultades con. Soy muy nuevo en MQL4, y sólo he estado haciendo un par de meses, y todavía estoy aprendiendo - por lo que estoy necesitando una explicación sencilla de la codificación y cómo configurarlo en el indicador.

Gracias

Mike

Lo que evidentemente te falta aquí es que no usas iCustom en el indicador. El indicador es una pieza de código independiente. Su EA puede ahora echar un vistazo a lo que está sucediendo en el indicador utilizando el comando iCustom .

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

https://forum.mql4.com/42002

 
dabbler:

Corrección ...

En la llamada iCustom

DEBE

pasar también cualquier variable externa que se necesite para configurar el Indicador, según corresponda.
Uno puede dejar los valores externos en blanco. El indicador iCustom( ) utilizaría entonces sus valores por defecto.
 
dabbler:

Corrección ...

En la llamada iCustom

DEBE

también pasar cualquier variable externa que se necesite para configurar el Indicador, según corresponda.

He leído diferentes afirmaciones al respecto. . . Nunca he utilizado iCustom, así que no puedo hablar por experiencia personal... ¿pero su afirmación es válida incluso cuando las variables externas por defecto son las que se necesitan?
 
RaptorUK:
He leído diferentes afirmaciones al respecto. . . . Nunca he utilizado iCustom, así que no puedo hablar por experiencia personal... pero ¿tu afirmación es válida incluso cuando lo que se necesita son las variables externas por defecto ?
Sí. El problema es que los dos últimos parámetros del iCustom son cruciales, por lo que no se puede omitir nada.
 
dabbler:
Sí. El problema es que los dos últimos parámetros del iCustom son cruciales, por lo que no se puede omitir nada.
Por supuesto... gracias.
 
ubzen:
Se pueden dejar los valores externos en blanco. El indicador iCustom() utilizaría entonces sus valores por defecto.
No se puede. Acabo de probarlo. No compila si se omite uno de los parámetros dejando un lugar vacío entre las comas.
 
NewCoder47:


.... Soy muy nuevo en MQL4, y sólo he estado haciendo un par de meses, y todavía estoy aprendiendo - por lo que estoy necesitando una explicación sencilla de la codificación y la forma de configurarlo en el indicador....

Reconozco el indicador como el indicador Trend_Or_Range de BarrowBoy. La clave para entender los indicadores es entender los Arrays. Yo tenía un miedo saludable a los Arrays hasta que me di cuenta de que los he estado usando desde el día 1 cuando usaba mql4. Las lógicas OrderSelect() y Ma_CrossOver son algunas de las primeras cosas que uno tiene que entender para hacer cualquier EA.

Como Raptor y Dabber han señalado. No son más que una serie de números contados hacia atrás o hacia delante. Los indicadores tienen el valor añadido de utilizar muchas más herramientas visuales que los expertos. Dado que este indicador personalizado emplea un montón de indicadores estándar como la desviación estándar y las medias móviles, recomiendo hacer estos cálculos dentro de la EA.