Errori, bug, domande - pagina 1456

 
Vasyl Nosal:

Avete una soluzione a questo problema in un indicatore, senza tick?

E l'ho già detto prima. È strano che si possa ottenere il testo stesso senza rendering ma non la dimensione.

Cosa c'entrano le zecche? Il grafico è disegnato senza tick.

La dimensione dell'etichetta di testo è rilevata dal contesto di visualizzazione utilizzando la funzione GetTextExtent di win api. Il contesto di visualizzazione dà queste informazioni tenendo conto della risoluzione dello schermo e della dimensione del carattere selezionato.

Quando si crea un oggetto per la prima volta, non c'è un contesto di visualizzazione. Si potrebbe, in linea di principio, crearlo, ma ci si potrebbe facilmente trovare in una situazione in cui la dimensione calcolata "artificialmente" sarà diversa da quella che è stata effettivamente calcolata durante il rendering effettivo. Quindi, finché l'oggetto non viene renderizzato, la sua dimensione è sconosciuta.

 
Vasyl Nosal:
Prova a usare ChartRedraw() dopo la creazione, poi controlla la dimensione.
 
Alexey Kozitsyn:
Prova a usare ChartRedraw() dopo la creazione, poi controlla la dimensione.
Non funziona.
 
Vasyl Nosal:
Non funziona.

In generale, non dovreste disegnare nulla negli indicatori prima del primo evento in OnCalculate() - questo approccio garantirà la creazione di un grafico e il corretto lavoro con gli oggetti.

Approssimativamente così - al primo segno di spunta creiamo, ma il prossimo 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:

In generale, non dovreste disegnare nulla negli indicatori prima del primo evento in OnCalculate() - questo approccio garantirà la creazione di un grafico e il corretto lavoro con gli oggetti.

All'incirca così - al primo segno di spunta creiamo, e al successivo SIZE:

Ok. Simulerò un paio di zecche nel fine settimana.
 
C'è una funzione che restituisca se l'oggetto è disegnato?
 
Vasyl Nosal:
Ok. Simulerò alcuni tic nel fine settimana.
Spegni il Wi-Fi e avrai un sabato :).
 
Vasyl Nosal:
C'è una funzione che restituisce se l'oggetto è reso?
Chiedi la dimensione del marcatore di testo
 
WindowRedraw non aiuterebbe a non aspettare un tick?
 
Alexandr Bryzgalov:
e WindowRedraw non aiuterebbe a non aspettare un tick?
No.