Pregunta sobre el indicador - página 7

 
Se trata del ámbito y del último valor establecido. Todas estas variables tienen un alcance de al menos la Función en la que están, si se declaran globalmente entonces tienen alcance fuera de la Función. Si el valor de una variable cambia 3 veces dentro de un bucle, no se puede obtener el segundo valor que se estableció desde fuera del bucle, porque en el momento en que el código fuera del bucle se ejecuta la variable se establece en su tercer valor.
 
Si uso algo como esto

Y digamos que declaro val1 con shift 3
y luego el bucle por supuesto es shift i

Si me refiero a val1 fuera del bucle, ¿estaré hablando de val1 global o de val1 en bucle?

Supongo que me estoy preguntando si debería añadir un fractal global separado para mis declaraciones if como val3 y val4 o algo así

Estoy como atascado aquí, pero parece que el esquema ABCD está al menos haciendo un poco de progreso

De todos modos aquí está el código ¿alguna idea?

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                      my attempt at an ABCD scheme and fib retrace | 
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;


//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
   
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;                
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 
  


for(i=0; val1==0 || val2==0; i++)
     {
     if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0) 
     val1 = iFractals(NULL, 0, MODE_UPPER, i);
     if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
     val2 = iFractals(NULL, 0, MODE_LOWER, i);
     double A = val2;
     if(A !=0) 
     Print (A, " A loop down");
     double a = val1;
     if(a !=0)
     Print (a, " a loop up");
      
     //Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
         
     }   
                            
      if(val1 > 0)
         {
         //Print (val1, " val1");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time");      
         //datetime b = Time[3];
         ////Print (A, " A if");
         double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double C=A+Z; //using the calc above to get the retrace value at .50
         //Print (C, " C");
         if(Bid<=C && Bid > A) //C will be somewhere in between here
         Print (Low[0], " Low [0] ", C, " = C");
         // some other signal here to trade at retrace
         }        
         
         

      if(val2 < 0)
         {
         //Print (val2, " val2");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");
         //datetime c = Time[3];
         //Print(a, " a");
         double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double c=a+z; //using the calc above to get the retrace value at .50
         //Print (c, " c");
         if(Bid<=c && c < a) //c will be somewhere in between here
         Print (Low[0], " Low [0] ", c, " = c");
         //some other signal here to trade at retrace
         }
         
                   
                
   return(0);
  }    

//+------------------------------------------------------------------+


Así que la A sería el bajo anterior y el val1 debe ser el actual turno 3, y lo mismo con a y val2

Tengo que volver a probar un poco más para estar seguro de que A y a se refieren a los valores correctos porque añadí las declaraciones !=0 para que no se imprimieran los valores vacíos.
Parece estar bien a primera vista, pero tengo que volver a confirmar esto

De todos modos para replantear esto:
¿El val1 en mi declaración if(statement) se refiere adecuadamente a la condición correcta o necesito un iFractal completamente diferente para referirse al turno 3
No puedo decir realmente si está funcionando bien o no, parece estar funcionando pero algo no parece estar bien y no puedo dejar de poner mi dedo en él.

Por favor, aconsejadme

Gracias

Aunque realmente esto ya no es un tema de indicadores, ¿debería mover esto a un nuevo tema?

 
Agent86:
Si utilizo algo como esto

Y digamos que declaro val1 con shift 3
y luego el bucle por supuesto es shift i

Si hago referencia a val1 fuera del bucle ¿estaré hablando de val1 global o de val1 en bucle?

Supongo que me pregunto si debería añadir un fractal global separado para mis declaraciones if como val3 y val4 o algo así

val1 y val2 se declaran con alcance global, i se declara localmente dentro de start().

val1 y val2 dentro o fuera del bucle tienen el último valor que se les asignó... eso ocurre antes del bucle y luego los valores pueden ser modificados dentro del bucle... una vez que se sale del bucle los valores son los que son y permanecen así hasta que se llama a start() la próxima vez, entonces se reinician y luego posiblemente se modifican en el bucle... etc. etc.

 
RaptorUK:

val1y val 2 se declaran con alcance global, i se declara localmente dentro de start().

val1 y val2 dentro o fuera del bucle tienen el último valor que se les asignó... eso ocurre antes del bucle y luego los valores pueden ser modificados dentro del bucle... una vez que se sale del bucle los valores son los que son y permanecen así hasta que se llama a start() la próxima vez, entonces se reinician y luego posiblemente se modifican en el bucle... etc. etc.

Hmmm, así que las decisiones decisiones.

Podría tratar de ir después de los valores, mientras que en el bucle y sólo redeclare val1 y val2 =iFractal,,,3 de nuevo. Para restablecer las cosas, pero sólo después de declarar A = val2 y a = val1 así que tengo un valor para estos que espero que sea mi fractal anterior si tengo este derecho.

O podría volver a declarar val 1 y val2 fuera del bucle, pero no quiero perder el valor para A o a así que sólo tengo que trabajar en los momentos adecuados creo.

También podría estar haciendo todo esto mal, pero no importa. Hay que empezar por algún lado, así que elegí esto por ahora; y puedo ajustarlo a medida que tenga más experiencia.

Gracias por la ayuda
 
Así que estos son una especie de irrelevante ?

val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);

 

