Pregunta sobre el indicador - página 3

 
Agent86:
.

Así que de todos modos, yo estaba tratando de hacer los fractales altos sólo se forman cuando otra condición se produce como cruces iMACD, o cruces EMA o algunos otros cruces de indicadores.
Para que los fractales sólo se muestren en el indicador cuando se cumplan todas las condiciones.


No estaba seguro de lo que intentabas hacer, pero prueba esto, fíjate en las entradas externas.

#property indicator_chart_window      extern bool condition1 = true;
#property indicator_buffers 3         extern bool condition2 = true;
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     if(condition1)
       {
        val1=iFractals(NULL, 0, MODE_UPPER,i);
        if (val1 > 0) v1[i]=High[i];       
       }   
     if(condition2)
       {      
        val2=iFractals(NULL, 0, MODE_LOWER,i);
        if (val2 > 0) v2[i]=Low[i];
       }
     }    
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
WHRoeder:
¿Cómo ha llegado exactamente a esa conclusión y cuál es la diferencia funcional?

Llegué a esa conclusión, porque probablemente, yo estaba mirando desde perspectivas OOP. sí, esto no es cierto para el caso de MQL4, recuerdo ahora. Aunque puede ser una buena práctica?



 

¿O tal vez algo como esto?

sin embargo, deberías usar IndicatorCounted(), porque si lo haces así tu indicador está redibujando todos esos objetos en cada nuevo tick en lugar de dibujarlos todos una sola vez y añadir nuevos a medida que se forman nuevas barras

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster=0;
   double   slower=0;         
   int      bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i); //MODE_MAIN
     slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i); //MODE_SIGNAL
     val1=iFractals(NULL, 0, MODE_UPPER,i);
     val2=iFractals(NULL, 0, MODE_LOWER,i);
     
     if(faster > 0)
      {
       if (val1 > 0) v1[i]=High[i];
      }
      
     if(faster < 0)
      {
       if (val2 > 0) v2[i]=Low[i];
      }        
    }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
diostar:
Llegué a esa conclusión, porque probablemente, yo estaba mirando desde perspectivas OOP. sí, esto no es cierto para el caso de MQL4, recuerdo ahora. Aunque puede ser una buena práctica?

Siempre es una buena práctica limitar el alcance. siempre es una buena práctica definir la variable/objeto donde se utiliza y inicializarlos en ese punto.

Definir un objeto fuera del bucle da como resultado una construcción por defecto más N asignaciones. Definido dentro del bucle resulta en N construcciones con valor - generalmente más rápido.

Nunca te preocupes por las optimizaciones hasta que puedas probar que el cambio hace una diferencia.

 
WHRoeder:

Siempre es una buena práctica limitar el alcance. Siempre es una buena práctica definir la variable/objeto donde se usa y inicializarla en ese punto.

Definir un objeto fuera del bucle da como resultado una construcción por defecto más N asignaciones. Definir dentro del bucle resulta en N construcciones con valor - normalmente más rápido.

Nunca te preocupes por las optimizaciones hasta que puedas probar que el cambio hace una diferencia.

Esto debería aplicarse también a su iterador. for (int i=0;. ..
 
diostar:
Esto debería aplicarse también a su iterador. for (int i=0;. ..
Estoy de acuerdo, pero yo no escribí ese código.
 
Ok, parece que ahora tengo algunas variaciones de un código que funciona gracias.

Aunque, estoy un poco confundido en cuanto a por qué la declaración de las variables (más rápido y más lento) fuera del bucle no es bueno, mientras que está bien dentro del bucle

¿Y el int i = Bars funcionará fuera del bucle o dentro del bucle?


De todas formas es bueno ver que algunas de mis ideas en las que estaba trabajando ya están publicadas en este hilo, así que esto es una buena noticia y significa que me estoy acercando un poco más a ser capaz de codificar algo por mi cuenta algún día. Así que un poco de progreso es mejor que nada. Gracias

Así que ahora puedo trabajar en la comparación de algunos de los tiempos de los indicadores, voy a tratar de resolver esto ahora.

Como por ejemplo
Comparar v1[i] a v2[i] Indicador actualmente formado Tiempos && / || if(v1[i] tiempo es > v2[i] tiempo) y otras comparaciones como esta.

Gracias por todos los consejos de todo el mundo esto ha sido una gran ayuda.
 
WHRoeder:

Siempre es una buena práctica limitar el alcance. Siempre es una buena práctica definir la variable/objeto donde se usa y inicializarla en ese punto.

Definir un objeto fuera del bucle da como resultado una construcción por defecto más N asignaciones. Definir dentro del bucle resulta en N construcciones con valor - normalmente más rápido.

Nunca te preocupes por las optimizaciones hasta que puedas probar que el cambio hace una diferencia.

Supongo que esto es cierto para todos, y no sólo para los indicadores / indicadores personalizados?
 
Agent86:
Ok, parece que tengo algunas variaciones de un código de trabajo ahora gracias.

Aunque, estoy un poco confundido en cuanto a por qué la declaración de las variables (más rápido y más lento) fuera del bucle no es bueno, mientras que es bien dentro del bucle

¿Y el int i = Bars funcionará fuera del bucle o dentro del bucle?


Tienes que tener en cuenta qué es lo que estás haciendo, cuando creas un indicador estás aplicando tu código a todas y cada una de las barras del gráfico, esto significa que necesitas obtener el valor del indicador macd tal y como era para cada una de esas barras históricas.

En tu código original lo hiciste:

double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), 
el último parámetro 1 es el valor del macd tal y como estaba en la barra 1 del gráfico, la barra anterior a la actual que está indexada como barra 0

Obviamente no quieres usar ese único valor del macd en tu operador condicional sobre todo el gráfico histórico .

Necesitas indexar el macd al mismo índice de barra que cada barra así que por ejemplo en la barra 500 necesitas esto

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,500) 

ese último parámetro debe cambiar para coincidir con el número de barra al que su indicador está aplicando sus algoritmos.

por eso lo necesitas dentro del bucle, para que puedas usar el iterador del ciclo del bucle ( i ) para el último parámetro por lo que obtienes tu valor de macd como era para cada barra del gráfico histórico.

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i), 

Espero que esto ayude a aclarar un poco las cosas.

 
WHRoeder:
Pruebe este cambio
¿Por qué for(int i = Bars-1 ?

¿Y por qué es mejor que for(int i = Bars?

Por favor, aconsejar gracias

Razón de la queja: