你是否曾经需要在多个图表之间复制和粘贴一些图形对象?我想你肯定有过这样的需求。然而,MetaTrader并没有提供“复制和粘贴”功能给这些对象。唯一能实现相似效果的就是模板(tpl文件),但模板会保存整个图表的状态,包括指标、设置和许多辅助信息,这些对你所需的复制过程来说可能并没有用处。
因此,我开发了这个指示器 ChartObjectsCopyPaste.mq5。它可以将选定的对象复制到剪贴板,然后可以粘贴到其他图表上,简单明了。
这个指示器基于另外一个发布在 算法交易书籍 中的指示器 - ObjectGroupEdit.mq5。
请点击链接了解更多关于底层类(ObjectMonitor、MapArray等)在幕后工作的细节。
此指示器没有缓冲区。它需要至少附加在两个图表上:一个是你想要复制对象的源图表,另一个是你计划粘贴对象的目标图表。
在图表上运行时,指示器会追踪现有的图形对象,并记录哪些对象被选中。
如同往常,“复制和粘贴”命令是成对使用的:
- 按下 Ctrl+Q 热键将所有选定对象复制到 Windows 剪贴板作为文本(你可以在任何文本编辑器中保存和查看它,示例见下文)。
- 在目标图表上按 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 0 enum ENUM_OBJECT_PROPERTY_INTEGER 0 OBJPROP_COLOR 55295 1 OBJPROP_STYLE 2 2 OBJPROP_WIDTH 1 3 OBJPROP_BACK 0 4 OBJPROP_SELECTED 1 7 OBJPROP_TYPE 0 8 OBJPROP_TIME 1726739940 10 OBJPROP_SELECTABLE 1 11 OBJPROP_CREATETIME 1726847009 12 OBJPROP_TIMEFRAMES 2097151 200 OBJPROP_LEVELS 0 207 OBJPROP_ZORDER 0 208 OBJPROP_HIDDEN 0 1032 OBJPROP_RAY 1 enum ENUM_OBJECT_PROPERTY_DOUBLE 9 OBJPROP_PRICE 1.11449 enum ENUM_OBJECT_PROPERTY_STRING 5 OBJPROP_NAME H1 Vertical Line 5578 6 OBJPROP_TEXT 206 OBJPROP_TOOLTIP OBJ_CHANNEL H1 Equidistant Channel 40885 5 1 enum ENUM_OBJECT_PROPERTY_INTEGER 0 OBJPROP_COLOR 255 1 OBJPROP_STYLE 0 2 OBJPROP_WIDTH 1 3 OBJPROP_BACK 0 4 OBJPROP_SELECTED 1 7 OBJPROP_TYPE 5 8 OBJPROP_TIME 1726758000 8 OBJPROP_TIME.1 1726797600 8 OBJPROP_TIME.2 1726758000 10 OBJPROP_SELECTABLE 1 11 OBJPROP_CREATETIME 1726847883 12 OBJPROP_TIMEFRAMES 2097151 200 OBJPROP_LEVELS 0 207 OBJPROP_ZORDER 0 208 OBJPROP_HIDDEN 0 1003 OBJPROP_RAY_LEFT 0 1004 OBJPROP_RAY_RIGHT 0 1031 OBJPROP_FILL 0 enum ENUM_OBJECT_PROPERTY_DOUBLE 9 OBJPROP_PRICE -28.113879003558715 9 OBJPROP_PRICE.1 -21.708185053380777 9 OBJPROP_PRICE.2 -48.04270462633452 enum ENUM_OBJECT_PROPERTY_STRING 5 OBJPROP_NAME H1 Equidistant Channel 40885 6 OBJPROP_TEXT 206 OBJPROP_TOOLTIP
下面是这些对象粘贴到图表上的效果:

评论 0