你是否曾经需要在多个图表之间复制和粘贴一些图形对象?我想你肯定有过这样的需求。然而,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 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
下面是这些对象粘贴到图表上的效果:


评论 0