Você já se viu na situação de precisar copiar e colar objetos gráficos entre gráficos abertos? Aposto que sim! O curioso é que o MetaTrader não possui uma funcionalidade de "Copiar & Colar" para objetos. A única maneira de conseguir algo parecido é utilizando templates (arquivos .tpl). Porém, o template armazena todo o estado do gráfico, incluindo indicadores, configurações e uma série de informações auxiliares que podem ser irrelevantes para o que você realmente precisa.
Foi pensando nisso que desenvolvi o indicador ChartObjectsCopyPaste.mq5. Ele permite copiar objetos selecionados para a área de transferência do Windows, de onde podem ser colados em outro gráfico. Sem complicações!
O indicador é baseado em outro indicador publicado no livro de algotrading - ObjectGroupEdit.mq5. Siga o link para descobrir mais sobre todas as classes subjacentes (ObjectMonitor, MapArray e outras) que trabalham nos bastidores.
Este indicador não possui buffers e deve ser anexado a pelo menos 2 gráficos: o gráfico de origem, de onde você quer copiar os objetos, e o gráfico de destino, onde você planeja colá-los.
Enquanto estiver rodando em um gráfico, o indicador rastreia os objetos gráficos existentes e anota quais estão selecionados.
Como de costume, os comandos de "Copiar & Colar" funcionam em par:
- Pressione a tecla de atalho Ctrl+Q para copiar todos os objetos selecionados para a área de transferência do Windows como texto (você pode salvar e visualizar esse texto em qualquer editor, veja um exemplo abaixo).
- No gráfico de destino, pressione Ctrl+J para colar todos os objetos da área de transferência.
Por que Ctrl+Q/Ctrl+J? Essas são apenas duas combinações de teclas disponíveis, escolhidas entre poucas opções. Isso acontece porque o MetaTrader intercepta e não propaga muitas teclas de atalho para programas MQL. Em particular, as combinações padrão Ctrl+C/Ctrl+V/Ctrl+Ins/Shift+Ins não funcionam nesse contexto.
Como o código fonte está disponível, você pode alterar as teclas de atalho para outras combinações.
Como o indicador utiliza DLLs do sistema para acessar a área de transferência do Windows, você deve permitir a importação de DLLs na caixa de diálogo Propriedades, na aba Dependências.
Devido ao fato de que a Codebase não permite importações de DLL, o código relacionado à área de transferência está envolto em uma diretiva de pré-processador condicional #ifdef DLL_LINK, então, por favor, descomente a linha
#define DLL_LINK
antes da compilação. Caso contrário, você verá que os stubs da função de área de transferência mostrarão alertas em resposta à pressão das teclas de atalho, mas nenhuma ação real será realizada!
As entradas são:
- MakeAllSelectable - flag para tornar todos os objetos selecionáveis (o que normalmente é falso para objetos criados programaticamente);
- LogDetails - flag para registrar todas as propriedades dos objetos transferidos no log;
O indicador não verifica se os objetos colados correspondem ao gráfico de destino real, como símbolo, faixa de preços, número de subjanelas, etc. - isso você deve fazer manualmente.
Veja um exemplo de texto da área de transferência com 2 objetos:
OBJ_VLINE H1 Linha Vertical 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 Linha Vertical 5578 6 OBJPROP_TEXT 206 OBJPROP_TOOLTIP OBJ_CHANNEL H1 Canal Equidistante 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 Canal Equidistante 40885 6 OBJPROP_TEXT 206 OBJPROP_TOOLTIP
E aqui estão esses objetos colados no gráfico:
