여러분, 차트 간에 그래픽 객체를 복사하고 붙여넣어야 할 때가 있었나요? 저도 그런 경험이 많아요. 그런데 아시다시피, MetaTrader는 객체를 위한 '복사 & 붙여넣기' 기능을 제공하지 않습니다. 비슷한 효과를 낼 수 있는 방법은 템플릿(tpl 파일)인데, 템플릿은 지표, 설정, 여러 보조 요소까지 포함된 전체 차트 상태를 저장하기 때문에 필요한 복제 작업에 비해 너무 과합니다.
그래서 제가 ChartObjectsCopyPaste.mq5라는 지표를 개발했습니다. 이 지표는 선택된 객체를 클립보드로 복사하고, 다른 차트에 붙여넣을 수 있게 해줍니다. 정말 간단하죠!
이 지표는 알고리즘 트레이딩 책에 게재된 ObjectGroupEdit.mq5라는 지표를 기반으로 하고 있습니다. 자세한 내용은 링크를 통해 확인해 보세요.
이 지표는 버퍼가 필요하지 않습니다. 최소한 두 개의 차트에 부착해야 합니다: 하나는 복사할 객체가 있는 원본 차트, 다른 하나는 붙여넣을 대상 차트입니다.
차트에서 실행되는 동안, 이 지표는 기존 그래픽 객체를 추적하고 선택된 객체에 대한 메모를 남깁니다.
보통 '복사 & 붙여넣기' 명령은 쌍으로 작동합니다:
- Ctrl+Q 단축키를 눌러 선택한 모든 객체를 텍스트 형식으로 Windows 클립보드에 복사합니다 (텍스트 편집기에서 저장하고 확인할 수 있습니다).
- 대상 차트에서 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 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_STRING<:number>5 OBJPROP_NAME H1 세로선 55786 OBJPROP_TEXT 206 OBJPROP_TOOLTIPOBJ_CHANNEL H1 동일 간격 채널 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 동일 간격 채널 408856 OBJPROP_TEXT 206 OBJPROP_TOOLTIP
그리고 차트에 붙여넣은 객체들입니다:


댓글 0