Questions des débutants MQL5 MT5 MetaTrader 5 - page 589

 
admoon:



En vérifiant l'indicateur pas à pas, j'ai trouvé un rebondissement dans la sous-routine derrière le if {} et dans laquelle il n'y a pas de W. Voici un code simplifié pour clarifier le point :

//--- paramètres d'entrée

entrée int w=10 ;

//---

{

int i ;

//---

int co=0 ;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- retour de la valeur de prev_calculée pour l'appel suivant

retour(taux_total) ;

}

Résultat (arlets) :

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. à 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Règle : Si l'expression entre parenthèses est vraie, alors l'opérateur1 est exécuté.

Dans le code : l'opérateur1 est exécuté TOUJOURS.

Je pense que if() ne devrait fonctionner qu'une seule fois lorsque la condition entre parenthèses est vraie. Mais elle se produit en réalité à chaque vérification, de sorte que toutes les expressions dans {} sont exécutées à chaque étape et grugent du temps machine.

Questions : POURQUOI la variable CO est-elle passée de 0 à 11 pendant la boucle ? Pourquoi Alert est-il déclenché à chaque étape ?

Combien de fois dois-je te le dire ?

Regardez : vous avez w égal à 10,
Vous vérifiez w pour 10 : "if(w==10){co++ ; Alert(co);}" Pensez-vous que cette expression est vraie ?
Alors pourquoi cette question ?

 
admoon:



En vérifiant l'indicateur pas à pas, j'ai détecté un rebondissement dans la sous-routine derrière le if {} et dans laquelle il n'y a pas de W. Voici un code simplifié pour clarifier la question :

//--- paramètres d'entrée

entrée int w=10 ;

//---

{

int i ;

//---

int co=0 ;

for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- retour de la valeur de prev_calculée pour l'appel suivant

retour(taux_total) ;

}

Résultat (arlet) :

2016.05.30 00:45:14.064 1 (EURUSD,H1) 11

2016.05.30 01:10:35.972 1 (EURUSD,H1) 10

........... etc. à 1.

2016.05.30 00:45:14.064 1 (EURUSD,H1) 1

Règle : Si l'expression entre parenthèses est vraie, alors l'opérateur1 est exécuté.

Dans le code : l'opérateur1 est exécuté TOUJOURS.

Je pense que if() ne devrait fonctionner qu'une seule fois lorsque la condition entre parenthèses est vraie. Mais elle se produit en réalité à chaque vérification, de sorte que toutes les expressions dans {} sont exécutées à chaque étape et grugent du temps machine.

Questions : POURQUOI la variable CO est-elle passée de 0 à 11 pendant la boucle ? Pourquoi l'alerte est déclenchée à chaque étape ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

Andrey Barinov, 2016.05.30 10:38

Apparemment, vous avez une erreur de frappe dans le code, et vous vouliez écrire comme ceci :

int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(i==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 
Bonjour messieurs ! J'ai un petit problème avec l'écriture d'un EA(( l'EA ouvre les ordres en attente la plupart du temps ok, mais parfois j'ai besoin d'ouvrir des ordres très proches du prix actuel, alors comment prescrire que les ordres en attente s'ouvrent aussi près que possible ?
 
barudkinarseniy:
Bonjour messieurs ! J'ai un petit problème lors de l'écriture d'un EA(( L'EA ouvre des ordres en attente la plupart du temps très bien, mais parfois j'ai besoin d'ouvrir des ordres très proches du prix actuel, alors comment prescrire qui ouvrirait des ordres en attente aussi proches que possible ?
Je pense que j'ai compris) Si cela intéresse quelqu'un, voici comment cela fonctionne
 double ilow = iLow(Symbol(),TimeFrames_3,1);
 double ihigh = iHigh(Symbol(),TimeFrames_3,1);
 
 double OpenPriceBuy = NormalizeDouble(MathMax(ihigh,Ask + Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 double OpenPriceSell = NormalizeDouble(MathMin(ilow,Bid - Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 
 int StepST = (int)MathMax(OpenPriceBuy - OpenPriceSell,SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
 double lots = LotsByRisk(StepST);
 
Artyom Trishkin:

Combien de fois dois-je te le dire ?

Regardez : vous avez w égal à 10,
Vous vérifiez que w est égal à 10 : "if(w==10){co++ ; Alert(co);}" Pensez-vous que cette expression est vraie ?
Alors pourquoi cette question ?

Je m'excuse pour cette question stupide et je vous remercie de votre patience et de votre compréhension. J'ai été déçu en déplaçant mécaniquement la sonde if(w==10){ Alert(I,"/",F) ; à travers le programme à la recherche d'une erreur dans les étapes. Cela arrive parfois lorsque vous vous heurtez à un mur de votre propre ignorance de la raison, mais une fois que vous vous tenez à l'écart du problème pendant un certain temps, la question se résout d'elle-même. Ce que vous percevez comme une "secousse" s'avère en fait être une demande non prise en compte provenant d'une autre partie du programme. Merci, Vladimir.

 

Bonjour, pouvez-vous m'aider avec les maths s'il vous plaît ?

Comment savoir quel sera le lot de la cinquième position, si vous connaissez le lot de la première et que le lot de chaque nouvelle position augmente en progression arithmétique.

La deuxième option est que le lot augmente avec la progression géométrique.

 
mila.com:

Bonjour, pouvez-vous m'aider avec les maths s'il vous plaît ?

Comment savoir quel sera le lot de la cinquième position, si vous connaissez le lot de la première et que le lot de chaque nouvelle position augmente en progression arithmétique.

La deuxième option est que le lot augmente avec la progression géométrique.

Êtes-vous banni de Google ? Je suis désolé, pourquoi es-tu si cruel ? ))

La progression arithmétique est définie par une formule.

laprogression géométrique est donnée par la formule

 

Je ne comprends pas, en théorie pour la première variante il suffit de multiplier le premier lot par 5, s'il augmente du lot de départ...

Pour la deuxième option : le multiplicateur du lot* de la première position*5 ...mais

 
mila.com:

Je ne comprends pas, en théorie, pour la première option, il suffit de multiplier le premier lot par 5.

Pour la deuxième option, le lot de la première position * coefficient * 5 ...mais

C'est bon, j'ai moi-même oublié les maths depuis l'école ;)) J'ai ressorti un livre de mathématiques, j'ai retapé la définition d'arithmétique, de progression.

-------------

Suite de nombres dont chacun, à partir du deuxième, est obtenu à partir du précédent en ajoutant un nombre constant d, appelé différence d'une progression arithmétique.

Si le premier terme est a1, alors la prog. arith. de longueur n a la forme :

a1, a1+d, a1+2*d, ...., a1 + n*d

Le code en MQL est comme ceci, j'ai créé un exemple simple

#define  LEN 5 // задали длину последовательности

int start()
{
    int d = 4;    // это разность, любое значение
    int a[LEN];   // тут храним ариф. посл.
    a[0] = 3;     // любое стартовое значение, задаете сами
    Print(0, "  ", a[0]);

    for (int n = 1; n < 4; n++)
    {
       a[n] = a[0] + (n*d);
       Print(n, "  ", a[n]);
    }
}

2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 3  15
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 2  11
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 1  7
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 0  3
 
Alexey Volchanskiy:

C'est bon, j'ai moi-même oublié les maths depuis l'école ;))

Je vais me promener, puis je vais écrire le code pour le programme de géométrie.
Raison: