Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 217

 
alex_xss:

Ммм, может быть

Вы пока первый у кого этого нет))

Но это неважно, может же выскочить у кого угодно - значит надо править, к сожалению

Может зависит от версии МТ4 (у меня от альпари), у вас какая если не секрет?

у меня их много от разных, я же под них всякое программирую :-) но софт всё равно один и тот-же, они отличаются только минимальным брендингом и мелкими фичами в индикаторах/советниках..

PS/ фокусы с цветами могут быть от неверно выставленного DPI монитора, наличия "утилит корректирующих цветовую температуру", "игровых расширений видеокарты". И прочая-прочая. 

PPS/ кстати ни один DC не осилил (скорее по деньгам, от жадности) собственный пакет индикаторов/советников/скриптов/тулзов. Максимум - убогая панель в корпоративных цветах. Что как-бы намекает 

 

Здравствуйте!
Не подскажете почему OBJPROP_XSIZE выдаёт 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:

Здравствуйте!
Не подскажете почему OBJPROP_XSIZE выдаёт 0?

OBJ_LABEL весьма специфичный объект - после размещения и до первого обновления чарта, ширина (X_SIZE) не определена. 

она вообще зависит от шрифта, dpi экрана. Пока не сработали полностью функции отрисовки, про реальную ширину сказать ничего нельзя

 
Maxim Kuznetsov:

OBJ_LABEL весьма специфичный объект - после размещения и до первого обновления чарта, ширина (X_SIZE) не определена. 

она вообще зависит от шрифта, dpi экрана. Пока не сработали полностью функции отрисовки, про реальную ширину сказать ничего нельзя

Попробуйте сделать перерисовку, а после уже проверять

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

Попробуйте сделать перерисовку, а после уже проверять

Спасибо, попробую!

Не получилось.
 
Maxim Kuznetsov:

OBJ_LABEL весьма специфичный объект - после размещения и до первого обновления чарта, ширина (X_SIZE) не определена. 

она вообще зависит от шрифта, dpi экрана. Пока не сработали полностью функции отрисовки, про реальную ширину сказать ничего нельзя


Спасибо, идея понятна, буду что-то экспериментировать.

 
Nauris Zukas:


Спасибо, идея понятна, буду что-то экспериментировать.

ChartRedraw не производит непосредственную перерисовку , он просто где-то в недрах терминала ставит флажок "чарт надо-бы перерисовать при первой возможности"

чтобы узнать какая ширина (должна) получиться у текстовой метки можно попробовать функции TextSetFont, TextGetSize - существенное различие может возникнуть только при HiDPI. А может и не возникнуть :-) не пробовал

или получить ширину реального OBJ_LABEL уже в следующий тик/чарт_эвент, то есть точно после перерисовки

 
Maxim Kuznetsov:

ChartRedraw не производит непосредственную перерисовку , он просто где-то в недрах терминала ставит флажок "чарт надо-бы перерисовать при первой возможности"

чтобы узнать какая ширина (должна) получиться у текстовой метки можно попробовать функции TextSetFont, TextGetSize - существенное различие может возникнуть только при HiDPI. А может и не возникнуть :-) не пробовал

или получить ширину реального OBJ_LABEL уже в следующий тик/чарт_эвент, то есть точно после перерисовки

Спасибо уже всё получилось! Добавил OnDeinit(), там поставил задержку, а потом уже  OBJPROP_XSIZE.
П.С. Только с задержкой в скрипте я не придумал не чего лучше чем:

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

Спасибо уже всё получилось! Добавил OnDeinit(), там поставил задержку, а потом уже  OBJPROP_XSIZE.
П.С. Только с задержкой в скрипте я не придумал не чего лучше чем:

// задержка 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);

Спасибо, получилось!

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