Question sur l'indicateur - page 7

 
C'est une question de portée et de dernière valeur définie. Toutes ces variables ont une portée d'au moins la fonction dans laquelle elles se trouvent, si elles sont déclarées globalement, elles ont une portée en dehors de la fonction. Si la valeur d'une variable change 3 fois dans une boucle, vous ne pouvez pas obtenir la deuxième valeur à laquelle elle a été fixée en dehors de la boucle, car au moment où le code en dehors de la boucle est exécuté, la variable a pris sa troisième valeur.
 
Si j'utilise quelque chose comme ceci

Et disons que je déclare val1 avec shift 3
et ensuite la boucle est bien sûr shift i

Si je fais référence à val1 en dehors de la boucle, est-ce que je parlerai de val1 globale ou de val1 bouclée ?

Je suppose que je me demande si je dois ajouter une fractale globale séparée pour mes instructions if comme val3 et val4 ou quelque chose comme ça

Je suis un peu coincé ici, mais il semble que le schéma ABCD fasse au moins un petit progrès

Quoi qu'il en soit, voici le code, des idées ?

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

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


Donc le A serait le bas précédent et la val1 devrait être le décalage actuel 3, et même chose avec a et val2

Je dois tester à nouveau pour m'assurer que A et a font référence aux bonnes valeurs, car j'ai ajouté les instructions !=0 pour ne pas imprimer les valeurs vides.
Cela semble correct à première vue, mais j'ai besoin de reconfirmer ceci

. De toute façon, je vais reformuler ceci :
Est-ce que la val1 dans mon instruction if(statement) fait correctement référence à la condition correcte ou ai-je besoin d'une iFractal complètement différente pour faire référence au décalage 3
Je ne peux pas vraiment dire si cela fonctionne correctement ou non, cela semble fonctionner mais quelque chose ne semble pas correct et je ne peux pas mettre le doigt dessus.

Veuillez me conseiller

Merci

Bien que ce ne soit plus vraiment un sujet sur les indicateurs, devrais-je le déplacer vers un nouveau sujet ?

 
Agent86:
Si j'utilise quelque chose comme ceci

Et disons que je déclare val1 avec shift 3
et que la boucle est bien sûr shift i

Si je fais référence à val1 en dehors de la boucle, est-ce que je parle de val1 globale ou de val1 bouclée ?

Je suppose que je me demande si je dois ajouter une fractale globale séparée pour mes instructions if comme val3 et val4 ou quelque chose comme ça...

val1 & val2 sont déclarés avec une portée globale, i est déclaré localement dans start().

val1 et val2 à l'intérieur ou à l'extérieur de la boucle ont la dernière valeur qui leur a été attribuée... cela se passe avant la boucle et les valeurs peuvent être modifiées à l'intérieur de la boucle... une fois que la boucle est sortie, les valeurs sont ce qu'elles sont et le restent jusqu'à ce que start() soit appelé la fois suivante, puis elles sont réinitialisées et éventuellement modifiées dans la boucle... etc. etc.

 
RaptorUK:

val1 et val2 sont déclarés avec une portée globale, i est déclaré localement dans start().

val1 et val2 à l'intérieur ou à l'extérieur de la boucle ont la dernière valeur qui leur a été attribuée... cela se passe avant la boucle et les valeurs peuvent être modifiées à l'intérieur de la boucle... une fois que la boucle est sortie, les valeurs sont ce qu'elles sont et le restent jusqu'à ce que start() soit appelé la fois suivante, puis elles sont réinitialisées et éventuellement modifiées dans la boucle... etc. etc.

Hmmm, donc des décisions, des décisions.

Je pourrais essayer d'aller chercher les valeurs pendant que je suis dans la boucle et juste redéclarer val1 et val2 =iFractal,,,,3 à nouveau. Pour réinitialiser les choses, mais seulement après avoir déclaré A=val2 et a=val1 afin d'avoir une valeur pour ces valeurs qui, je l'espère, est ma fractale précédente si j'ai bien compris.

Ou je pourrais redéclarer val 1 et val 2 en dehors de la boucle, mais je ne veux pas perdre la valeur de A ou a, donc je dois juste le faire au bon moment je pense.

Il se peut aussi que je m'y prenne mal, mais peu importe. Il faut bien commencer quelque part, alors j'ai choisi ceci pour le moment ; et je peux l'ajuster au fur et à mesure que j'acquiers de l'expérience.

Merci pour votre aide
 
Donc ces valeurs ne sont pas pertinentes ?

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

 

Je suppose que je devrais probablement les changer en val3 et val4 afin d'utiliser la vraie iFractal pour le trading et seulement faire référence et utiliser (A) et (a) pour faire référence à ma fractale précédente.


