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

 

Bonjour !

Pouvez-vous me dire si la compilation du code peut être définie dans le code lui-même ? Merci.

 

J'affiche les paramètres de la souris et l'étiquette de prix à 4 chiffres dans les commentaires lorsque la roue est cliquée.

Lorsque la molette est pressée, le marqueur passe derrière le curseur, mais je n'arrive pas à faire en sorte que la même chose se produise lorsque la molette est relâchée avant que la souris soit pressée sur le LK.

Aidez-moi à résoudre ce problème.


//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- включение сообщений о перемещении мыши по окну чарта 
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий 
   ChartRedraw(); 
  } 
//+------------------------------------------------------------------+ 
//| MouseState                                                       | 
//+------------------------------------------------------------------+ 

string xlabel="Bid";
input color xcolor = clrCrimson;

string MouseState(uint state) 
  { 
   string res; 
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left 
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right  
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle 
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key 
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key 
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key 
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key 
   res+="\nBID" + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits-1);
   return(res); 
  }
   
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 
  
int x=(int)lparam; 
int y=(int)dparam; 
datetime dt    =0; 
double   price =0;
int      window=0;

   if(id==CHARTEVENT_MOUSE_MOVE) 
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); 

   if(sparam =="16")
      {
         
      if(!ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0));
      //ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0);
      ObjectSetInteger(0, xlabel, OBJPROP_XDISTANCE, 100);
           ObjectSetInteger(0, xlabel, OBJPROP_YDISTANCE, dparam+7);
      ChartXYToTimePrice(0,x,y,window,dt,price);
      ObjectSetString(0, xlabel, OBJPROP_TEXT, DoubleToString(price, _Digits-1));
      }
      
      
  /*  while(sparam !="1")
      {
         ObjectMove(0,xlabel,0,lparam,dparam+7);      
      }
  */
  }
  
void OnDeinit(const int reason) 
   { 
      Comment("");
      ObjectDelete(0,xlabel);
   } 
 
psyman:

J'affiche les paramètres de la souris et l'étiquette de prix à 4 chiffres dans les commentaires lorsque la roue est cliquée.

Tant que la molette est pressée, le marqueur passe derrière le curseur, mais je n'arrive pas à faire en sorte que la même chose se produise lorsque la molette est relâchée avant que la souris soit pressée sur le LK.

supprimer (commenté)
// if(sparam =="16")

 
Taras Slobodyanik:

supprimer (commenté)
// if(sparam =="16")


Le marqueur est alors tout le temps à l'écran, alors que vous voulez qu'il n'apparaisse que lorsque vous appuyez sur la roue.



PS

Votre réponse m'a donné la bonne idée, merci :-)

 
psyman:

J'affiche les paramètres de la souris et l'étiquette de prix à 4 chiffres dans les commentaires lorsque la roue est cliquée.

Lorsque la molette est pressée, le marqueur passe derrière le curseur, mais je n'arrive pas à faire en sorte que la même chose se produise lorsque la molette est relâchée avant que la souris soit pressée sur le LK.

Aidez-moi à résoudre ce problème.


if(label)
{
   //применение изменяющихся параметров(перемещение и прочее)
}
if(sparam =="16")
{
   label = true;
   //создание метки и настройка неизменяющихся параметров метки
}
if(sparam =="1") // или какой там символ у ЛК мыши
{
   label = false;
   //удаление/скрытие метки, если нужно
}

le label est de type bool

 
Ilya Prozumentov:

L ' étiquette est de type bool

Puis-je le déplacer avant de créer l'étiquette ?


Maintenant j'ai une autre question : je veux placer une étiquette à droite de l'écran, ceci est calculé dans OnCalculate

int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

Il s'avère qu'il se trouve à l'extrême gauche, alors que le même calcul dans OnChartEvent pour un autre marqueur donne un résultat correct.

Pourquoi cela provoque-t-il une inversion du compte à rebours ?

 
psyman:

Le déménagement peut-il être effectué avant la création du marqueur ?


Maintenant, j'ai une autre question : je veux déplacer un marqueur vers le côté droit de l'écran, ceci est calculé dans OnCalculate

Mais le même calcul dans OnChartEvent pour un autre marqueur donne un résultat correct.

Pourquoi l'inversion du compte à rebours se produit-elle ?

L'étiquette est initialement fixée à false, donc le fragment de code avec le marqueur mobile ne sera pas exécuté. Mais même s'il est exécuté avant que l'étiquette ne soit créée, rien ne se passera, le programme continuera à s'exécuter et l'étiquette qui sera créée plus tard ne sera pas affectée.

Faites attention au point d'ancrage, des points d'ancrage différents donneront des résultats différents. Vous pouvez immédiatement essayer d'écrire 0 à la place de width et si cela se comporte comme il se doit, cela signifie que c'était une question de points d'ancrage.

OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике объект "Текстовая метка". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Создает текстовую метку                                          |...
 
Ilya Prozumentov:

L'étiquette est initialement définie comme fausse, donc le morceau de code pour déplacer l'étiquette ne sera pas exécuté. Mais même s'il est exécuté avant la création de l'étiquette, rien ne se passera, le programme continuera à s'exécuter et l'étiquette créée ensuite ne sera pas affectée.

Faites attention au point d'ancrage, des points d'ancrage différents donneront des résultats différents. Vous pouvez immédiatement essayer d'écrire 0 à la place de width et si cela se comporte comme prévu, cela signifie que le problème se situait au niveau des points d'ancrage.

Je n'ai pas de points d'ancrage, je ne me déplace que verticalement, et je fixe l'horizon une fois, sur toute la largeur de l'écran. Ce n'est pas un problème de compter de l'autre côté, mais il est surprenant que la même action soit effectuée différemment selon les fonctions.


Et une autre question - si Bid est affiché comme texte d'étiquette, quelle fonction dois-je utiliser pour le faire de manière optimale -OnChartEvent ouOnCalculate ?

 
novichok2018:

Bonjour !

Pouvez-vous me dire si la compilation du code peut être définie dans le code lui-même ? Merci.

C'est peut-être une question stupide puisque personne ne répond, mais comment faire autrement pour que l'EA s'arrête et reprenne après la compilation ?

La plateforme donne le message :array out of range (284,17).

ligne 284 : NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ; laposition 17 ouvre un crochet avec NomNews, qui est globalement initié par 0.

J'ai changé 0 en 1 sans résultat.
J'ai modifié laligne if(NomNews==300)break ; 300 en 360000, en vain.

Je le compile - il fonctionne bien pendant quelques minutes. Et que faire ?

 
novichok2018:

C'est peut-être une question stupide, puisque personne ne répond, mais comment faire autrement pour que l'EA s'arrête et reprenne après la compilation ?

La plateforme donne le message :array out of range (284,17).

Ligne 284 : NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ; laposition 17 ouvre un crochet avec NomNews, qui est globalement initié par 0.

J'ai changé 0 en 1 sans résultat.
J'ai modifié laligne if(NomNews==300)break ; 300 en 360000, en vain.

Je le compile - il fonctionne bien pendant quelques minutes. Et que faire ?

Quelle est la dimensionnalité du tableau NewsArr dans la deuxième dimension ?
Raison: