Indicatore Domanda - pagina 7

 
Si tratta dell'ambito e dell'ultimo valore impostato. Tutte queste variabili hanno uno scopo di almeno la funzione in cui si trovano, se sono dichiarate globalmente allora hanno uno scopo al di fuori della funzione. Se il valore di una variabile cambia 3 volte all'interno di un ciclo, non potete ottenere il secondo valore su cui è stato impostato dall'esterno del ciclo, perché nel momento in cui il codice fuori dal ciclo viene eseguito, la variabile è impostata sul suo terzo valore.
 
Se uso qualcosa del genere

E diciamo che dichiaro val1 con shift 3
e poi il loop ovviamente è shift i

Se mi riferisco a val1 fuori dal loop, sto parlando di val1 globale o val1 in loop?

Mi sto chiedendo se dovrei aggiungere un frattale globale separato per le mie dichiarazioni if come val3 e val4 o qualcosa del genere

Sono un po' bloccato qui, ma sembra che lo schema ABCD stia almeno facendo un piccolo progresso

Comunque questo è il codice, qualche 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);
  }    

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


Quindi la A sarebbe il minimo precedente e la val1 dovrebbe essere l'attuale spostamento 3, e lo stesso con a e val2

Devo fare altri test per essere sicuro che A e a si riferiscano ai valori corretti, perché ho aggiunto le dichiarazioni !=0 in modo che non stampi i valori vuoti.
Sembra essere ok a prima vista, ma ho bisogno di riconfermare questo

In ogni caso per riaffermare questo:
Il val1 nel mio if(statement) si riferisce correttamente alla condizione corretta o ho bisogno di un iFractal completamente diverso per riferirsi allo shift 3
Non posso davvero dire se funziona bene o no, sembra funzionare ma qualcosa non sembra giusto e non posso smettere di metterci il dito sopra.

Per favore consigliatemi

Grazie

Anche se questo non è più l'argomento di un indicatore, dovrei spostarlo in un nuovo argomento?

 
Agent86:
Se uso qualcosa del genere

E diciamo che dichiaro val1 con shift 3
e poi il ciclo ovviamente è shift i

Se faccio riferimento a val1 al di fuori del loop parlerò di val1 globale o di val1 in loop ?

Credo che mi sto chiedendo se dovrei aggiungere un frattale globale separato per le mie dichiarazioni if come val3 e val4 o qualcosa del genere

val1 & val2 sono dichiarati con ambito globale, i è dichiarato localmente all'interno di start().

val1 e val2 all'interno o all'esterno del ciclo hanno l'ultimo valore che è stato loro assegnato . . . questo avviene prima del ciclo e quindi i valori possono essere modificati all'interno del ciclo . . . una volta che il ciclo è uscito i valori sono quelli che sono e rimangono tali fino a quando start() viene chiamato la volta successiva, poi vengono resettati e quindi eventualmente modificati nel ciclo . . . ecc. ecc.

 
RaptorUK:

val1 & val2 sono dichiarati con scope globale, i è dichiarato localmente all'interno di start().

val1 e val2 all'interno o all'esterno del ciclo hanno l'ultimo valore che è stato loro assegnato . . . questo avviene prima del ciclo e quindi i valori possono essere modificati all'interno del ciclo . . . una volta che il ciclo è uscito i valori sono quelli che sono e rimangono tali fino a quando start() viene chiamato la volta successiva, poi vengono resettati e quindi eventualmente modificati nel ciclo . . . ecc. ecc.

Hmmm, così decisioni decisioni decisioni.

Potrei provare ad andare dopo i valori mentre nel ciclo e semplicemente ridichiarare val1 e val2 =iFractal,,,3 di nuovo. Per resettare le cose ma solo dopo aver dichiarato A=val2 e a=val1 in modo da avere un valore per questi che spero sia il mio frattale precedente se ho capito bene.

Oppure potrei ridichiarare val 1 e val2 al di fuori del ciclo, ma non voglio perdere il valore di A o a quindi devo solo lavorarci su al momento giusto penso.

Potrei anche sbagliare tutto insieme, ma non importa. Devo iniziare da qualche parte, quindi ho scelto questo per ora; e posso aggiustarlo quando avrò più esperienza.

Grazie per l'aiuto
 
Quindi questi sono un po' irrilevanti?

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

 

Immagino che probabilmente dovrei cambiare questi in val3 e val4 per usare l'attuale iFractal per il trading e solo come riferimento e usare (A) e (a) per fare riferimento al mio precedente frattale.


