Erreurs, bugs, questions - page 1126

 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

Comment s'explique cette fermeture d'un poste de testeur ? Est-ce dû à l'élargissement de l'écart ?

Captures d'écran de la plateforme de trading MetaTrader

EURUSD, M20, 2014.04.12

Alfa-Forex, MetaTrader 5, Real

temp_file_screenshot_63279.png

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Real


 
Crucian:

Comment s'explique cette fermeture d'un poste de testeur ? Est-ce l'élargissement de l'écart ?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img]

Si l'écart s'est élargi (et à en juger par la capture d'écran - de 720 points ! sur cinq chiffres), alors tout est correct.

La position de vente a été fermée au prix Ask. C'est si les arrêts ont été fixés.

D'ailleurs, votre courtierAlfa-Forex a desspreads tout simplement gigantesques à la fin de la semaine et au début.

Elles ont probablement été enregistrées dans l'historique des cotations et le testeur a simulé des transactions sur ces dernières.

Les arrêts pour le week-end sont dangereux - ils ne sauveront pas de l'écart de toute façon, et l'élargissement de l'écart peut facilement vous rattraper.

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

Pas d'erreur ici carLONG_MAX+1< 0

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
Ici l'avertissement est valable (t<LONG_MAX toujours vrai si t int ) boucle infinie.
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1 e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
Il n'y a pas d'erreur ici, car ULONG_MAX-1< 0, c'est-à-dire que l'opération de comparaison est convertie en int ou long - plus précisément il y a une comparaison bit à bit
 
A100:
Il n'y a pas d'erreur parce que ULONG_MAX-1< 0, car l'opération de comparaison est réduite à int

Alors comment expliquer cela :

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
Il n'y a pas d'erreur ici car ULONG_MAX-1< 0, c'est-à-dire que l'opération de comparaison est convertie en int ou long

Voulez-vous dire la comparaison dans l'expression testée dans la boucle ?

Parce que ce n'est pas ce qui ressort d'une simple comparaison.

 
A100:

Il suffit de les intervertir :)

Que fait ce réarrangement ? t était inférieur à ULONG_MAX-1 et l'est toujours.

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}
 
Fleder:

Que fait ce réarrangement ? t était inférieur à ULONG_MAX-1 et reste le même.

J'ai cité ce mauvais exemple - il s'agissait d'une comparaison avec int, alors qu'ici c'est avec long

for(int t=0
void OnStart()
{
  long t=0;