错误、漏洞、问题 - 页 2737 1...273027312732273327342735273627372738273927402741274227432744...3184 新评论 [删除] 2020.05.12 14:10 #27361 在MT4中,调试指标 时,如果切换到图表,调试器就会永久挂起。 例如,在开始调试标准CCI指标的过程中再现。 1.设置一个中断点。 2.按F5。 3.切换到图表上。 结果 - 调试器图形挂起。 你也可以在调试过程中简单地按几次F5 - 图表挂起。 建1260。 调试器设置。 Vladimir Karputov 2020.05.12 18:32 #27362 与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。 fxsaber 2020.05.12 19:15 #27363 搜索结果 中删除了一些文字。 这里是原文。 关于交易、自动交易系统和策略测试器的论坛 MetaTrader 5策略测试器:缺陷,缺陷,改进建议 fxsaber, 2020.05.11 20:31 对于Tester来说,创建Header.passes_passed== 0的opt文件可能没有意义。 Sergey Dzyublik 2020.05.12 19:32 #27364 很少与图形对象一起工作,出现了为OBJ_LABLE(设置OBJPROP_BGCOLOR)背景着色的需要。 事实证明,对于OBJ_LABLE类型的对象来说,设置背景颜色是不可能的,必须使用OBJ_EDIT。 在使用OBJ_EDIT时,出现了一个新的问题--需要设置OBJPROP_XSIZE和OBJPROP_YSIZE的尺寸,使所有的文字都适合相应的对象尺寸。 问题:如何确定OBJPROP_XSIZE和OBJPROP_YSIZE的大小以适应整个文本? 我考虑了两个选择。 1.创建OBJ_LABLE对象,读取其尺寸,删除OBJ_LABLE对象。 不适合,因为只有在对象实际被创建后才能进行尺寸标注,当对象在ChartRedraw队列中时,不可能进行尺寸标注。 2. 使用TextSetFont,然后是TextGetSize。 不合适,因为结果与方法1的结果有根本性的不同,相差2.5-2.9倍,取决于字体大小。 原因可能是4K显示器和175%的DPI。 #define PRINT(x) ; Print(#x, ":", string(x)) void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma") { ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font); ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0); ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y); } void OnStart(){ string obj_name = "test_obj"; string text = "AAAA::BBBB"; int font_size = 7; string font_name = "Tahoma"; SetLabel(0, obj_name, 0, text, clrWhite, 100, 100, 0, font_size, font_name); ChartRedraw(0); Sleep(1000); uint dx_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_XSIZE)); uint dy_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_YSIZE)); ObjectDelete(0, obj_name); PRINT(dx_fixed_0); PRINT(dy_fixed_0); uint dx_fixed_1; uint dy_fixed_1; TextSetFont(font_name, -10 * font_size); TextGetSize(text, dx_fixed_1, dy_fixed_1); PRINT(1.0 * dx_fixed_0 / dx_fixed_1); // Result: 1.0 PRINT(1.0 * dy_fixed_0 / dy_fixed_1); // Result: 1.0 } 感谢Geess 提供的解决方案。 在传递给TextSetFont 时,有必要将洗码的大小乘以-10。 [删除] 2020.05.13 00:33 #27365 Sergey Dzyublik: 我很少处理图形对象,我需要为OBJ_LABLE画背景色(设置OBJPROP_BGCOLOR)。 事实证明,对于OBJ_LABLE类型的对象来说,设置背景颜色是不可能的,必须使用OBJ_EDIT。 在使用OBJ_EDIT时,出现了一个新的问题--需要设置OBJPROP_XSIZE和OBJPROP_YSIZE的尺寸,使所有的文字都适合相应的对象尺寸。 问题:如何确定OBJPROP_XSIZE和OBJPROP_YSIZE的大小以适应整个文本? 我已经考虑了两个选项。 1.创建OBJ_LABLE对象,读取尺寸,删除OBJ_LABLE对象。 不适合,因为只有在对象实际被创建后才能进行尺寸标注,当对象在ChartRedraw队列中时,不可能进行尺寸标注。 2. 使用TextSetFont,然后是TextGetSize。 不合适,因为结果与方法1的结果有根本性的不同,相差2.5-2.9倍,取决于字体大小。 也许原因是4K显示器和175%的DPI。 首先,文字大小和物体大小不是一回事。至少要有一个边界。因此,这些价值不可能重合。 其次,最好使用OBJ_BITMAP_LABEL,它没有任何限制。 如果你真的使用它,最好是使用CCanvas类。 #include <Canvas\Canvas.mqh> void SetLabel(CCanvas &c, long achart, string name, int wnd, string text, color clr_text, color clr_bckgrnd, int x, int y, int corn=0, int fontsize=8, int border=2, string font="Tahoma", uchar transparency=0xFF) { uint w,h; c.FontSet(font, fontsize); c.TextSize(text, w, h); if(!c.CreateBitmapLabel(achart,wnd,name,x,y,w+border*2,h+border*2,COLOR_FORMAT_ARGB_NORMALIZE)) Print("Error creating canvas object: ", GetLastError()); c.Erase(ColorToARGB(clr_bckgrnd,transparency)); c.TextOut(border,border,text,ColorToARGB(clr_text,transparency)); c.Update(); } void OnStart(){ string obj_name = "test_obj"; string text = "AAAA::BBBB"; int font_size = 17; string font_name = "Tahoma"; CCanvas Can; SetLabel(Can,0, obj_name, 0, text, clrYellow, clrBlue, 100, 100, 0, font_size,3, font_name, 0x80); Sleep(10000); Can.Destroy(); } 其结果是相同的对象,只是有更多的可能性。例如,通过增加文本标签的透明度。 Sergey Dzyublik 2020.05.13 02:36 #27366 Geess: 首先,文字大小和物体大小不是一回事。至少,必须有一个边界。因此,这些价值不能重合。 非常感谢您的帮助。 你正在调整一个现成的解决方案以满足你自己的需要,所以我认为没有必要实现库。 你最初提出的解决方案可以表示为:。 void SetBitmapLabel(long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma", int border=2) { uint w,h; TextSetFont(font,-10* fontsize,0,0); TextGetSize(text,w,h); w = w+border*2; h = h+border*2; uint pixels[]; ArrayResize(pixels,w*h); ArrayInitialize(pixels,0); ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_XRGB_NOALPHA; string resource_name="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand()); ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format); ObjectCreate(achart,name,OBJ_BITMAP_LABEL,wnd,0,0); ObjectSetInteger(achart,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(achart,name,OBJPROP_YDISTANCE,y); ObjectSetString(achart,name,OBJPROP_BMPFILE,resource_name); ArrayInitialize(pixels,ColorToARGB(bgclr)); TextOut(text,border,border,0,pixels,w,h,ColorToARGB(clr),color_format); ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format); } void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma") { ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font); ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0); ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y); } void OnStart(){ string obj_name = "test_obj"; string text = "AAAA::BBBB"; int font_size = 50; string font_name = "Tahoma"; SetBitmapLabel(0, "BL" + obj_name, 0, text, clrRed, clrWhite, 100, 100, 0, font_size, font_name); SetLabel (0, "L" + obj_name, 0, text, clrRed, 100, 200, 0, font_size, font_name); ChartRedraw(0); Sleep(10000); } 不幸的是,由于MT5的一个缺陷--建议的解决方案不能正常使用。 在Windows DPI为175%的4K显示器上,文字大小比需要的小3倍。我必须将字体大小 乘以DPI/100% * [1.6 ... 1.8] 。 谢谢Geess 提供的解决方案。当把字体传给TextSetFont时,你必须把字体大小乘以-10。 [删除] 2020.05.13 03:43 #27367 Sergey Dzyublik: 非常感谢您的帮助。 你正在调整一个现成的解决方案以满足你自己的需要,所以我认为没有必要实现库。 你最初提出的解决方案可以表示为:。 不幸的是,由于MT5的一个缺陷--建议的解决方案不能正常使用。 在Windows DPI为175%的4K显示器上,文字大小比需要的小3倍。 我必须将字体大小 乘以DPI/100% * [1.6 ... 1.8]。 https://www.mql5.com/ru/docs/objects/textsetfont 你必须像这样做。 void SetBitmapLabel(long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma", int border=2, uchar transparency=0xFF) { uint w,h; TextSetFont(font,-10*fontsize,0,0); TextGetSize(text,w,h); w = w+border*2; h = h+border*2; uint pixels[]; ArrayResize(pixels,w*h); ArrayInitialize(pixels,0); ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_ARGB_NORMALIZE; string resource_name="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand()); ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format); ObjectCreate(achart,name,OBJ_BITMAP_LABEL,wnd,0,0); ObjectSetInteger(achart,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(achart,name,OBJPROP_YDISTANCE,y); ObjectSetString(achart,name,OBJPROP_BMPFILE,resource_name); ObjectSetInteger(achart,name,OBJPROP_BACK,false); ArrayInitialize(pixels,ColorToARGB(bgclr, transparency)); TextOut(text,border,border,0,pixels,w,h,ColorToARGB(clr, transparency),color_format); ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format); } void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma") { ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font); ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0); ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y); } void OnStart(){ string obj_name = "test_obj"; string text = "AAAA::BBBB"; int font_size = 50; string font_name = "Tahoma"; SetBitmapLabel(0, "BL" + obj_name, 0, text, clrRed, clrBlue, 100, 100, 0, font_size, font_name,2,0xA0); SetLabel (0, "L" + obj_name, 0, text, clrBlue, 100, 200, 0, font_size, font_name); ChartRedraw(0); Sleep(10000); } 我不明白你为什么这么需要OBJ_LABEL?你用OBJ_BITMAP_LABEL实现了一个没有库的变体。它的优势是什么?我只看到一个限制。 Sergey Dzyublik 2020.05.13 04:17 #27368 目标 Geess: https://www.mql5.com/ru/docs/objects/textsetfont 我不明白你为什么这么需要OBJ_LABEL?你用OBJ_BITMAP_LABEL实现了一个没有库的变体。它的优势是什么?我只看到一个限制。 再次非常感谢你。 不知道,没有看到,没有读到,关于-10的乘法。问题解决了。 OBJ_LABEL被用来说明问题并能够重现它。 [删除] 2020.05.13 09:07 #27369 你好!请告诉我问题出在哪里。 不同的指标,在正常工作和更新的情况下,开始显示不同的东西,而不是基于主窗口中显示的价格图表。 这种情况偶尔会发生,不是每天都有。 起初我把责任归咎于指标,但在尝试了不同的指标后,包括MT5 本地指标,我对终端产生了怀疑。我观察这个问题很长时间了,从去年开始,在不同版本的终端上。首先是在Alpari定制版本上,现在在原始版本上也是如此。无论是在模拟账户 还是在真实的ECN上。 Alpari经纪人。MT5 build 2363 from 13.03.2020.我不记得其他时期的情况,但肯定会在M1 发生。 截图。 "滑落 "的变体。除 "之 "字形外,所有指标都是内置的。用正确的工作与历史的人字形。各项指标的读数在它们之间是趋同的。 它们与价格不相符。 更新后。 MT5版本 附加的文件: xb0_200507_01.png 92 kb ux0_200507_01k.png 94 kb 63p_200507_01_MT5.png 33 kb shev1404 2020.05.13 12:16 #27370 下午。 偶然发现了一个无法理解的东西,不明白它是什么。 有两种功能被用于不同的策略中。在逻辑上,检查中的代码如 if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic) 如果其中一个条件是错误的,它就不应该被执行。但由于某些原因,如果魔法数字和传入函数的魔法数字不相等,它就会被执行。 这似乎是整数类型的比较。我不能理解为什么。你可以在下面的屏幕截图中看到它。 void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt) { for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name()) { if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic) { if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetBuy(magic,ExtDP)==true) { double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP)); Print("#1122 cdist ",numstr,": ",cdist); Print("#2211! m_position.PriceOpen(): ",m_position.PriceOpen()); Print("#2212! m_position.PriceCurrent(): ",m_position.PriceCurrent()); Print("#2213! ExtDP: ",ExtDP); Print("#2214! magic: ",magic); Print("#2215! ev: ",ev); Print("#2216! iuv: ",iuv); Print("#2217! m_position.Volume(): ",m_position.Volume()); Print("#2218! m_position.Magic(): ",m_position.Magic()); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv) ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv) ev=NormalizeDouble(imv,2); rev=ev; double sl=0.0; double tp=0.0; if(itp>0) tp=m_symbol.Ask()+etp; if(isl>0) sl=m_symbol.Bid()-esl; //m_trade.SetExpertMagicNumber(magic); if(OpenBuy(m_trade,ev,sl,tp,numstr)) { last_pt=POSITION_TYPE_BUY; FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); Print("#516! Position BUY after down SELL "+numstr); //Sleep(3000); continue; } } } } if(m_position.PositionType()==POSITION_TYPE_BUY && m_position.Magic()==magic) { if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetBuy(magic,ExtDP)==true) { double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP)); Print("#1123 cdist ", numstr," : ",cdist); Print("#3211! m_position.PriceOpen(): ",m_position.PriceOpen()); Print("#3212! m_position.PriceCurrent(): ",m_position.PriceCurrent()); Print("#3213! ExtDP: ",ExtDP); Print("#3214! magic: ",magic); Print("#3215! ev: ",ev); Print("#3216! iuv: ",iuv); Print("#3217! m_position.Volume(): ",m_position.Volume()); Print("#3218! m_position.Magic(): ",m_position.Magic()); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv) ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv) ev=NormalizeDouble(imv,2); rev=ev; double sl=0.0; double tp=0.0; if(itp>0) tp=m_symbol.Ask()+etp; if(isl>0) sl=m_symbol.Bid()-esl; //m_trade.SetExpertMagicNumber(magic); if(OpenBuy(m_trade,ev,sl,tp,numstr)) { last_pt=POSITION_TYPE_BUY; FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); Print("#517! Position BUY After down BUY "+numstr); //Sleep(3000); continue; } } } } } } void OpenNextSellPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt) { for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name()) { if(m_position.PositionType()==POSITION_TYPE_BUY && m_position.Magic()==magic) { if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetSell(magic,ExtDP)==true) { double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP)); Print("#1124 cdist ", numstr," : ",cdist); Print("#4211! m_position.PriceOpen(): ",m_position.PriceOpen()); Print("#4212! m_position.PriceCurrent(): ",m_position.PriceCurrent()); Print("#4213! ExtDP: ",ExtDP); Print("#4214! magic: ",magic); Print("#4215! ev: ",ev); Print("#4216! iuv: ",iuv); Print("#4217! m_position.Volume(): ",m_position.Volume()); Print("#4218! m_position.Magic(): ",m_position.Magic()); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv) ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv) ev=NormalizeDouble(imv,2); rev=ev; double sl=0.0; double tp=0.0; if(itp>0) tp=m_symbol.Bid()-etp; if(isl>0) sl=m_symbol.Ask()+esl; //m_trade.SetExpertMagicNumber(magic); if(OpenSell(m_trade,ev,sl,tp,numstr)) { last_pt=POSITION_TYPE_SELL; FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); Print("#518! Position SELL After down BUY "+numstr); //Sleep(3000); continue; } } } } if(m_position.PositionType()==POSITION_TYPE_SELL && m_position.Magic()==magic) { if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0) { if(IsSetSell(magic,ExtDP)==true) { double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP)); Print("#1125 cdist ", numstr," : ",cdist); Print("#5211! m_position.PriceOpen(): ",m_position.PriceOpen()); Print("#5212! m_position.PriceCurrent(): ",m_position.PriceCurrent()); Print("#5213! ExtDP: ",ExtDP); Print("#5214! magic: ",magic); Print("#5215! ev: ",ev); Print("#5216! iuv: ",iuv); Print("#5217! m_position.Volume(): ",m_position.Volume()); Print("#5218! m_position.Magic(): ",m_position.Magic()); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv) ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2); if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv) ev=NormalizeDouble(imv,2); rev=ev; double sl=0.0; double tp=0.0; if(itp>0) tp=m_symbol.Bid()-etp; if(isl>0) sl=m_symbol.Ask()+esl; //m_trade.SetExpertMagicNumber(magic); if(OpenSell(m_trade,ev,sl,tp,numstr)) { last_pt=POSITION_TYPE_SELL; FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); Print("#519! Position SELL After down SELL "+numstr); //Sleep(3000); continue; } } } } } } Заранее спасибо за ответ. 1...273027312732273327342735273627372738273927402741274227432744...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在MT4中,调试指标 时,如果切换到图表,调试器就会永久挂起。
例如,在开始调试标准CCI指标的过程中再现。
1.设置一个中断点。
2.按F5。
3.切换到图表上。
结果 - 调试器图形挂起。
你也可以在调试过程中简单地按几次F5 - 图表挂起。
建1260。
调试器设置。
搜索结果 中删除了一些文字。
这里是原文。
关于交易、自动交易系统和策略测试器的论坛
MetaTrader 5策略测试器:缺陷,缺陷,改进建议
fxsaber, 2020.05.11 20:31
对于Tester来说,创建Header.passes_passed== 0的opt文件可能没有意义。事实证明,对于OBJ_LABLE类型的对象来说,设置背景颜色是不可能的,必须使用OBJ_EDIT。
在使用OBJ_EDIT时,出现了一个新的问题--需要设置OBJPROP_XSIZE和OBJPROP_YSIZE的尺寸,使所有的文字都适合相应的对象尺寸。
问题:如何确定OBJPROP_XSIZE和OBJPROP_YSIZE的大小以适应整个文本?
我考虑了两个选择。
1.创建OBJ_LABLE对象,读取其尺寸,删除OBJ_LABLE对象。
不适合,因为只有在对象实际被创建后才能进行尺寸标注,当对象在ChartRedraw队列中时,不可能进行尺寸标注。
2. 使用TextSetFont,然后是TextGetSize。
不合适,因为结果与方法1的结果有根本性的不同,相差2.5-2.9倍,取决于字体大小。
原因可能是4K显示器和175%的DPI。
感谢Geess 提供的解决方案。
在传递给TextSetFont 时,有必要将洗码的大小乘以-10。
我很少处理图形对象,我需要为OBJ_LABLE画背景色(设置OBJPROP_BGCOLOR)。
事实证明,对于OBJ_LABLE类型的对象来说,设置背景颜色是不可能的,必须使用OBJ_EDIT。
在使用OBJ_EDIT时,出现了一个新的问题--需要设置OBJPROP_XSIZE和OBJPROP_YSIZE的尺寸,使所有的文字都适合相应的对象尺寸。
问题:如何确定OBJPROP_XSIZE和OBJPROP_YSIZE的大小以适应整个文本?
我已经考虑了两个选项。
1.创建OBJ_LABLE对象,读取尺寸,删除OBJ_LABLE对象。
不适合,因为只有在对象实际被创建后才能进行尺寸标注,当对象在ChartRedraw队列中时,不可能进行尺寸标注。
2. 使用TextSetFont,然后是TextGetSize。
不合适,因为结果与方法1的结果有根本性的不同,相差2.5-2.9倍,取决于字体大小。
也许原因是4K显示器和175%的DPI。
首先,文字大小和物体大小不是一回事。至少要有一个边界。因此,这些价值不可能重合。
其次,最好使用OBJ_BITMAP_LABEL,它没有任何限制。
如果你真的使用它,最好是使用CCanvas类。
其结果是相同的对象,只是有更多的可能性。例如,通过增加文本标签的透明度。
首先,文字大小和物体大小不是一回事。至少,必须有一个边界。因此,这些价值不能重合。
非常感谢您的帮助。
你正在调整一个现成的解决方案以满足你自己的需要,所以我认为没有必要实现库。
你最初提出的解决方案可以表示为:。
不幸的是,由于MT5的一个缺陷--建议的解决方案不能正常使用。
在Windows DPI为175%的4K显示器上,文字大小比需要的小3倍。
我必须将字体大小 乘以DPI/100% * [1.6 ... 1.8] 。
谢谢Geess 提供的解决方案。

