Erreurs, bugs, questions - page 1167

 
TheXpert:
La caste syndicale à la rescousse. C'est légal dans le MQL5, même à travers les structures.
MQL4. Que pouvez-vous faire ?
 
artmedia70:
MQL4. Que pouvez-vous imaginer ?
Le nouveau MQL4 n'est-il pas tiré jusqu'au MQL5 ?
 
marketeer:
Le nouveau MQL4 n'est-il pas tiré jusqu'au MQL5 ?
Pas exactement. Bien que, à en juger par l'aide, c'est presque la même chose. Mais nous ne jugerons pas. C'est le résultat qui nous intéresse.
 
artmedia70:
MQL4. Que pouvez-vous faire ?

Voyons voir...

Voici un script avec le principe, qui devrait fonctionner pour les versions 4 et 5.

struct DoubleContainer
{
   double value;
};

struct LongContainer
{
   long value;
};

long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}

double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}

void OnStart()
{
   long l = 130462919691841406;
   double d1 = (double)l;
   long l1 = (long)d1;
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
}
 
Vinin:
Pas exactement. Bien qu'à en juger par les Helps, c'est à peu près la même chose. Mais nous n'allons pas juger. C'est le résultat qui nous intéresse.
Je pense que TheXpert nous a montré comment obtenir le résultat. Il y a déjà assez de syntaxe de 5 dans 4.
 
TheXpert:

Voyons voir...

Voici un script avec le principe, il devrait fonctionner sur 4 et 5

C'est vraiment bizarre...

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long l = 130462919691841406;
   //--- приведение типов
   double d1 = (double)l;
   long l1 = (long)d1;
   //--- преобразование типов
   double d2 = ToDouble(l);
   long l2 = ToLong(d2);
   //--- поглядим чё натворили
   Print("long-значение l = "+IntegerToString(l));
   Print("long l привели к типу double d1 = "+DoubleToString(d1,Digits));
   Print("double d1 привели к типу long l1 = "+IntegerToString(l1));
   Print("long l преобразовали в double d2 = "+DoubleToString(d2,Digits));
   Print("double d2 преобразовали в long l2 = "+IntegerToString(l2));
   ToDoubleString(l);
  }
//+------------------------------------------------------------------+
struct DoubleContainer
{
   double value;
};
//+------------------------------------------------------------------+
struct LongContainer
{
   long value;
};
//+------------------------------------------------------------------+
long ToLong(double value)
{
   DoubleContainer d; d.value = value;
   LongContainer l = (LongContainer)d;
   return l.value;
}
//+------------------------------------------------------------------+
double ToDouble(long value)
{
   LongContainer l; l.value = value;
   DoubleContainer d = (DoubleContainer)l;
   return d.value;
}
//+------------------------------------------------------------------+
double ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+IntegerToString(long_value)+", double_value = "+DoubleToString(double_value,Digits));
   return double_value;
}
//+------------------------------------------------------------------+

long, converti en double, affiche zéro. Cependant, après cela, le double zéro est normalement reconverti en long. Je ne comprends pas...


Qu'est-ce que... ? ???????????

 
artmedia70:
Et regarder dans le débogueur ? Il y a une très petite valeur non nulle ici. Il fonctionne toujours, que vous faut-il de plus ?
 
TheXpert:
Et le regarder dans le débogueur ? Il y a là une très petite valeur non nulle. Il fonctionne toujours, de quoi d'autre avez-vous besoin ?

Voir. J'envoie l'identifiant de la fenêtre (il est long) au terminal du globe (il est double). J'ai besoin d'un ensemble d'indicateurs installés sur un graphique différent, n'importe lequel (le conseiller expert les définira) pour lire la valeur ID du graphique du conseiller expert qui le contrôle et envoyer ses données à ce même graphique. Le conseiller expert traitera à son tour toutes ces données et les exploitera. Je vois zéro dans le terminal global, et je ne suis pas sûr que l'indicateur recevra l'id nécessaire du graphique désiré et y enverra ses données. Je ne vois rien. Et il ne coïncide pas avec l'identifiant du graphique, sur lequel le conseiller expert travaille. J'ai besoin d'être sûr.
Si je ne peux pas convertir les données correctement, je devrai utiliser le fichier csv. Cependant, je veux résoudre le problème de la conversion des données sans pertes. Et il n'y a pas de perte ici, mais plutôt un ajout de 2 à la valeur réelle.

J'ai essayé de convertir en chaîne - même chose - il augmente de 2 la valeur envoyée longue 130462919691841406 :

//+------------------------------------------------------------------+
void ToDoubleString(long long_value) {
   string long_value_str=IntegerToString(long_value);
   double double_value=StrToDouble(long_value_str);
   Print("long_value = "+long_value_str+", double_value = "+DoubleToString(double_value,Digits));
}
//+------------------------------------------------------------------+

résultat :

2014.07.07 00:45:08.513 LongToDouble EURUSD,H4: long_value = 130462919691841406, double_value = 130462919691841408.00000

Je ne comprends pas...

 

Ta maaa...

Vous devez mettre un double de la longue avant le transfert. Pour la variable globale. Il n'y a pas de valeur zéro, c'est juste une valeur aléatoire, elle peut être disons 1.34*e-307 peut être 4.29*e+120, parce qu'il y a des bits de long.

Après la transmission, décompressez du dub au long.

C'est tout.

 
TheXpert:

Ta maaa...

Vous devez mettre un double de la longue avant le transfert. Pour la variable globale. Ce n'est pas zéro, c'est juste un double aléatoire, ça peut être 1,34*e-307 ou 4,29*e+120, parce qu'il y a des bits logarithmiques.

Après avoir transféré unzip de dub à long.

C'est tout.

OK, vous l'avez ;)