사용자 정의 지표 파일
소스 파일 확장자 . mq5
컴파일 후 빌드된 파일 확장자 : ex5
.ex5 파일은 MT5 의 폴더 Indicators 하위 혹은 서브 폴더 (예 : Indicators\igotit) 에 있어야 MT5 에서 지표 활용가능.
사용자 정의 지표 소스코드 필수 구성요소
- 아래 코드에 사용자 정의 지표의 필수 요소만 보이고 있다.
- 사용자 지표 만들기 위한 예를 보이기 위하여 캔들의 종가 를 지표로 다루는 초간단 예를 보이고 있다.
#property indicator_chart_window // 지표표현 방식 : indicator_separate_window = 캔들챠트에 표현, indicator_chart_window = 별도창. | |
#property indicator_buffers 1 // 지표 버퍼수 | |
//#property indicator_plots 1// 설정하지 않는 경우 상기 indicator_buffers 와 동일 수량 자동 할당됨. | |
#property indicator_color1 Yellow | |
// 지표 버퍼 | |
double indi_buf_1[]; | |
int OnInit() | |
{ | |
IndicatorSetString(INDICATOR_SHORTNAME,"CyMA"); // 지표 이름 설정 | |
// 지표 인덱스별 사용하는 메모리 지정. | |
SetIndexBuffer(0, indi_buf_1);// 지표 인덱스 0 에 해당하는 버퍼 지정. | |
// plot 인덱스별 스타일 지정 . 필수 . 이것 하지 않으면 그래프 안보임. | |
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE); // plot 인덱스 0 스타일 지정. | |
return INIT_SUCCEEDED; | |
} | |
void OnDeinit(const int reason) | |
{ | |
} | |
int OnCalculate(const int rates_total, | |
const int prev_calculated, | |
const datetime &time[], | |
const double &open[], | |
const double &high[], | |
const double &low[], | |
const double &close[], | |
const long &tick_volume[], | |
const long &volume[], | |
const int &spread[]) | |
{ | |
//OnCalculate(,,) 첫 실행 시, 모든 캔들(현재 진행중인 미완성 캔들도 포함)데이터 활용. | |
if(prev_calculated == 0){ | |
for (int i = 0; i < rates_total; i++) | |
{ | |
indi_buf_1[i] = close[i]; // 종가 데이터를 지표 버퍼에 저장 | |
} | |
} | |
else if(prev_calculated > 0){ // 첫 실행 이후 실행 지점. 1 신규 완성 캔들 2.현재진행중 캔들의 틱 변경시 | |
if(rates_total > prev_calculated){ //신규 캔들완성 시점. 항상 1차이 나지만(예: rates_total=100, prev_calculated = 99) 혹시 더 큰 차이 발생 대비하여 루프로 처리함.(rates_total=100, prev_calculated = 90) | |
for (int i = prev_calculated; i < rates_total; i++) | |
{ | |
indi_buf_1[i] = close[i]; | |
} | |
} | |
else{ // 틱 가격 변동시 이것 실행됨. | |
indi_buf_1[ rates_total-1] = close[ rates_total-1];// 실시간 Tick 갱신됨. | |
} | |
} | |
//Comment(__FUNCTION__, " OnCalc rates_toal = ", rates_total, " buf size = " , ArraySize(indi_buf_1), " prev_calculated = ", prev_calculated); | |
return rates_total; // 필수. prev_calculated 는 직전 호출시 반환된 rates_total 임. | |
} |
이벤트 핸들러 함수 OnCalculate ()
앞의 코드에서 필수 작동 방식을 이해하고 있어야 하는 함수가 OnCalculate 이다.
이 함수가 실행되는 시점은 지표가 챠트에 배치되어 첫 실행될 때, 이후 캔들이 신규 갱신될 때, 현재 진행 중 캔들의 틱 변경시점에 모두 호출된다.
따라서 , 이 함수 내에서 해당 시점마다 요구되는 처리를 수행해야한다. 위 코드에서 주석에 설명되어 있음.
지표 소스 코드 컴파일 하고 MT5 에서 활용하기
위 코드를 컴파일 하면 확장자 ..ex5 가 만들어지고 이 파일을 MT5 의 폴더 (MT5 설치폴더)\MQL5\Indicators 에 배치하면 MT5 에서 불러올 수 있다.
아래 예는 바이비트 MT5 의 BTCUSDT 1분봉 챠트에 사용자 정의 지표 적용하였다. 차트에서 노란색으로 표현된 것이 사용자 정의 지표이다.

EA 에서 사용자 정의 지표 활용하기
iCustom 함수 호출하여 지표 핸들 받고, CopyBuffer 함수 호출하여 지표에서 제공하는 값을 받아 활용한다.
iCustom 인자중 3번 인자는 지표파일이름을 기록하는데 서브폴드(예 : igotit)에 있는 경우 igotit\\지표파일명 으로 기록한다.
int handle_iMACDVW;
if(handle_iMACDVW != INVALID_HANDLE) IndicatorRelease(handle_iMACDVW);
handle_iMACDVW = iCustom(
_Symbol//string symbol
, timeframe//ENUM_TIMEFRAMES period
, "igotit\\CyIND1050VWAP_1_MACD_1"// file name
, ma_fast_period//12//int fast_ema_period
, ma_slow_period//26//int slow_ema_period
, sig_ma_period//9//int signal_period
, PRICE_CLOSE//ENUM_APPLIED_PRICE applied_price
);
//지표 값 받기
double macd[];
double signal[];
if(CopyBuffer(handle_iMACDVW, 0, 1, 2, macd) < 2||
CopyBuffer(handle_iMACDVW, 1, 1, 2, signal) < 2 )
{
return -1; // 에러
}
// 지표값 활용
상위 정리
메타트레이더 5. 체계정리. 활용법/지식
MetaTrader 5 메타트레이더 5 , 메타에디터, MQL5 활용정보 체계정리. 본 글에서 주요 정리대상 정보 1. 메타트레이더 5 사용법.2. MQL5 언어 기반 "직접 코딩"하여 메타프레이더5에서 자동매매 달성
igotit.tistory.com
첫 등록 : 2025.03.23
최종 수정 :
단축 주소 : https://igotit.tistory.com/6008
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MT5 . 종목별 주문가능 최소수량 (1) | 2025.03.06 |
---|---|
OnInit, OnDeinit . EA에서 1회만 실행 위한 코드 구조 (0) | 2025.03.04 |
MQL5 . SQLite 데이터베이스 직접 지원 . 활용 코드예 (1) | 2024.10.26 |
MT5 . 주문 체결 에러 . No Prices . TRADE_RETCODE_PRICE_OFF (=10021) (3) | 2024.10.10 |
bybit MT5 통신 속도 확인 . AWS 일본 , 싱가포르 (1) | 2024.10.09 |
댓글