Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 561

 
Ihor Herasko:

Simple :

donne une erreur

 
Aleksandr Lishchenko:

message d'erreur

Où se trouve l'erreur ? Quel genre d'erreur ?

 

Bonjour. J'ai pour tâche de vérifier l'exactitude du paramètre d'entrée du volume de négociation spécifié par l'utilisateur, à savoir que le lot spécifié doit être un multiple de l'étape de changement de lot. Pour ce faire, trouvez un reste réel de la division et comparez-le à un zéro ou à une valeur très proche de zéro (par exemple, 0,000000001)

void OnStart()
{
   double volume = 0.03;
   Alert("Результат деления ", volume/MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Шаг изменения лота ", MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Вешественный остаток ", fmod(volume, MarketInfo(Symbol(), MODE_LOTSTEP)));
}

Résultat :

/*
   Вещественный остаток 0,009999999999999998
   Шаг изменения лота 0,01
   Результат деления 3,0
*/

J'ai également joint une capture d'écran.

Je pense que le reste devrait être zéro ou un très petit nombre, mais le résultat est presque 0.01 pour une raison quelconque ? Comment puis-je alors vérifier le paramètre d'entrée si, par exemple, l'utilisateur définit 0.001 par erreur ?

Dossiers :
4npm6qh.png  8 kb
 
Aleksandr Teleguz:

Bonjour. J'ai pour tâche de vérifier l'exactitude du paramètre d'entrée du volume de négociation spécifié par l'utilisateur, à savoir que le lot spécifié doit être un multiple de l'étape de changement de lot. Pour ce faire, j'obtiens le reste réel de la division et je le compare à un zéro ou à une valeur très proche de zéro (par exemple, 0.000000001)

Résultat :

J'ai également joint une capture d'écran.

Je pense que le reste devrait être zéro ou un très petit nombre, mais le résultat est presque 0.01 pour une raison quelconque ? Comment puis-je alors vérifier le paramètre d'entrée si, par exemple, l'utilisateur définit 0.001 par erreur ?

C'est un peu faux. La première chose à faire est de calculer la valeur correcte la plus proche (sur la base de la valeur fixée), puis de vérifier la différence entre les valeurs obtenues. S'il est égal à zéro (ou pas plus que DBL_EPSILON), alors tout est OK :

void OnStart()
{
   double volume = 0.03;

   double fVolumeMin = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);   
   double fVolumeMax = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);   
   double fVolumeStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); 

   double fNearestCorrectVolume = VolumeCast(volume, fVolumeMin, fVolumeMax, fVolumeStep);
   if (fabs(fNearestCorrectVolume - volume) > DBL_EPSILON)
      Alert("Ошибка");
   else
      Alert("Все ОК");
}

La fonction VolumeCast peut être prise ici.

 
Ihor Herasko:

Où cela se passe-t-il mal ? Quel type d'erreur donne-t-il ?

1 erreur(s), 0 avertissement(s) 2 1
si" - les expressions ne sont pas autorisées sur un global

 

Bonjour ! !!

Les gars, pouvez-vous me dire le code sur la façon de lier un EA à un compte (pour la dernière mise à jour MT4).

Merci beaucoup.

 
Aleksandr Lishchenko:

Bonjour !

Les gars, pouvez-vous me dire le code sur la façon de lier un EA à un compte (pour la dernière mise à jour MT4).

Merci beaucoup.

On vous a déjà donné le code.

Vous avez commis l'erreur vous-même - il est écrit dans la description de l'erreur que vous avez entré le code dans la zone des variables globales et non dans OnTick() ou OnInit() :

'if' - expressions are not allowed on a global scope

Et avec une telle connaissance, vous essayez toujours de protéger votre code de quelqu'un d'autre ?
 
Artyom Trishkin:

Le code vous a déjà été communiqué.

Vous avez commis l'erreur vous-même - il vous est écrit dans la description de l'erreur que vous avez entré du code dans la zone des variables globales, et non à l'intérieur de OnTick() ou OnInit() :

'if' - expressions are not allowed on a global scope

Et avec cette connaissance, vous essayez toujours de protéger votre code de quelqu'un d'autre ?

Je suis en train d'apprendre !

Ne jugez pas ! ;)

 
Aleksandr Lishchenko:

1 erreur(s), 0 avertissement(s) 2 1
si" - les expressions ne sont pas autorisées sur un global

Montre-moi comment tu as appliqué le code. Tu as copié ce que j'ai écrit ?

 
Ihor Herasko:

Montre-moi comment tu as appliqué le code. Tu as copié ce que j'ai écrit ?

Je l'ai fait :)))