Tem uma solução para este problema num indicador, sem carraças?
E eu já o disse antes. É estranho que se consiga obter o texto em si sem renderizar, mas não o tamanho.
O que é que as carraças têm a ver com isto? O gráfico é desenhado sem carraças.
O tamanho do rótulo de texto é descoberto a partir do contexto de exibição utilizando a função GetTextExtent da api win. O contexto de apresentação dá esta informação tendo em conta a resolução do ecrã e o tamanho da fonte seleccionada.
Quando se cria um objecto pela primeira vez, não há contexto de exibição. Poderia, em princípio, criá-lo, mas poderia facilmente entrar numa situação em que o tamanho "artificialmente" calculado seria diferente daquele que foi efectivamente calculado durante a renderização real. Assim, até que o objecto seja entregue, o seu tamanho é desconhecido.
Em geral, não se deve desenhar nada nos indicadores antes do primeiro evento no OnCalculate() - esta abordagem garantirá a criação de um gráfico e o trabalho correcto com objectos.
Aproximadamente assim - ao primeiro tique criamos, mas no próximo TAMANHO:
//+------------------------------------------------------------------+//| 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();
}
//+------------------------------------------------------------------+
Em geral, não se deve desenhar nada nos indicadores antes do primeiro evento no OnCalculate() - esta abordagem garantirá a criação de um gráfico e o trabalho correcto com objectos.
Aproximadamente - no primeiro tick que criamos, e no próximo SIZE:
Está bem. Simularei um par de carraças no fim-de-semana.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Tem uma solução para este problema num indicador, sem carraças?
E eu já o disse antes. É estranho que se consiga obter o texto em si sem renderizar, mas não o tamanho.
O que é que as carraças têm a ver com isto? O gráfico é desenhado sem carraças.
O tamanho do rótulo de texto é descoberto a partir do contexto de exibição utilizando a função GetTextExtent da api win. O contexto de apresentação dá esta informação tendo em conta a resolução do ecrã e o tamanho da fonte seleccionada.
Quando se cria um objecto pela primeira vez, não há contexto de exibição. Poderia, em princípio, criá-lo, mas poderia facilmente entrar numa situação em que o tamanho "artificialmente" calculado seria diferente daquele que foi efectivamente calculado durante a renderização real. Assim, até que o objecto seja entregue, o seu tamanho é desconhecido.
Tente usar ChartRedraw() após a criação, depois verifique o tamanho.
Não funciona.
Em geral, não se deve desenhar nada nos indicadores antes do primeiro evento no OnCalculate() - esta abordagem garantirá a criação de um gráfico e o trabalho correcto com objectos.
Aproximadamente assim - ao primeiro tique criamos, mas no próximo TAMANHO:
Em geral, não se deve desenhar nada nos indicadores antes do primeiro evento no OnCalculate() - esta abordagem garantirá a criação de um gráfico e o trabalho correcto com objectos.
Aproximadamente - no primeiro tick que criamos, e no próximo SIZE:
Está bem. (risos) Vou simular algumas carraças no fim-de-semana.
Existe alguma função que retorne se o objecto é ou não entregue?
e WindowRedraw não ajudaria a não esperar por uma carraça?