![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Ce n'est pas le cas. Il y aura une rupture de connexion de plusieurs barres, plusieurs barres seront non initialisées avec des déchets.
Soit, comme Dmitry l'a dit plus haut, il y a eu une rupture de connexion de plusieurs barres... Au fait, est-ce que prev_calculated renvoie également 0 en cas d'échec de la connexion ?
Apparemment, il y a effectivement eu une rupture de communication à ce moment-là.
2016.10.19 04:45:37.260 Network '4092672': scanning network for access points
2016.10.19 04:45:36.630 Network '4092672': trading has been enabled - hedging mode
2016.10.19 04:45:36.630 Network '4092672': terminal synchronized with MetaQuotes Software Corp.
2016.10.19 04:45:36.000 Network '4092672': previous successful authorization performed from 31.173.80.3 on 2016.10.18 17:51:14
2016.10.19 04:45:36.000 Network '4092672': authorized on MetaQuotes-Demo through Access Point SG Singapore (ping: 583.86 ms)
2016.10.19 04:42:57.680 Network '4092672': connection to MetaQuotes-Demo lost
Et il est très probable que lorsqu'il y a une rupture, prev_calculated renvoie 0.
OK, c'était une longue pause, mais qu'est-ce qui a causé les autres nullités prev_calculées ?
De ces lignes.
2016.10.18 23:51:20.865 Network '4092672': scanning network for access points
En dehors de ceux mentionnés ci-dessus, il n'existe pas d'autres documents que des documents commerciaux comme celui-ci.
Et vous pouvez voir combien de mise à zéro de prev_calculated était dans mon post précédent.
Potentiellement, la faute pourrait être ici :
{
minEquity = 0;
maxEquity = 0;
}
minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Lorsqu'une nouvelle barre arrive, vous remettez les valeurs à 0 - très bien. Mais alors vous vérifiez minEquity et 0 pour l'égalité, ce qui n'est pas recommandé.
Pour prouver mes dires, voici votre image. Vous pouvez voir que les valeurs "poubelle", comme vous l'avez dit, sont à peu près nulles.
Bien entendu, il est préférable d'ajouter une fenêtre de données dans l'image avec la valeur "poubelle".Pouvez-vous expliquer pourquoi cette méthode n'est pas recommandée ?
Cette partie du code (minEquity == 0? bal : minEquity), si minEquity == 0, renverra la valeur de bal qui a été obtenue précédemment ; la valeur de minEquity ne changera pas jusqu'à ce que la fonction fmin() se termine.
Bien que je convienne qu'un tel écrit est un peu risqué... mais ce n'est pas le problème.
Pouvez-vous expliquer plus en détail pourquoi cette méthode n'est pas recommandée ?
cette partie du code (minEquity == 0? bal : minEquity), si minEquity == 0, retournera la valeur de bal obtenue précédemment ; la valeur de minEquity ne changera pas jusqu'à la fin de la fonction fmin()
Bien que je convienne que cette façon d'écrire le code est un peu risquée... mais ce n'est pas le problème.
Je parlais spécifiquement de ceci : minEquity ==0. Vous comparez sur l'égalité des nombres doubles. Cela pourrait expliquer la chute des valeurs à 0.
Je vois, la réponse correcte est minEquity ==0.0 ... Je ne peux pas m'y habituer.
Et la dernière phrase, je ne la comprends pas du tout. Quelles valeurs à 0 ?
Je vois, la réponse correcte est minEquity ==0.0 ... Je ne peux pas m'y habituer.
Et la dernière phrase, je ne la comprends pas du tout. Quelles valeurs à 0 ?
Mais je ne sais pas si une conversion de type implicite peut provoquer une erreur. Je voulais parler de la comparaison de types réels. C'est-à-dire qu'ici, pour être sûr, je l'écrirais de cette façon :
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
Cependant, je ne sais pas si une conversion de type implicite peut provoquer une erreur, je parlais, en principe, de la comparaison de types réels. Par exemple, ici, pour la fiabilité, je l'écrirais comme ceci :
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
Oui, ma version compte l'argent avec deux décimales. Il ne s'agit pas d'une citation, vous ne pouvez donc pas être aussi précis à ce sujet.
Ce n'est pas une question de méticulosité, c'est une question de précision. Dans votre cas, cela pourrait entraîner l'écriture d'une valeur nulle dans le tampon. Si vous ne voulez pas une telle précision, faites-le de cette façon :
{
minEquity = -1.0;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Alors il n'y aura pas d'erreur.
Ce n'est pas une question de méticulosité, c'est une question de précision. Dans votre cas, cela pourrait entraîner l'écriture d'une valeur nulle dans le tampon. Si vous ne voulez pas cette précision, faites-le de cette façon :
{
minEquity = -1.0;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Il n'y aura pas d'erreur dans ce cas.
Pourquoi suis-je si stupide ? Comment ai-je pu ne pas deviner qu'il vaut mieux initialiser minEquity avec une valeur non nulle ? Alors tout sera plus facile...
{
minEquity = DBL_MAX;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Vous pouvez également utiliser maxEquity = DBL_MIN;
Pourquoi suis-je si stupide ? Comment ai-je pu ne pas deviner qu'il vaut mieux initialiser minEquity avec une valeur non nulle ? Alors tout serait plus facile...
{
minEquity = DBL_MAX;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Eh bien... Ou alors...