¿Alguna vez has necesitado copiar y pegar objetos gráficos entre gráficos abiertos?
Seguro que sí. Sorprendentemente, MetaTrader no ofrece una función de "Copiar y Pegar" para objetos. Lo único que puedes utilizar para lograr un efecto similar son las plantillas (archivos tpl). Pero las plantillas almacenan todo el estado del gráfico, incluidos indicadores, configuraciones y otros elementos auxiliares que pueden ser irrelevantes y innecesarios para el procedimiento de replicación que necesitas.
Por eso desarrollé este indicador ChartObjectsCopyPaste.mq5. Te permite copiar objetos seleccionados al portapapeles, desde donde puedes pegarlos en otros gráficos. ¡Sin complicaciones!
Cómo Funciona el Indicador
Este indicador se basa en otro indicador publicado en el libro de algotrading - ObjectGroupEdit.mq5.
Si deseas más información sobre las clases subyacentes (ObjectMonitor, MapArray y otras), sigue el enlace.
Este indicador no tiene búferes. Debe ser adjuntado a al menos 2 gráficos: el gráfico fuente del que deseas copiar objetos y el gráfico objetivo donde planeas pegarlos.
Mientras se está ejecutando en un gráfico, el indicador rastrea los objetos gráficos existentes y toma nota de cuáles están seleccionados.
Comandos de "Copiar y Pegar"
Como de costumbre, los comandos "Copiar y Pegar" funcionan en pareja:
- Presiona la tecla Ctrl+Q para copiar todos los objetos seleccionados en el portapapeles de Windows como texto (puedes guardarlo y verlo en cualquier editor de texto, aquí tienes un ejemplo más abajo).
- En el gráfico objetivo, presiona Ctrl+J para pegar todos los objetos desde el portapapeles.
¿Por qué Ctrl+Q/Ctrl+J? Estas son solo 2 combinaciones de teclas vacías elegidas voluntariamente entre muy pocas opciones. Esto se debe a que MetaTrader intercepta y no propaga muchas combinaciones de teclas a los programas MQL. Particularmente, esto sucede con los comandos estándar Ctrl+C/Ctrl+V/Ctrl+Ins/Shift+Ins, que no funcionan en este contexto.
Como el código fuente está disponible, puedes cambiar las combinaciones de teclas a otras que prefieras.
Como el indicador utiliza DLL del sistema para acceder al portapapeles de Windows, debes permitir las importaciones de DLL en el diálogo de Propiedades, en la pestaña Dependencias.
Dado que la Codebase no permite importaciones de DLL, el código relacionado con el portapapeles está envuelto en la directiva de preprocesador condicional #ifdef DLL_LINK, así que por favor descomenta la línea
#define DLL_LINK
antes de compilar. De lo contrario, verás cómo las funciones de portapapeles mostrarán alertas en respuesta a la presión de las teclas, ¡y no se realizarán acciones reales!
Entradas del Indicador
- MakeAllSelectable - bandera para hacer todos los objetos seleccionables (lo cual normalmente es falso para aquellos objetos creados programáticamente);
- LogDetails - bandera para registrar todas las propiedades de los objetos transferidos en el log;
El indicador no verifica si los objetos pegados coinciden con el gráfico objetivo real, como símbolo, rango de precios, número de ventanas secundarias, etc. - ¡tú debes hacerlo!
Ejemplo de Texto del Portapapeles
Aquí tienes un ejemplo de texto del portapapeles con 2 objetos:
OBJ_VLINE H1 Línea Vertical 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 Línea Vertical 55786 OBJPROP_TEXT 206 OBJPROP_TOOLTIPOBJ_CHANNEL H1 Canal Equidistante 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 Canal Equidistante 408856 OBJPROP_TEXT 206 OBJPROP_TOOLTIP
Y aquí están esos objetos pegados en el gráfico:


Comentarios 0