Errores, fallos, preguntas - página 1456

 
Vasyl Nosal:

¿Tienes una solución para este problema en un indicador, sin ticks?

Y ya lo he dicho antes. Es extraño que se pueda obtener el texto en sí sin renderizar pero no el tamaño.

¿Qué tienen que ver las garrapatas? El gráfico se dibuja sin ticks.

El tamaño de la etiqueta de texto se averigua a partir del contexto de visualización utilizando la función GetTextExtent de win api. El contexto de la pantalla ofrece esta información teniendo en cuenta la resolución de la pantalla y el tamaño de la fuente seleccionada.

Cuando se crea un objeto por primera vez, no hay contexto de visualización. En principio, se podría crear, pero se podría llegar fácilmente a una situación en la que el tamaño calculado "artificialmente" será diferente del que se calculó realmente durante el renderizado real. Por lo tanto, hasta que el objeto se renderiza, su tamaño es desconocido.

 
Vasyl Nosal:
Pruebe a utilizar ChartRedraw() después de la creación, y luego compruebe el tamaño.
 
Alexey Kozitsyn:
Pruebe a utilizar ChartRedraw() después de la creación, y luego compruebe el tamaño.
No funciona.
 
Vasyl Nosal:
No funciona.

En general, no se debe dibujar nada en los indicadores antes del primer evento de OnCalculate() - este enfoque garantizará la creación de un gráfico y el correcto trabajo con los objetos.

Aproximadamente así - en la primera garrapata que creamos, pero el siguiente 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:

En general, no se debe dibujar nada en los indicadores antes del primer evento de OnCalculate() - este enfoque garantizará la creación de un gráfico y el correcto trabajo con los objetos.

Aproximadamente así - en el primer tic creamos, y en el siguiente SIZE:

De acuerdo. Simularé un par de garrapatas el fin de semana.
 
¿Existe una función que devuelva si el objeto está dibujado?
 
Vasyl Nosal:
De acuerdo. Simularé unos cuantos ticks el fin de semana.
Apaga el Wi-Fi y tendrás un sábado :).
 
Vasyl Nosal:
¿Existe una función que devuelva si el objeto está renderizado?
Pregunte por el tamaño del marcador de texto
 
¿no ayudaría WindowRedraw a no esperar un tic?
 
Alexandr Bryzgalov:
y WindowRedraw no ayudaría a no esperar un tic?
No.