Supongo que probablemente debería cambiar estos a val3 y val4 con el fin de utilizar el iFractal real para el comercio y la única referencia y el uso (A) y (a) para hacer referencia a mi fractal anterior.


Seguiré trabajando en ello

Gracias

 
Ok

Después de unos días pensando en ello y tratando de trabajar a través de la lógica creo que tengo un mejor código de trabajo ahora, aunque no es perfecto, pero está progresando

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                              Unfinished POS slate |
//|                                           See progress notes below |
//+------------------------------------------------------------------+
#property copyright "Unfinished POS slate by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;
bool traded = false;

//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;
   int ticket,total,result;
   total = OrdersTotal();                 
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 


     
     if(val1 > 0 && traded == false)
      { 
      // in the absence of an && indicator above I get continous print statements
      // with indicator added && indicator above, then it prints A and B once as it should ???
      // I need to work this out so it won't print all the time aka trade all the time
      // A and B first values seems to initialize the whole block
      // just a reminder that they time stamps coordinate after this FYI
      // now work on C retrace and possibly signals
      // add options for user to select some candle patterns
      // add options to select indicators
      // add bells and whistles to make things fun
      // alerts,sounds,maybe poppup video animation or something
      
      double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
     
                    
                
   return(0);
  }    

//+------------------------------------------------------------------+


      

Así que tengo mis valores A y B y mientras que una declaración de indicador se coloca en la inicial si (declaraciones && indicadores) los valores de impresión una vez por ejemplo MACD más rápido > más lento o algunas declaraciones de indicadores tales.

Así que obtengo sólo A y B como me gustaría

No estoy seguro de por qué se imprime varias veces cuando las opciones de los indicadores se quitan de mi if(statements)

De todos modos me estoy acercando un poco con este tipo de esquema ABCD que se puede utilizar en otros indicadores también no sólo fractales etc. para futuras referencias

Por favor, asesórese

Gracias

 

Esto podría ayudarte. Es un indicador para acceder a los últimos fractales y al desplazamiento, por lo que podrías utilizarlo para calcular tu ABCD.

iCustom(Symbol(),0,"Fractal Store",0,"",0,0)

Eso dará los fractales superiores. Cambia "" por "L" para los fractales inferiores.

iCustom(Symbol(),0,"Fractal Store",1,"",0,0)

Dará el fractal anterior al más reciente.

Archivos adjuntos:
 
heelflip43:

Esto podría ayudarte. Es un indicador para acceder a los últimos fractales y al desplazamiento, por lo que podrías utilizarlo para calcular tu ABCD.

Eso dará los fractales superiores. Cambia "" por "L" para los fractales inferiores.

Dará el fractal anterior al más reciente.

Sí, veo que

Antes de mi último código en este hilo había elaborado algunas sentencias (for) diversas con algo de ayuda y también era un indicador de que era capaz de dibujar lo que quería en el buffer, sin embargo esto me llevó a otro problema de tratar de extraer los valores y sólo imprimir esos valores una vez para ser utilizados o referenciados.

Ya que estas varias sentencias for me causan problemas y esas son similares al código que publicaste.
Nunca pude obtener los valores sin imprimir constantemente el valor cada vez que se hace true que es continuamente.
He resuelto algo de esto pero todavía no he aprendido a parar una vez que una condición es verdadera.

Veo en tu código una cosa que podría ayudar es el bloque estático datetime y he utilizado eso sólo una vez antes de referirse a la condición sólo cuando una nueva barra y el nuevo tiempo de la barra viene en.
Esta parte podría ser útil con lo que estoy trabajando. Y aunque mi código actual produce el fractal actual y el fractal anterior actualmente está funcionando

El único problema que tengo en su mayoría es que una vez que la condición es verdadera imprime la declaración de forma continua que podría estar bien, pero esto significa que también probablemente colocar un comercio de forma continua una vez que llegue a ese punto.

Tal vez necesito más experiencia en el uso de indicadores iCustom y esto podría resolver muchos de mis problemas, pero no estoy tan lejos en mi aprendizaje todavía.

Revisaré un poco más este código y las partes de EMPTY_VALUE. Ahora que veo eso en uso puedo aprender de eso también. Ya lo habían sugerido antes pero nunca entendí cómo usarlo.

Seguiré trabajando en ello
Gracias por la ayuda
 
Una última cosa que he notado es que cuando añado digamos MACD al if(val1 > 0 && faster > slower && traded == false)

Entonces funciona y sólo da exactamente lo que quiero que es imprimir el A bajo, B alto, entonces y/o B bajo y A alto

Pero si quito el más rápido > más lento y más rápido < más lento en estas dos declaraciones si entonces me doy cuenta de que NUNCA imprime el alto A y también continuamente imprime los otros que estoy confundido acerca de


Voy a seguir trabajando en, estoy seguro de que tengo que conseguir que se imprima la declaración una vez con ninguna otra declaración de los indicadores en la EA para que yo sepa que los indicadores no interfieren con las partes ABCD del código

Volver a la mesa de dibujo


 

Creo que tu problema está en que no has reseteado val1 y val2. Así que una vez que hayas encontrado el máximo y el último mínimo tienes que restablecerlos:

double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               //Print("i "+i);
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 

     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
Espero que eso ayude.
Razón de la queja: