prev_calculé - page 10

 
Dmitry Fedoseev:
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.
Alexey Kozitsyn:
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:46:13.770 Network '4092672': scanning network finished
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:34.895 Network '4092672': scanning network finished
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.

2016.10.19 00:00:36.066 Trades  '4092672': cancel order #103987819 buy stop 0.10 USDJPY at 103.977 sl: 103.377 tp: 104.077

Et vous pouvez voir combien de mise à zéro de prev_calculated était dans mon post précédent.

 
Alexey Kozitsyn:

Potentiellement, la faute pourrait être ici :

if(rates_total > prev_calculated)
   {
    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.

 
Alexey Viktorov:

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 à des nombres égaux de doubles. Cela pourrait expliquer la chute des valeurs à 0.
 
Alexey Kozitsyn:
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 ?

 
Alexey Viktorov:

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 :

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Alexey Kozitsyn:

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 :

CompareDoubles( minEquity, 0.0 );

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. Ce n'est pas une citation pour être aussi méticuleux à ce sujet.
 
Alexey Viktorov:
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 :

if(rates_total > prev_calculated)
   {
    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.

 
Alexey Kozitsyn:

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 :

if(rates_total > prev_calculated)
   {
    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...

if(rates_total > prev_calculated)
   {
    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;

 
Alexey Viktorov:

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...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);


Eh bien... ou à peu près...
 
Alexey Kozitsyn:
Eh bien... Ou alors...
Ce n'est pas vraiment le problème. Bien que cela ait été contourné d'une manière ou d'une autre, les déchets dans le tampon de l'indicateur lorsque celui-ci démarre ne sont pas corrects.