Como Copiar e Colar Objetos Gráficos no MetaTrader 5 com o ChartObjectsCopyPaste

Mike 2024.09.21 02:59 72 0 0
Anexo

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:

  1. 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).
  2. 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:

2 objetos gráficos colados no gráfico via área de transferência


Lista
Comentário 0