更新后对自定义指标支持不好,图表及其卡顿。
确实是的,更新后所有的自定义指标在加载的瞬间立刻无响应了。
似乎是与自定义控件的有关。加载了 CAppDialog 与自定义控件的指标都会发生无响应
PC程序端更新后图表窗口的文字和指标宽度为1的线条清晰度严重下降,这些最基本UI设计都不清晰,不知道你们是怎么想的?
我已经找到问题的根本
//+------------------------------------------------------------------+ //| ListViewHIndicator.mq5 | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2000-2025, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 input string mFontName = "Arial"; #include <Controls/Defines.mqh> #undef CONTROLS_FONT_NAME #undef CONTROLS_FONT_SIZE #define CONTROLS_FONT_SIZE MathAbs(12) #define CONTROLS_FONT_NAME mFontName #undef CONTROLS_LIST_ITEM_HEIGHT #define CONTROLS_LIST_ITEM_HEIGHT MathAbs(25) #include <Controls\Dialog.mqh> #include <Controls\ListViewH.mqh> //--- input parameters input int Width = 1000; input int Height = 500; input int ItemsCount = 50; //--- global variables CAppDialog app_dialog; CListViewH list_view; bool initialized = false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create dialog int x1 = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)/2 - Width/2; int y1 = (int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS)/2 - Height/2; int x2 = x1 + Width; int y2 = y1 + Height; if(!app_dialog.Create(0,"ListViewHDemo",0,x1,y1,x2,y2)) { Print("Failed to create dialog"); return INIT_FAILED; } //--- add list view to dialog first app_dialog.Add(list_view); x1 = app_dialog.Left() + CONTROLS_BORDER_WIDTH; y1 = app_dialog.Top() + CONTROLS_BORDER_WIDTH; x2 = app_dialog.Right() - CONTROLS_BORDER_WIDTH; y2 = app_dialog.Bottom() - CONTROLS_BORDER_WIDTH; //--- then create list view if(!list_view.Create(0,"ListViewH",0, x1, y1, x2, y2)) { Print("Failed to create ListViewH"); return INIT_FAILED; } //--- show dialog app_dialog.Visible(true); app_dialog.Run(); //--- add items after dialog is running for(int i=0;i<ItemsCount;i++) { //string item = StringFormat("Item %d",i+1); double d_tmp = iOpen(_Symbol, PERIOD_CURRENT, i); if(!list_view.ItemAdd(DoubleToString(d_tmp, _Digits),i+1)) { Print("Failed to add item: ",d_tmp); return INIT_FAILED; } } //--- set initialized flag initialized = true; //--- display information Print("ListViewHIndicator initialized successfully"); Print("Total items: ",ItemsCount); Print("Total visible columns: ",list_view.VisibleColumns()); Print("Total pages: ",list_view.TotalPages()); Print("Current page: ",list_view.CurrentPage()); //--- succeed return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy dialog app_dialog.Destroy(reason); Print("ListViewHIndicator deinitialized"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- return rates_total; } //+------------------------------------------------------------------+ //| Chart event handler | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- debug print PrintFormat("ChartEvent: id=%d, lparam=%lld, dparam=%G, sparam='%s'", id, lparam, dparam, sparam); //--- pass event to dialog if(initialized) app_dialog.ChartEvent(id,lparam,dparam,sparam); } //+------------------------------------------------------------------+
这使我用于复现问题的 DEMO
当尝试重新定义初始化时的字体风格(中文的名称)时,使用了 CAppDialog 以及标准库控件的指标或者程序,会立刻无响应,这样的问题在上一个 25-11 的版本不存在。
#define CONTROLS_FONT_SIZE MathAbs(12)
#define CONTROLS_FONT_NAME ("微软雅黑")
#undef CONTROLS_LIST_ITEM_HEIGHT
#define CONTROLS_LIST_ITEM_HEIGHT MathAbs(25)
如果使用 Arial 或者其他英文的字体名称例如 Source Code Pro 似乎不会发生问题
ObjectSetString 在指定了中文的字体名称也会发生无响应!
Discover new MetaTrader 5 opportunities with MQL5 community and services
- 2026.01.31
- www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
Ding Kang Chen #:
这使我用于复现问题的 DEMO
当尝试重新定义初始化时的字体风格(中文的名称)时,使用了 CAppDialog 以及标准库控件的指标或者程序,会立刻无响应,这样的问题在上一个 25-11 的版本不存在。
我已经找到问题的根本
这使我用于复现问题的 DEMO
当尝试重新定义初始化时的字体风格(中文的名称)时,使用了 CAppDialog 以及标准库控件的指标或者程序,会立刻无响应,这样的问题在上一个 25-11 的版本不存在。
#define CONTROLS_FONT_SIZE MathAbs(12)
#define CONTROLS_FONT_NAME ("微软雅黑")
#undef CONTROLS_LIST_ITEM_HEIGHT
#define CONTROLS_LIST_ITEM_HEIGHT MathAbs(25)
如果使用 Arial 或者其他英文的字体名称例如 Source Code Pro 似乎不会发生问题
ObjectSetString 在指定了中文的字体名称也会发生无响应!
朋友您好。
我将您直接粘贴的代码改成了代码格式,这样比较容易阅读。
请参照这个帖子。感谢。
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
- 2023.06.13
- www.mql5.com
大家好,我是官网版主。 官网内部有机器人辅助管理,目的是自动下架一些有误导性的内容。 内容过长,或同一个IP多次注册,容易导致机器人误判,而被无辜删帖。 如果您被无故删帖,我们对这种体验感到万分抱歉。 为了防止机器人误判,请在讨论代码的时候使用代码表述功能...

MetaTrader 5平台更新将于 2026 年 1 月 30 日星期五发布。
在此版本中,我们改进了 MQL5 对 ONNX 的支持。现在,模型在支持 CUDA 的 GPU 上运行速度明显加快。此外,我们还引入了对新标志的支持,并修订了库工作流程:现在,ONNX 只在使用它的程序首次运行时安装,而不是与平台一起安装。
我们还改进了上一次更新中引入的 Blend2D 引擎对图表上文本和分析对象的渲染。此外,本次更新还增强了交易报告功能,并提高了策略测试器的稳定性。
该平台的网页版也进行了多项改进。当直接在图表上调整止损水平时,您现在可以看到货币形式的近似损益值。我们还修复了某些交易数据的显示。
MetaTrader 5 客户端
CUDA 使用权限可以在平台设置中管理:
日志
现在使用以下日志标记来代替已废弃的 ONNX_DEBUG_LOGS:
CUDA 和 GPU 管理
删除了 ONNX_CUDA_DISABLE 标志。请使用新的 ONNX_USE_CPU_ONLY 标志。启用后,执行模型将仅使用 CPU。
已添加标记以选择将在其上执行模型的 GPU 设备:
如果系统有两个或更多支持 CUDA 的设备,请使用这些标记。如果指定了多个标志,将选择索引最低的设备。
模型分析
我们添加了 ONNX_ENABLE_PROFILING 标志,以启用 ONNX 模型分析。
启用此标记后启动模型时,将在 /MQL5/Files/OnnxProfileReports/ 文件夹中创建名称为 [EX5 文件名]_[日期]_[时间].json 的分析报告文件。
G = G * A / 255
B = B * A / 255
A = A
示例
文件 utils.mqh:
文件 expert.mq5: 以前,编译器会发出警告,称 utils.mqh 中的 CalcLot 函数缺少 #import 指令,尽管该函数是用户定义的,并已经在项目代码中实现。现在,此类代码在编译时不会出现警告。只有实际从外部 DLL 导入的函数才需要使用 #import 指令。
MetaTrader 5 网页端
更新将通过实时更新提供。