当把字体传给TextSetFont时,你必须把字体大小乘以-10。
非常感谢您的帮助。
你正在调整一个现成的解决方案以满足你自己的需要,所以我认为没有必要实现库。
你最初提出的解决方案可以表示为:。
不幸的是,由于MT5的一个缺陷--建议的解决方案不能正常使用。
在Windows DPI为175%的4K显示器上,文字大小比需要的小3倍。
我必须将字体大小 乘以DPI/100% * [1.6 ... 1.8]。
https://www.mql5.com/ru/docs/objects/textsetfont

你必须像这样做。
我不明白你为什么这么需要OBJ_LABEL?你用OBJ_BITMAP_LABEL实现了一个没有库的变体。它的优势是什么?我只看到一个限制。
https://www.mql5.com/ru/docs/objects/textsetfont
我不明白你为什么这么需要OBJ_LABEL?你用OBJ_BITMAP_LABEL实现了一个没有库的变体。它的优势是什么?我只看到一个限制。
再次非常感谢你。
不知道,没有看到,没有读到,关于-10的乘法。问题解决了。
OBJ_LABEL被用来说明问题并能够重现它。
请告诉我问题出在哪里。
不同的指标,在正常工作和更新的情况下,开始显示不同的东西,而不是基于主窗口中显示的价格图表。 这种情况偶尔会发生,不是每天都有。
起初我把责任归咎于指标,但在尝试了不同的指标后,包括MT5 本地指标,我对终端产生了怀疑。我观察这个问题很长时间了,从去年开始,在不同版本的终端上。首先是在Alpari定制版本上,现在在原始版本上也是如此。无论是在模拟账户 还是在真实的ECN上。
Alpari经纪人。MT5 build 2363 from 13.03.2020.我不记得其他时期的情况,但肯定会在M1 发生。
截图。
"滑落 "的变体。除 "之 "字形外,所有指标都是内置的。用正确的工作与历史的人字形。各项指标的读数在它们之间是趋同的。 它们与价格不相符。
更新后。
MT5版本
下午。
偶然发现了一个无法理解的东西,不明白它是什么。
有两种功能被用于不同的策略中。在逻辑上,检查中的代码如
如果其中一个条件是错误的,它就不应该被执行。但由于某些原因,如果魔法数字和传入函数的魔法数字不相等,它就会被执行。
这似乎是整数类型的比较。我不能理解为什么。你可以在下面的屏幕截图中看到它。