Questions des débutants MQL4 MT4 MetaTrader 4 - page 217

 
alex_xss:

Mmm, peut-être.

Tu es le premier qui ne l'a pas encore eu))

Mais cela n'a pas d'importance, peut surgir chez n'importe qui - donc vous devez le réparer, malheureusement.

J'en ai beaucoup, cela dépend de la version de MT4 (j'en ai une d'Alpari).

J'en ai beaucoup de versions différentes, je programme pour eux :-) mais le logiciel est toujours le même, ils ne diffèrent que par de petites marques et de petits éléments dans les indicateurs/conseillers.

Les problèmes de couleurs peuvent provenir d'un mauvais réglage DPI du moniteur, de la présence d'utilitaires de correction de la température des couleurs ou d'extensions de jeux de cartes vidéo. Et ainsi de suite.

PPS/au fait, aucun DC n'a surmonté (plus probablement par cupidité, argent) ses propres indicateurs/conseillers/scripts/outils. Tout au plus un tableau de bord aux couleurs de l'entreprise. Ce qui laisse entendre que

 

Bonjour !
Pouvez-vous me dire pourquoi OBJPROP_XSIZE donne 0 ?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string mnth=(string)TimeMonth(TimeCurrent())+".";
   string dy=(string)TimeDay(TimeCurrent())+" ";
   string hr=(string)TimeHour(TimeCurrent())+":00 ";

   string TimeSig1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   string Label1=" TEST "+Symbol()+"   "+TimeSig1+" Test:  "+mnth+dy+hr+" 1 2 3 4 5 6 7 8 9 10 11";
//string Label1="123456789"+"1"+"123456789"+"2"+"123456789"+"3"+"123456789"+"4"+"123456789"+" 5 "+"123456789";
   obj_create("Sym",Label1,50,clrWhite,15);

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void obj_create(string name,string object,int Y_distance,color Color,int size)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
      ObjectSetString(0,name,OBJPROP_FONT,"Rockwell");
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y_distance);
      ObjectSetInteger(0,name,OBJPROP_COLOR,Color);
     }
   ObjectSetString(0,name,OBJPROP_TEXT,object);

//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
   
Print(" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj_create  text_sizeX: ",text_sizeX);   
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Bonjour !
Pouvez-vous me dire pourquoi OBJPROP_XSIZE donne 0 ?

OBJ_LABEL est un objet très spécifique - après le placement et avant la première mise à jour du graphique, la largeur (X_SIZE) n'est pas définie.

Cela dépend de la police et de la résolution de l'écran. Tant que les fonctions de rendu ne sont pas totalement activées, il n'est pas possible de se prononcer sur la largeur réelle.

 
Maxim Kuznetsov:

OBJ_LABEL est un objet très spécifique - après le placement et avant la première mise à jour du graphique, la largeur (X_SIZE) est indéfinie.

Cela dépend de la police, de la résolution de l'écran en général. Tant que le rendu ne fonctionne pas complètement, nous ne pouvons rien dire sur la largeur réelle.

Essayez de le redessiner et vérifiez ensuite

   ObjectSetString(0,name,OBJPROP_TEXT,object);
   ChartRedraw();
//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
 
Vitaly Muzichenko:

Essayez de redessiner et vérifiez ensuite

Merci, je vais essayer !

Ça n'a pas marché.
 
Maxim Kuznetsov:

OBJ_LABEL est un objet très spécifique - après le placement et avant la première mise à jour du graphique, la largeur (X_SIZE) est indéfinie.

Cela dépend de la police, du dpi de l'écran en général. Tant que les fonctions de rendu ne fonctionnent pas complètement, je ne peux rien dire sur la largeur réelle.


Merci, l'idée est claire, je vais expérimenter quelque chose.

 
Nauris Zukas:


Merci, je comprends l'idée, je vais l'expérimenter.

ChartRedraw ne redessine pas directement, il met juste un tick quelque part dans les profondeurs du terminal "le graphique doit être redessiné dès que possible".

Pour savoir quelle largeur la marque de texte (devrait) avoir, vous pouvez essayer TextSetFont, TextGetSize - une différence significative peut seulement apparaître à HiDPI. Ou peut-être pas :-) Je n'ai pas essayé.

ou obtenir la largeur de l'OBJ_LABEL réel dès le prochain tick/événement graphique, c'est-à-dire exactement après le repeint.

 
Maxim Kuznetsov:

ChartRedraw ne redessine pas directement, il met juste un tick quelque part dans les profondeurs du terminal "le graphique doit être redessiné à la première occasion".

Pour savoir quelle largeur une marque de texte (devrait) avoir, vous pouvez essayer TextSetFont, TextGetSize - une différence significative peut seulement apparaître à HiDPI. Ou peut-être pas :-) Je n'ai pas essayé.

ou obtenir la largeur du OBJ_LABEL réel dès le prochain tick/événement graphique, c'est-à-dire exactement après le rechargement.

Je l'ai déjà fait fonctionner, merci ! Ajouté OnDeinit(), mis un délai à cet endroit, et ensuite OBJPROP_XSIZE.
P.S. Je n'ai rien trouvé de mieux à faire avec le retard du scénario :

for(int i=100000000; i>0; i--) {} 
 
Nauris Zukas:

Merci, tout s'est arrangé ! J'ai ajouté OnDeinit(), j'y ai mis un délai, puis OBJPROP_XSIZE.
P.S. Je n'ai rien trouvé de mieux à faire avec le retard du scénario :

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

 
Maxim Kuznetsov:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

Merci, ça a marché !

   do{}
   while(GetTickCount()-Time11<1000);
Raison: