ChartObjectsCopyPaste:MetaTrader 5的实用图形对象复制工具

Mike 2024.09.21 02:59 64 0 0
附件

你是否曾经需要在多个图表之间复制和粘贴一些图形对象?我想你肯定有过这样的需求。然而,MetaTrader并没有提供“复制和粘贴”功能给这些对象。唯一能实现相似效果的就是模板(tpl文件),但模板会保存整个图表的状态,包括指标、设置和许多辅助信息,这些对你所需的复制过程来说可能并没有用处。

因此,我开发了这个指示器 ChartObjectsCopyPaste.mq5。它可以将选定的对象复制到剪贴板,然后可以粘贴到其他图表上,简单明了。

这个指示器基于另外一个发布在 算法交易书籍 中的指示器 - ObjectGroupEdit.mq5

请点击链接了解更多关于底层类(ObjectMonitorMapArray等)在幕后工作的细节。

此指示器没有缓冲区。它需要至少附加在两个图表上:一个是你想要复制对象的源图表,另一个是你计划粘贴对象的目标图表。

在图表上运行时,指示器会追踪现有的图形对象,并记录哪些对象被选中。

如同往常,“复制和粘贴”命令是成对使用的:

  1. 按下 Ctrl+Q 热键将所有选定对象复制到 Windows 剪贴板作为文本(你可以在任何文本编辑器中保存和查看它,示例见下文)。
  2. 在目标图表上按 Ctrl+J 粘贴剪贴板中的所有对象。

为什么是 Ctrl+Q/Ctrl+J?这两个组合键是从非常少的空闲键中自愿选择的,因为MetaTrader会拦截并不传播许多热键到MQL程序中。尤其是标准的 Ctrl+C/Ctrl+V/Ctrl+Ins/Shift+Ins,在这种情况下是无法使用的。

由于源代码是公开的,你可以将热键更改为其他组合。

由于指示器使用系统 DLL 访问 Windows 剪贴板,因此你需要在 属性 对话框的 依赖项 标签中允许 DLL 导入。

由于Codebase不允许DLL导入,相关的剪贴板代码被包裹在条件预处理指令 #ifdef DLL_LINK 中,因此请在编译之前取消注释以下行:

#define DLL_LINK

否则,你会看到剪贴板功能存根在你按下热键时显示警报,而不会执行任何实际操作!

输入参数为:

  • MakeAllSelectable - 使所有对象可选的标志(通常对于程序matically创建的对象为假);
  • LogDetails - 输出所有传输对象属性到日志的标志;

该指示器不会检查粘贴的对象是否与实际目标图表(如符号、价格范围、子窗口数量等)匹配 - 这需要你自己来处理。

以下是包含两个对象的剪贴板文本示例:

OBJ_VLINE       H1 Vertical Line 5578   0       0enumENUM_OBJECT_PROPERTY_INTEGER0       OBJPROP_COLOR   552951       OBJPROP_STYLE   22       OBJPROP_WIDTH   13       OBJPROP_BACK    04       OBJPROP_SELECTED        17       OBJPROP_TYPE    08       OBJPROP_TIME    172673994010      OBJPROP_SELECTABLE      111      OBJPROP_CREATETIME      172684700912      OBJPROP_TIMEFRAMES      2097151200     OBJPROP_LEVELS  0207     OBJPROP_ZORDER  0208     OBJPROP_HIDDEN    01032    OBJPROP_RAY     1enumENUM_OBJECT_PROPERTY_DOUBLE9       OBJPROP_PRICE   1.11449enumENUM_OBJECT_PROPERTY_STRING5       OBJPROP_NAME    H1 Vertical Line 55786       OBJPROP_TEXT    
206     OBJPROP_TOOLTIPOBJ_CHANNEL     H1 Equidistant Channel 40885    5       1enumENUM_OBJECT_PROPERTY_INTEGER0       OBJPROP_COLOR   2551       OBJPROP_STYLE   02       OBJPROP_WIDTH   13       OBJPROP_BACK    04       OBJPROP_SELECTED        17       OBJPROP_TYPE    58       OBJPROP_TIME    17267580008       OBJPROP_TIME.1  17267976008       OBJPROP_TIME.2  172675800010      OBJPROP_SELECTABLE      111      OBJPROP_CREATETIME      172684788312      OBJPROP_TIMEFRAMES      2097151200     OBJPROP_LEVELS  0207     OBJPROP_ZORDER  0208     OBJPROP_HIDDEN    01003    OBJPROP_RAY_LEFT        01004    OBJPROP_RAY_RIGHT       01031    OBJPROP_FILL    0enumENUM_OBJECT_PROPERTY_DOUBLE9       OBJPROP_PRICE   -28.1138790035587159       OBJPROP_PRICE.1  -21.7081850533807779       OBJPROP_PRICE.2  -48.04270462633452enumENUM_OBJECT_PROPERTY_STRING5       OBJPROP_NAME    H1 Equidistant Channel 408856       OBJPROP_TEXT    
206     OBJPROP_TOOLTIP

下面是这些对象粘贴到图表上的效果:

通过剪贴板粘贴的2个图形对象

列表
评论 0