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 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 Linha 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
E aqui estão esses objetos colados no gráfico:


Comentário 0