Início Indicador técnico Postagem

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

Anexo
52263.zip (7.43 KB, Baixar 0 vezes)

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       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:

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


Publicações relacionadas

Comentário (0)