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.
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_windowstring name="probe";
bool first_tick=false; // false - ещё не было тиков//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mapping//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---staticint 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 callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Deinit |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ObjectDelete(name);
EventKillTimer();
}
//+------------------------------------------------------------------+
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.
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.
Versuchen Sie, ChartRedraw() nach der Erstellung zu verwenden, und überprüfen Sie dann die Größe.
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:
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:
Okay. (gluckst) Ich werde am Wochenende ein paar Ticks simulieren.
Gibt es eine Funktion, die zurückgeben würde, ob das Objekt gerendert wird?
und WindowRedraw nicht helfen würde, nicht auf ein Häkchen zu warten?