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

 
-Aleks-:

Aidez-moi, je ne comprends pas pourquoi j'obtiens zéro lors du calcul du tableau VesMass pour les valeurs i>0 ?

Il s'avère que je ne devrais pas écrire 4 et 5, mais 4.0 et 5.0 - quelle est la logique - ce n'est pas clair pour moi...
 
-Aleks-:

Il s'avère que vous ne devez pas écrire 4 et 5, mais 4.0 et 5.0 - quelle est la logique - ce n'est pas clair pour moi...
Lisez la documentation et tout deviendra clair. C'est bien que vous l'ayez fait vous-même.
 
Alexey Viktorov:
Lisez la documentation et tout deviendra clair. C'est bien que vous l'ayez fait vous-même.

J'ai lu quelque chose comme ça avant - alors j'ai décidé de l'essayer, mais je ne vois pas très bien où est la logique derrière tout ça... et je n'ai pas trouvé la réponse dans la documentation, d'ailleurs.
 
-Aleks-:

J'ai lu quelque chose comme ça avant - alors j'ai décidé de l'essayer, mais je ne vois pas bien où est la logique derrière tout ça... Et je n'ai pas trouvé la réponse dans la documentation, d'ailleurs.


Il s'agit d'une particularité non seulement dans MCL, mais aussi dans C++ et d'autres langages de programmation - la division de deux entiers ou variables de type (int) donnera un résultat tronqué en entier. Dans votre cas, 4/5=0.

Vous pouvez écrire 4.0/5 ou (double)4/5 - le résultat est alors un nombre réel.
 
Vitalie Postolache:


Ce n'est pas seulement une caractéristique d'ICL, en C++ et dans d'autres langages de programmation c'est la même chose - diviser deux entiers ou variables de type (int) donnera un résultat tronqué à un entier. Dans votre cas, 4/5=0.

Vous pouvez écrire 4.0/5 ou (double)4/5 - le résultat est alors un nombre réel.

Je comprends cela, mais je ne comprends pas la logique de la solution - c'est-à-dire le besoin.

 
-Aleks-:

Je comprends cela, mais je ne comprends pas la logique derrière la solution - c'est-à-dire le besoin.


Vous ne vous demandez pas "pourquoi 2*2=4 en arithmétique, quelle est la logique de la solution" ? Tu le prends juste comme un axiome et tu l'utilises. C'est comme ça que ça se passe avec la division de deux nombres entiers.
 
Vitalie Postolache:

Vous ne vous demandez pas "pourquoi 2*2=4 en arithmétique, quelle est la logique derrière la solution" ? Tu le prends juste comme un axiome et tu l'utilises. C'est la même chose avec la division de deux entiers.

Je vais vérifier avec l'addition...

 


Kot:


La ligne est une ligne de tendance. J'ai changé ses propriétés en rayon. Cela n'a pas aidé. Si je voulais qu'il affiche le prix indépendamment de la position de la barre zéro (au-dessus, au-dessous).

Ce code ne fonctionne pas non plus.

int start() {

double pr=ObjectGetValueByShift("line",0) ;

Si (Bid==pr){

Alerte (pr);}

return(0);}


Le nom de la ligne est-il correctement orthographié ?

Essayez ce script, et montrez ce qu'il dit dans les logs.

void OnStart()
  {
     double pr;
     int obj_total=ObjectsTotal(); 
     string name;
     int i; 
     
   for(i=0;i<obj_total;i++) 
     { 
      name=ObjectName(i); 
      if(ObjectType(name)!=OBJ_TREND) continue; 
      PrintFormat("Объект %d:     Имя объекта - %s",i,name); 
      pr=ObjectGetValueByShift(name,0);
      PrintFormat("Объект %d:     Цена - %.5f",i,pr);
      
     }  

}

Le script détecte l'objet, écrit le nom correctement. Mais le prix est absolument à gauche. Il est marqué sur la photo par une ligne horizontale. Il donne ces prix, que les barres aient franchi ou non la ligne.

Dossiers :
23.png  62 kb
 
Kot:


La ligne est en tendance. J'ai changé les propriétés en faisceau. Cela n'a pas aidé. Idéalement, le prix doit être affiché quelle que soit la position de la barre de zéro (haut, bas).

Ce code ne fonctionne pas non plus.

int start() {

double pr=ObjectGetValueByShift("line",0) ;

Si (Bid==pr){

Alerte (pr);}

return(0);}

L'enchère peut facilement sauter votre ligne, elle n'est pas obligée de s'arrêter à chaque point (c'est-à-dire que vous n'obtiendrez pas l'égalité exacte).

changez la condition par exemple si ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) || (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) ou similaire...

 
Maxim Kuznetsov:

L'enchère peut facilement sauter votre ligne, elle n'est pas obligée de s'arrêter à chaque point (c'est-à-dire que l'égalité exacte ne se produira pas).

changer la condition par exemple si ((MathMin(Close[1],Open[0])<=pr && Bid>=pr) || (MathMax(Close[1],Open[0])>=pr && Bid<=pr)) ou similaire...


Merci ! J'ai compris l'idée.

Et si la situation était différente. Il y a des lignes horizontales avec des noms différents sur le graphique. Vous avez besoin du script pour calculer quelle ligne correspond à quel prix.