Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 217

 
alex_xss:

Hm, vielleicht.

Du bist der erste, der es noch nicht hatte))

Aber das macht nichts, es kann bei jedem auftauchen - also muss man es leider beheben.

Ich habe viele davon, es hängt von der Version von MT4 ab (ich habe eine von Alpari).

Ich habe viele von ihnen in verschiedenen Versionen, ich programmiere für sie :-), aber die Software ist immer noch die gleiche, sie unterscheiden sich nur durch ein kleines Branding und kleine Chips in Indikatoren/Beratern.

PS/Farbtricks können von einer falschen DPI-Einstellung des Monitors, dem Vorhandensein von Dienstprogrammen zur Korrektur der Farbtemperatur oder von Erweiterungen für Videokartenspiele herrühren. Und so weiter und so fort.

PPS / übrigens keine DC überwunden hat (eher aufgrund von Gier, Geld) eigene Indikatoren / Berater / Skripte / Tools-Paket. Höchstens ein kitschiges Armaturenbrett in Firmenfarben. Was eine Art Hinweis ist auf

 

Hallo!
Können Sie mir sagen, warum OBJPROP_XSIZE 0 ergibt?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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:

Hallo!
Können Sie mir sagen, warum OBJPROP_XSIZE 0 ergibt?

OBJ_LABEL ist ein sehr spezifisches Objekt - nach der Platzierung und vor der ersten Aktualisierung des Diagramms ist die Breite (X_SIZE) nicht definiert.

Das hängt von der Schriftart und den dpi des Bildschirms ab. Bis das Rendering vollständig funktioniert, können wir nichts über die tatsächliche Breite sagen.

 
Maxim Kuznetsov:

OBJ_LABEL ist ein sehr spezifisches Objekt - nach der Platzierung und vor der ersten Aktualisierung des Diagramms ist die Breite (X_SIZE) undefiniert.

Das hängt von der Schriftart und den dpi des Bildschirms im Allgemeinen ab. Bis das Rendering vollständig funktioniert, können wir nichts über die tatsächliche Breite sagen.

Versuchen Sie, es neu zu zeichnen und überprüfen Sie dann

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

Versuchen Sie eine Neuzeichnung und prüfen Sie anschließend

Danke, ich werde es ausprobieren!

Es hat nicht geklappt.
 
Maxim Kuznetsov:

OBJ_LABEL ist ein sehr spezifisches Objekt - nach der Platzierung und vor der ersten Aktualisierung des Diagramms ist die Breite (X_SIZE) undefiniert.

Das hängt von der Schriftart und den dpi des Bildschirms im Allgemeinen ab. Bis die Rendering-Funktionen vollständig funktionieren, kann ich nichts über die tatsächliche Breite sagen.


Danke, die Idee ist klar, ich werde mit etwas experimentieren.

 
Nauris Zukas:


Danke, ich verstehe die Idee, ich werde damit experimentieren.

ChartRedraw zeichnet nicht direkt neu, sondern setzt nur irgendwo in den Tiefen des Terminals ein Häkchen, das besagt, dass das Diagramm so bald wie möglich neu gezeichnet werden sollte.

Um herauszufinden, welche Breite die Textmarke bekommen (sollte), können Sie TextSetFont, TextGetSize ausprobieren - ein signifikanter Unterschied kann nur bei HiDPI auftreten. Oder vielleicht auch nicht :-) Ich habe es nicht ausprobiert

oder die Breite des realen OBJ_LABEL bereits beim nächsten Tick/Chart_Event, d.h. genau nach dem Repaint

 
Maxim Kuznetsov:

ChartRedraw zeichnet nicht direkt neu, sondern setzt nur irgendwo in den Tiefen des Terminals ein Häkchen, das besagt, dass das Diagramm so bald wie möglich neu gezeichnet werden sollte.

Um herauszufinden, welche Breite eine Textmarke bekommen (sollte), können Sie TextSetFont, TextGetSize ausprobieren - ein signifikanter Unterschied kann nur bei HiDPI auftreten. Oder vielleicht auch nicht :-) Ich habe es nicht ausprobiert

oder die Breite des realen OBJ_LABEL bereits beim nächsten Tick/Chart_Event, d.h. genau nach dem Neuladen

Es funktioniert bereits, danke! OnDeinit() hinzugefügt, dort eine Verzögerung eingefügt und dann OBJPROP_XSIZE.
P.S. Mir ist nichts Besseres eingefallen, um die Verzögerung im Drehbuch zu nutzen:

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

Danke, es hat alles geklappt! Ich fügte OnDeinit() hinzu, setzte dort eine Verzögerung und dann OBJPROP_XSIZE.
P.S. Mir ist nichts Besseres eingefallen, um die Verzögerung im Drehbuch zu nutzen:

// задержка 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);

Danke, es hat funktioniert!

   do{}
   while(GetTickCount()-Time11<1000);
Grund der Beschwerde: