初学者的问题 MQL4 MT4 MetaTrader 4 - 页 217

 
alex_xss:

嗯,也许。

你是第一个还没有吃过的人))。

但这并不重要,在任何人身上都可能出现 - 所以你必须解决它,不幸的是。

我有很多,这取决于MT4的版本(我有一个来自Alpari)。

我有很多不同版本的产品,我在为它们编程:-)但软件还是一样的,它们只是在小品牌和指标/顾问的小芯片上有区别。

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下才会出现明显的差异。也可能不是 :-) 我还没有试过。

或者在下一个tick/chart_event时已经得到真正的OBJ_LABEL 的宽度,即正好在重绘之后

 
Maxim Kuznetsov:

ChartRedraw并不直接重绘,它只是在终端深处的某个地方打上一个勾,"图表应该在第一时间被重绘"。

要知道哪种宽度(应该)得到文字标记,你可以尝试TextSetFont, TextGetSize - 只有在HiDPI下才会出现明显的差异。也可能不是 :-) 我还没有试过。

或者在下一个tick/chart_event时已经得到真正的OBJ_LABEL 的宽度,也就是在重新加载后的确切宽度。

已经开始工作了,谢谢!增加了OnDeinit(),在那里放了一个延迟,然后是OBJPROP_XSIZE。
P.S. 我想不出有什么更好的办法来处理剧本中的延迟。

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

谢谢,这一切都解决了!我添加了OnDeinit(),在那里放了一个延迟,然后是OBJPROP_XSIZE。
P.S. 我想不出有什么更好的办法来处理剧本中的延迟。

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