Fehler, Irrtümer, Fragen - Seite 1456

 
Vasyl Nosal:

Haben Sie eine Lösung für dieses Problem in einem Indikator, ohne Ticks?

Und ich habe es schon einmal gesagt. Es ist seltsam, dass Sie den Text selbst ohne Rendering erhalten können, aber nicht die Größe.

Was haben Zecken damit zu tun? Das Diagramm wird ohne Ticks gezeichnet.

Die Größe der Textbeschriftung wird mit Hilfe der Win-Api-Funktion GetTextExtent aus dem Anzeigekontext ermittelt. Der Anzeigekontext liefert diese Informationen unter Berücksichtigung der Bildschirmauflösung und der gewählten Schriftgröße.

Wenn Sie ein Objekt zum ersten Mal anlegen, gibt es noch keinen Anzeigekontext. Man könnte sie im Prinzip erstellen, aber man könnte leicht in eine Situation geraten, in der die "künstlich" berechnete Größe von derjenigen abweicht, die beim tatsächlichen Rendering berechnet wurde. Solange das Objekt also nicht gerendert ist, ist seine Größe unbekannt.

 
Vasyl Nosal:
Versuchen Sie, ChartRedraw() nach der Erstellung zu verwenden, und überprüfen Sie dann die Größe.
 
Alexey Kozitsyn:
Versuchen Sie, ChartRedraw() nach der Erstellung zu verwenden, und überprüfen Sie dann die Größe.
Funktioniert nicht.
 
Vasyl Nosal:
Funktioniert nicht.

Im Allgemeinen sollten Sie vor dem ersten Ereignis in OnCalculate() nichts in den Indikatoren zeichnen - dieser Ansatz garantiert die Erstellung eines Diagramms und die korrekte Arbeit mit Objekten.

Ungefähr so - beim ersten Ticken schaffen wir, aber beim nächsten SIZE:

//+------------------------------------------------------------------+
//|                                               TestIndicator1.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
string name="probe";
bool first_tick=false; // false - ещё не было тиков
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static int count;
   if(count>3)
      return(rates_total); // после трёх Алертов выходим. Не за чем слух портить.
   if(!first_tick)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetString(0,name,OBJPROP_TEXT,name);
      first_tick=true;
     }
   else
     {
      string text=ObjectGetString(0,name,OBJPROP_TEXT);
      int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
      Alert(text," ",text_sizeX);
     }
   count++;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit                                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(name);
   EventKillTimer();
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Im Allgemeinen sollten Sie vor dem ersten Ereignis in OnCalculate() nichts in den Indikatoren zeichnen - dieser Ansatz garantiert die Erstellung eines Diagramms und die korrekte Arbeit mit Objekten.

Ungefähr so - beim ersten Häkchen erstellen wir, beim nächsten Häkchen belassen wir es dabei:

Ja. Ich werde am Wochenende ein paar Ticks simulieren.
 
Gibt es eine Funktion, die zurückgeben würde, ob das Objekt gezeichnet ist?
 
Vasyl Nosal:
Okay. (gluckst) Ich werde am Wochenende ein paar Ticks simulieren.
Schalten Sie das Wi-Fi aus, und Sie werden einen Samstag haben :).
 
Vasyl Nosal:
Gibt es eine Funktion, die zurückgeben würde, ob das Objekt gerendert wird?
Fragen Sie nach der Größe der Textmarkierung
 
Würde WindowRedraw nicht helfen, nicht auf ein Häkchen zu warten?
 
Alexandr Bryzgalov:
und WindowRedraw nicht helfen würde, nicht auf ein Häkchen zu warten?
Nein.
Grund der Beschwerde: