Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 217

 
alex_xss:

Mmm, talvez.

Você é o primeiro que ainda não o teve))

Mas isso não importa, pode aparecer em qualquer pessoa - então você tem que consertar isso, infelizmente.

Tenho muitos deles, depende da versão do MT4 (eu tenho um da Alpari).

Tenho muitos deles de versões diferentes, estou programando para eles :-) mas o software continua o mesmo, eles diferem apenas em pequenas marcas e pequenos chips em indicadores/conselheiros.

Os truques de PS/ cor podem ser causados por ajuste errado do DPI do monitor, presença de "utilitários de correção de temperatura de cor", "extensões de jogos de vídeo". E assim por diante.

PPS/ pela maneira como nenhum DC superou (mais provavelmente devido à ganância, dinheiro) os próprios indicadores/conselheiros/convistas/totalão de ferramentas. No máximo um painel de controle com cores corporativas. Que tipo de dicas em

 

Olá!
Você pode me dizer por que OBJPROP_XSIZE dá 0?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string mnth=(string)TimeMonth(TimeCurrent())+".";
   string dy=(string)TimeDay(TimeCurrent())+" ";
   string hr=(string)TimeHour(TimeCurrent())+":00 ";

   string TimeSig1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   string Label1=" TEST "+Symbol()+"   "+TimeSig1+" Test:  "+mnth+dy+hr+" 1 2 3 4 5 6 7 8 9 10 11";
//string Label1="123456789"+"1"+"123456789"+"2"+"123456789"+"3"+"123456789"+"4"+"123456789"+" 5 "+"123456789";
   obj_create("Sym",Label1,50,clrWhite,15);

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void obj_create(string name,string object,int Y_distance,color Color,int size)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
      ObjectSetString(0,name,OBJPROP_FONT,"Rockwell");
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y_distance);
      ObjectSetInteger(0,name,OBJPROP_COLOR,Color);
     }
   ObjectSetString(0,name,OBJPROP_TEXT,object);

//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
   
Print(" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj_create  text_sizeX: ",text_sizeX);   
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Olá!
Você pode me dizer por que OBJPROP_XSIZE dá 0?

OBJ_LABEL é um objeto muito específico - após a colocação e antes da primeira atualização do gráfico, a largura (X_SIZE) não é definida.

Depende da fonte, dpi da tela. Até que as funções de renderização estejam totalmente habilitadas, não é possível dizer nada sobre a largura real.

 
Maxim Kuznetsov:

OBJ_LABEL é um objeto muito específico - após a colocação e antes da primeira atualização do gráfico, a largura (X_SIZE) é indefinida.

Depende da fonte, dpi da tela em geral. Até que a renderização funcione plenamente, não podemos dizer nada sobre a largura real.

Tente redesenhá-la e depois verifique

   ObjectSetString(0,name,OBJPROP_TEXT,object);
   ChartRedraw();
//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
 
Vitaly Muzichenko:

Tente um redesenho e depois verifique

Obrigado, eu vou tentar!

Não funcionou.
 
Maxim Kuznetsov:

OBJ_LABEL é um objeto muito específico - após a colocação e antes da primeira atualização do gráfico, a largura (X_SIZE) é indefinida.

Depende da fonte, dpi da tela em geral. Até que as funções de renderização funcionem completamente, eu não posso dizer nada sobre a largura real.


Obrigado, a idéia é clara, vou fazer experiências com algo.

 
Nauris Zukas:


Obrigado, entendi a idéia, vou fazer experiências com ela.

O ChartRedraw não redesenha diretamente, ele apenas coloca uma marca em algum lugar nas profundezas do terminal "a carta deve ser redesenhada o mais rápido possível".

Para descobrir que largura a marca do texto (deve) ter, você pode tentar TextSetFont, TextGetSize - a diferença significativa só pode aparecer no HiDPI. Ou talvez não :-) Eu não tentei

ou obter a largura do OBJ_LABEL real já no próximo tick/chart_event, ou seja, exatamente após a repintura

 
Maxim Kuznetsov:

O ChartRedraw não redesenha diretamente, ele apenas coloca uma marca em algum lugar nas profundezas do terminal "a carta deve ser redesenhada o mais rápido possível".

Para descobrir qual a largura que uma marca de texto (deve) ter, você pode tentar TextSetFont, TextGetSize - a diferença significativa só pode aparecer no HiDPI. Ou talvez não :-) Eu não tentei

ou obter a largura do OBJ_LABEL real já no próximo tick/chart_event, ou seja, exatamente após o redesenho

Já está funcionando, obrigado! Adicionado OnDeinit(), coloque um atraso lá, e então OBJPROP_XSIZE.
P.S. Eu não consegui pensar em nada melhor a ver com o atraso no roteiro:

for(int i=100000000; i>0; i--) {} 
 
Nauris Zukas:

Obrigado, tudo deu certo! Eu adicionei OnDeinit(), coloquei um atraso lá, e depois OBJPROP_XSIZE.
P.S. Eu não consegui pensar em nada melhor a ver com o atraso no roteiro:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

 
Maxim Kuznetsov:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

Obrigado, funcionou!

   do{}
   while(GetTickCount()-Time11<1000);