Je vais continuer à y travailler

Merci

 
Ok

Après quelques jours à y réfléchir et à essayer de travailler sur la logique, je pense que j'ai un code qui fonctionne mieux maintenant, même s'il n'est pas parfait, mais il progresse.

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

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


      

J'ai donc mes valeurs A et B et si un indicateur est placé dans le if(statements && indicators) initial, les valeurs s'impriment une fois, par exemple MACD faster > slower ou d'autres indicateurs de ce type.

Je n'obtiens donc que A et B comme je le voudrais.

Je ne suis pas sûr de la raison pour laquelle les valeurs s'impriment plusieurs fois lorsque les options d'indicateur sont retirées de mes instructions if(statement).

Quoi qu'il en soit, je me rapproche un peu plus de ce schéma de type ABCD, qui peut être utilisé sur d'autres indicateurs, et pas seulement sur les fractales, etc. pour référence future.

Veuillez me conseiller

Merci

 

Ceci pourrait vous aider. C'est un indicateur pour accéder aux dernières fractales et au décalage que vous pouvez utiliser pour calculer votre ABCD.

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

Cela donnera les fractales supérieures. Changez "" en "L" pour les fractales inférieures.

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

Cela donnera la fractale avant la plus récente.

Dossiers :
 
heelflip43:

Ceci pourrait vous aider. C'est un indicateur pour accéder aux dernières fractales et au décalage que vous pouvez utiliser pour calculer votre ABCD.

Cela donnera les fractales supérieures. Changez "" en "L" pour les fractales inférieures.

Cela donnera la fractale avant la plus récente.

Oui, je vois que

Avant mon dernier code dans ce fil de discussion, j'avais travaillé sur plusieurs instructions (for) avec un peu d'aide et c'était aussi un indicateur que j'étais capable de dessiner ce que je voulais dans le tampon, cependant cela m'a amené à un autre problème d'essayer d'extraire les valeurs et d'imprimer ces valeurs seulement une fois pour être utilisées ou référencées.

Puisque ces diverses instructions for me posent problème et que celles-ci sont similaires au code que vous avez posté.
Je n'ai jamais été capable d'obtenir les valeurs sans imprimer constamment la valeur à chaque fois qu'elle devient vraie, ce qui est continuellement le cas.
J'ai travaillé sur certaines de ces questions mais je n'ai jamais vraiment appris à m'arrêter une fois qu'une condition est vraie.

Je vois dans votre code une chose qui pourrait m'aider : le bloc static datetime. Je ne l'ai utilisé qu'une seule fois auparavant pour faire référence à la condition uniquement lorsqu'une nouvelle barre et une nouvelle heure de barre apparaissent.
Cette partie pourrait être utile dans le cadre de mon travail. Et bien que mon code actuel produise la fractale actuelle et la fractale précédente, il fonctionne actuellement.

Le seul problème que j'ai, c'est qu'une fois que la condition est vraie, l'instruction est imprimée en continu, ce qui peut être correct, mais cela signifie qu'une fois que je suis arrivé à ce point, il est probable qu'une transaction soit placée en continu.

Peut-être ai-je besoin de plus d'expérience sur la façon d'utiliser les indicateurs iCustom et cela pourrait résoudre beaucoup de mes problèmes, mais je ne suis pas encore si loin dans mon apprentissage.

Je vais revoir ce code un peu plus, et les parties EMPTY_VALUE. Maintenant que je vois cela utilisé, je peux apprendre de cela aussi. Cela a été suggéré auparavant mais je n'ai jamais compris comment l'utiliser.

Je vais continuer à travailler dessus.
Merci pour votre aide
 
Une dernière chose, j'ai remarqué que lorsque j'ajoute, disons, MACD au if(val1 > 0 && faster > slower && traded == false)

alors cela fonctionne et donne exactement ce que je veux, c'est-à-dire imprimer le bas A, le haut B, puis et/ou le bas B et le haut A

Mais si j'enlève le plus rapide > plus lent et le plus rapide < plus lent sur ces deux déclarations if, je remarque qu'il n'imprime JAMAIS le haut A et imprime aussi continuellement les autres, ce qui m'échappe.


Je vais continuer à travailler dessus, je suis sûr que j'ai besoin de faire en sorte qu'il imprime la déclaration une seule fois sans aucun autre indicateur dans l'EA afin que je sache que les indicateurs n'interfèrent pas avec les parties ABCD du code

Retour à la planche à dessin.


 

Je pense que votre problème est que vous n'avez pas réinitialisé val1 et val2. Donc une fois que vous avez trouvé le plus haut et le dernier plus bas, vous devez les réinitialiser :

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;
      }
J'espère que ça vous aidera.
Raison: