Pregunta sobre el indicador

 

Hola a todos,

Estaba aprendiendo algunos temas generales sobre arrays de un indicador de código base que tiene iFractals con alguna gran ayuda de los gurús en los foros.


Así que de todos modos

No he podido añadir operadores condicionales u operaciones lógicas para añadir la función de adición al indicador

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


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

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
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 i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Intenté insertar if(faster > slower) en varias áreas del código sólo para jugar con la idea. Normalmente, estas ideas funcionarían en un EA pero no en un indicador

IE if(v1 > 0 && faster > slower)

pero esto hace que el indicador desaparezca.

Muchas otras combinaciones que pensé que deberían producir el indicador deseado si (otras condiciones) etc. y así sucesivamente.
Todos producen ninguna salida de declaración de impresión.

¿Qué punto me estoy perdiendo aquí.

Por favor, aconsejar
Gracias





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


Bueno, lo hice al principio pero luego no pude imprimir los valores del buffer que quería hacer

Bueno espera, déjame replantear esto:

Si no declaro el número de elementos en el buffer, entonces el indicador funcionará como con v1[i]=High[i]
Pero Print (v1[i]); no saldrá porque por lo que puedo decir no hay manera de imprimir valores de array no declarados si el número de elementos no fue declarado, por lo tanto siempre imprimirá 0

Así que si no lo declaro globalmente, entonces el indicador funciona, sin embargo el if(faster>slower) todavía hace que el indicador desaparezca, Y tampoco puedo imprimir los valores.

Si lo declaro y además lo reinicio de nuevo con v1[i]=High[i] entonces puedo imprimir, sin embargo cualquier adición como && faster > slower eliminará el indicador de nuevo.

No entiendo del todo por qué.

Gracias
 

He cogido tu código, he quitado los valores de las declaraciones del buffer y funciona bien....

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[27]= 1.5954 if


 
RaptorUK:

He cogido tu código, he quitado los valores de las declaraciones del buffer y funciona bien....

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----High

------> en este momento Fractales inconsistente alta es inferior a la prev baja <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> en este momento Fractales inconsistente alta es inferior a la prev baja <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Low

2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

------> en este momento alternando Fractales consistentes <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if <----Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if <----High


Interesante, thx para el resultado Agent86V2. Los fractales son de hecho uno de esos intrigantes, pero puede ser rentable forma de comercio.

 
RaptorUK:

He cogido tu código, he quitado los valores de las declaraciones del buffer y funciona bien. ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agente86V2 GBPUSD,H1: v2[27]= 1.5954 if


También puedo imprimir el código sin producir valores cero que no era ese caso en el otro hilo.
Lo siento es que no lo entiendo. Creía que sí, pero parece que todavía me falta algo.

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
Me has indicado que declare como arriba :

Y citaste este tema:

Cuando leíste el libro sobre Arrays ¿viste dónde decía esto?

"Al declarar un array, se debe especificar el tipo de datos, el nombre del array y el número de elementos de cada dimensión:"

Así que, por un lado, no puedo imprimir el array como en este script sin declarar primero double test[40]; como me indicaste, pero ahora parece que también puedo imprimir sin declaración.

Así que parece que puedo imprimir los valores del buffer independientemente de la declaración.

Sin embargo, no puedo añadir condiciones adicionales que normalmente producirían el resultado deseado como if(faster > slower) o && faster > slower
Puede ser EMA cualquier cosa, sólo quiero entender por qué no funciona.
Hace que los máximos del indicador desaparezcan y la salida de impresión v1 deja de imprimirse. Esperaba que se ajustara a la condición e imprimiera la salida.

He intentado añadir bloques de código adicionales para esto también con los mismos resultados.

Gracias
 

También escribí esto. . .

RaptorUK:

Los buffers indicadores son Arrays especiales. . . no confundas Arrays y Buffers, son similares pero diferentes.

En el código original v1[] y v2[] son buffers, en tu último código son Arrays, cuando declaras un Array tienes que darle un tamaño, por ejemplo, v1[50] tiene 50 elementos desde v1[0] hasta v1[49]. El Buffer se redimensiona automáticamente cuando hay más elementos necesarios y los valores se desplazan en el Buffer automáticamente. Considere la barra que se está formando actualmente, la barra 0, cuando esta barra se completa un valor del Indicador asociado a esa barra tiene que desplazarse al índice 1... esto se hace automáticamente con los Bufers... si quiere hacer algo similar con Arrays puede, pero tiene que codificarlo usted mismo.

 
Agent86:

Sin embargo, no puedo añadir condiciones adicionales que normalmente producirían el resultado deseado como if(faster > slower) o && faster > slower
Puede ser EMA cualquier cosa sólo quiero entender por qué no está funcionando.
Hace que los máximos del indicador desaparezcan y la salida de impresión v1 deja de imprimirse. Esperaba que se ajustara a la condición e imprimiera la salida.

He intentado añadir bloques de código adicionales para esto también con los mismos resultados.

Gracias

Muestra tu código, lo que no funciona.... No utilizo indicadores técnicos. . . nunca, así que no asuma que sé lo que quiere decir con EMAs, etc ;-) tiene que mostrarme su código.
 
RaptorUK:

También escribí esto. . .

RaptorUK:

Los buffers indicadores son Arrays especiales. . . no confundas Arrays y Buffers, son similares pero diferentes.

En el código original v1[] y v2[] son buffers, en tu último código son Arrays, cuando declaras un Array tienes que darle un tamaño, por ejemplo, v1[50] tiene 50 elementos desde v1[0] hasta v1[49]. El Buffer se redimensiona automáticamente cuando hay más elementos necesarios y los valores se desplazan en el Buffer automáticamente. Considere la barra que se está formando actualmente, la barra 0, cuando esta barra se completa un valor del Indicador asociado a esa barra tiene que desplazarse al índice 1... esto se hace automáticamente con los Bufers... si quiere hacer algo similar con Arrays puede, pero tiene que codificarlo usted mismo.

Cierto. "Similar pero diferente". No veo otra forma mejor de decirlo que esta.
 
Ok, similar pero diferente lo entiendo, inicialmente tenía grandes problemas incluso para imprimir v1[i] en cualquier punto del código, pero ahora parece imprimir como esperaba originalmente.
Sólo creé un bucle secundario porque no podía imprimir dentro del primer bucle indicador, pero ahora está imprimiendo
En fin, no voy a repetir esto, creo que ya lo tengo.

Así que el código que no funcionará son algunos ejemplos que se muestran aquí:

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#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 = 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 i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Gracias

 
Agent86:

Así que el código que no funcionará son algunos ejemplos que se muestran aquí:

Gracias

OK, puedo decirte cual es tu problema o puedo darte algunas pistas . . . pistas primero, si quieres que te lo diga solo dilo y te lo diré . .

Dentro del bucle, for(i=Bars; i>=0; i--) . . ¿cuáles son los valores de más rápido y más lento?