보조지표 게시글

MetaTrader 5에서 차트 객체 복사 및 붙여넣기: ChartObjectsCopyPaste 사용하기

첨부파일
52263.zip (7.43 KB, 다운로드 0회)

여러분, 차트 간에 그래픽 객체를 복사하고 붙여넣어야 할 때가 있었나요? 저도 그런 경험이 많아요. 그런데 아시다시피, MetaTrader는 객체를 위한 '복사 & 붙여넣기' 기능을 제공하지 않습니다. 비슷한 효과를 낼 수 있는 방법은 템플릿(tpl 파일)인데, 템플릿은 지표, 설정, 여러 보조 요소까지 포함된 전체 차트 상태를 저장하기 때문에 필요한 복제 작업에 비해 너무 과합니다.

그래서 제가 ChartObjectsCopyPaste.mq5라는 지표를 개발했습니다. 이 지표는 선택된 객체를 클립보드로 복사하고, 다른 차트에 붙여넣을 수 있게 해줍니다. 정말 간단하죠!

이 지표는 알고리즘 트레이딩 책에 게재된 ObjectGroupEdit.mq5라는 지표를 기반으로 하고 있습니다. 자세한 내용은 링크를 통해 확인해 보세요.

이 지표는 버퍼가 필요하지 않습니다. 최소한 두 개의 차트에 부착해야 합니다: 하나는 복사할 객체가 있는 원본 차트, 다른 하나는 붙여넣을 대상 차트입니다.

차트에서 실행되는 동안, 이 지표는 기존 그래픽 객체를 추적하고 선택된 객체에 대한 메모를 남깁니다.

보통 '복사 & 붙여넣기' 명령은 쌍으로 작동합니다:

  1. Ctrl+Q 단축키를 눌러 선택한 모든 객체를 텍스트 형식으로 Windows 클립보드에 복사합니다 (텍스트 편집기에서 저장하고 확인할 수 있습니다).
  2. 대상 차트에서 Ctrl+J를 눌러 클립보드의 모든 객체를 붙여넣습니다.

왜 Ctrl+Q/Ctrl+J인가요? 이 두 조합은 선택된 키 조합 중에서 자발적으로 선택된 것입니다. MetaTrader는 많은 단축키를 가로채기 때문에 MQL 프로그램으로 전달하지 않습니다. 특히 일반적으로 사용하는 Ctrl+C/Ctrl+V/Ctrl+Ins/Shift+Ins는 이 맥락에서 작동하지 않아요.

소스 코드가 공개되어 있으니, 다른 조합으로 단축키를 변경할 수도 있습니다.

이 지표는 Windows 클립보드에 접근하기 위해 시스템 DLL을 사용하므로, 속성 대화상자에서 종속성 탭에 DLL 가져오기를 허용해야 합니다.

Codebase에서 DLL 가져오기를 허용하지 않기 때문에 클립보드와 관련된 코드는 조건부 전처리 지시문 #ifdef DLL_LINK로 감싸져 있습니다. 컴파일 전에 다음 줄의 주석을 제거해야 합니다:

#define DLL_LINK

이 작업을 하지 않으면 클립보드 기능 스텁이 단축키를 눌렀을 때 알림을 표시할 것이고, 실제 작업은 수행되지 않습니다!

설정 항목은 다음과 같습니다:

  • MakeAllSelectable - 모든 객체를 선택 가능하게 만드는 플래그입니다 (보통 프로그래밍적으로 생성된 객체는 false로 설정되어 있습니다);
  • LogDetails - 전송된 객체의 모든 속성을 로그에 출력하는 플래그입니다;

이 지표는 붙여넣은 객체가 실제 대상 차트와 일치하는지 확인하지 않으니, 여러분이 직접 확인해야 합니다. (예: 심볼, 가격 범위, 서브 윈도우 개수 등)

다음은 두 개의 객체가 포함된 클립보드 텍스트 예시입니다:

OBJ_VLINE       H1 세로선 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 세로선 5578
6       OBJPROP_TEXT    
206     OBJPROP_TOOLTIP 
OBJ_CHANNEL     H1 동일 간격 채널 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 동일 간격 채널 40885
6       OBJPROP_TEXT    
206     OBJPROP_TOOLTIP 

그리고 차트에 붙여넣은 객체들입니다:

클립보드를 통해 차트에 붙여넣은 2개의 그래픽 객체

연관 포스트

댓글 (0)