Continuerò a lavorarci

Grazie

 
Ok

Dopo alcuni giorni a pensarci e a cercare di lavorare attraverso la logica, penso di avere un codice che funziona meglio ora, anche se non è perfetto, ma sta progredendo

//+------------------------------------------------------------------+
//|                                                  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);
  }    

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


      

Quindi ho i miei valori A e B e mentre una dichiarazione di indicatore viene messa nell'if iniziale (dichiarazioni && indicatori) i valori vengono stampati una volta per esempio MACD più veloce > più lento o qualche dichiarazione di indicatore simile.

Così ottengo solo A e B come vorrei

Non sono sicuro del perché stampa più volte quando le opzioni dell'indicatore sono tolte dai miei if(statements)

Comunque mi sto avvicinando un po' di più a questo schema tipo ABCD che può essere usato anche su altri indicatori non solo sui frattali ecc. per riferimento futuro

Si prega di consigliare

Grazie

 

Questo potrebbe aiutarvi. È un indicatore per accedere agli ultimi frattali e allo spostamento che potresti usare per risolvere il tuo ABCD.

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

Questo darà i frattali superiori. Cambia "" in "L" per i frattali inferiori.

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

Darà il frattale prima del più recente.

File:
 
heelflip43:

Questo potrebbe aiutarti. È un indicatore per accedere agli ultimi frattali e allo spostamento che potresti usare per risolvere il tuo ABCD.

Questo darà i frattali superiori. Cambia "" in "L" per i frattali inferiori.

Darà il frattale prima del più recente.

Sì, vedo che

Prima del mio ultimo codice in questo thread avevo elaborato alcune varie dichiarazioni (for) con qualche aiuto ed era anche un indicatore che ero in grado di disegnare ciò che volevo nel buffer, tuttavia questo mi ha portato ad un altro problema di cercare di estrarre i valori e stampare solo quei valori una volta per essere usati o referenziati.

Dato che queste varie dichiarazioni for mi causano problemi e quelle sono simili al codice che hai postato.
Non sono mai stato in grado di ottenere i valori senza stampare costantemente il valore ogni volta che diventa vero, che è continuamente.
Ho risolto un po' di questo, ma ancora non ho mai veramente imparato come fermarmi una volta che una condizione è vera.

Vedo che nel tuo codice una cosa che potrebbe aiutare è il blocco statico datetime e l'ho usato solo una volta prima per fare riferimento alla condizione solo quando arriva una nuova barra e un nuovo tempo di barra.
Questa parte potrebbe essere utile con quello che sto lavorando. E anche se il mio codice attuale produce il frattale attuale e il frattale precedente attualmente funziona

L'unico problema che ho per lo più è che una volta che la condizione è vera stampa la dichiarazione continuamente, il che potrebbe essere ok, ma questo significa che probabilmente piazzerà anche un trade continuamente una volta che arrivo a quel punto.

Forse ho bisogno di più esperienza su come usare gli indicatori iCustom e questo potrebbe risolvere molti dei miei problemi, ma non sono ancora così lontano nel mio apprendimento.

Rivedrò questo codice ancora un po', e le parti EMPTY_VALUE. Ora che lo vedo in uso posso imparare anche da questo. È stato suggerito prima, ma non ho mai capito come usarlo.

Continuerò a lavorarci sopra
Grazie per l'aiuto
 
Un'ultima cosa che ho notato è che quando aggiungo diciamo MACD al if(val1 > 0 && faster > slower && traded == false)

Allora funziona e dà esattamente quello che voglio, cioè stampare il minimo A, il massimo B, poi e/o il minimo B e il massimo A

Ma se tolgo il più veloce > più lento e il più veloce < più lento su entrambe le dichiarazioni if, allora noto che non stampa MAI il massimo A e stampa continuamente anche gli altri, il che mi confonde


Continuerò a lavorarci, sono sicuro che ho bisogno di fargli stampare la dichiarazione una volta sola senza altre dichiarazioni di indicatori nell'EA in modo da sapere che gli indicatori non interferiranno con le parti ABCD del codice

Ritorno al tavolo da disegno


 

Credo che il tuo problema sia che non hai resettato val1 e val2. Quindi una volta che hai trovato il massimo e l'ultimo minimo devi resettarli:

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;
      }
Speriamo che questo ti aiuti.
Motivazione: