본문 바로가기
트레이딩/메타트레이더 코딩

OnInit, OnDeinit . EA에서 1회만 실행 위한 코드 구조

by i.got.it 2025. 3. 4.

 

개요  

- 메타트레이더 EA의  필수 이벤트 핸들러 함수인 OnInit, OnDeinit 이 실행되는  시점은 EA 로딩 , 언로딩 시점 외에도 입력 파라미터 변경, 챠트의 타임프레임 변경 시 등에서도 여러 번 실행되기 때문에 EA 실행 이후 1회만 실행되어야 하는 것들 실행 위한 코드 작성법.  

 

 

아래 코드는 가장 기본적인 OnInit, OnDeinit 함수 형태이다. 

int OnInit()
{


    return INIT_SUCCEEDED; 
}

void OnDeinit(const int reason)
{

}

 

 

 

OnInit, OnDeinit 에서 EA 실행 이후 1회만 실행 위한 코드 구조 

- 요점 

OnDeinit 실행될때마다 인자로 전달되는 OnDeinit 사유를 전역 변수 REASON_USING_IN_ONINIT (초기화는 -1로 했음) 라는 변수에 받게 하고 OnInit 실행 시 이 변수값을 참조하여 EA 실행 이후 첫 실행되는 OnInit 시점에서 처리할 사항, 사용자 입력이 변경된 경우 처리할 사항 등을 분리 처리 하도록 한다. 

EA 실행이후 첫 실행되는 OnInit에서 주로 이뤄지는 처리는 클래스 인스턴스 동적 생성류이다.

동적 생성한 것들을 제거하는 것은 OnDeinit 의  OnlyOnceExec_OnDeinit();  에서 이뤄지게 한다. 



// OnDeinit 에서 REASON 값을 받아서 OnInit 에서 확인하기 위한 변수. 
// 이 변수값은 ea 초기 실행시점에만 -1이므로 OnInit 내에서 1회 실행만 원하는 경우에도 활용가능. 
int REASON_USING_IN_ONINIT = -1; 

int OnInit()
{
    if(REASON_USING_IN_ONINIT == -1) // EA 실행되고 첫 실행되는 OnInit()인 경우 
    {
        OnlyOnceExec_OnInit(); 
    }
    else if(REASON_USING_IN_ONINIT == REASON_PARAMETERS) // 사용자가 파라메타 수정한 경우 
    {
        Proc_Parameter_OnInit();
    }

    return INIT_SUCCEEDED; 
}

void OnDeinit(const int reason)
{
    REASON_USING_IN_ONINIT = reason; 

    // reason 값이 REASON_CHARTCLOSE (차트 닫힘) / REASON_REMOVE (EA 제거)일 때 / MT5종료 인 경우에 실행할것들. 예. 클래스 인스턴스 동적 생성한것 삭제
    if(reason == REASON_CHARTCLOSE || reason == REASON_REMOVE || reason == REASON_CLOSE)
    {
        OnlyOnceExec_OnDeinit(); 
    }

}

 

 

위 코드 의 앞부분에 , 클래스 동적 생성, 제거하는 예 들 구현된 EA 코드 패턴 예.

 

 

////////// 파일들. 주로 클래스 정의들.
#include "../CySDK_MQL5/CCy_SIG_TrendFilter_1.mqh"
////////// 사용자 입력.
input ulong ui_magic_number = 9601;//Magic Number
/// 입력값들 수정전값 받아두는것.
ulong ui_magic_number_prev = ui_magic_number;
////////// 클래스 들 .대부분 동적 생성함.
CCy_SIG_TrendFilter * pTrendFilter = NULL;
void Create_TrendFilter()
{
Delete_TrendFilter();
pTrendFilter = new CCy_SIG_TrendFilter();
}
void Delete_TrendFilter()
{
if(pTrendFilter != NULL) { delete pTrendFilter ; pTrendFilter = NULL; }
}
void OnlyOnceExec_OnInit()
{
Create_TrendFilter();
}
void OnlyOnceExec_OnDeinit()
{
Delete_TrendFilter();
}
void Proc_Parameter_OnInit()
{
if(ui_magic_number != ui_magic_number_prev){
ui_magic_number_prev = ui_magic_number;
}
}
// OnDeinit 에서 REASON 값을 받아서 OnInit 에서 확인하기 위한 변수.
// 이 변수값은 ea 초기 실행시점에만 -1이므로 OnInit 내에서 1회 실행만 원하는 경우에도 활용가능.
int REASON_USING_IN_ONINIT = -1;
int OnInit()
{
if(REASON_USING_IN_ONINIT == -1) // EA 실행되고 첫 실행되는 OnInit()인 경우
{
OnlyOnceExec_OnInit();
}
else if(REASON_USING_IN_ONINIT == REASON_PARAMETERS) // 사용자가 파라메타 수정한 경우
{
Proc_Parameter_OnInit();
}
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
REASON_USING_IN_ONINIT = reason;
// reason 값이 REASON_CHARTCLOSE (차트 닫힘) / REASON_REMOVE (EA 제거)일 때 / MT5종료 인 경우에 실행할것들. 예. 클래스 인스턴스 동적 생성한것 삭제
if(reason == REASON_CHARTCLOSE || reason == REASON_REMOVE || reason == REASON_CLOSE)
{
OnlyOnceExec_OnDeinit();
}
}
//////////////////////////////////////////////////////////////////////////////////////
void OnTick()
{
}
view raw gistfile1.txt hosted with ❤ by GitHub

 

 

 

 

연관

 

 

 

메타트레이더 5. 체계정리. 활용법/지식

MetaTrader 5  메타트레이더 5 , 메타에디터, MQL5 활용정보 체계정리. 본 글에서 주요 정리대상 정보  1. 메타트레이더 5 사용법.2. MQL5 언어 기반 "직접 코딩"하여 메타프레이더5에서 자동매매 달성

igotit.tistory.com

 

 

 

 

 

시스템 트레이딩. System Trading.

System Trading  자동매매 시스템 구현/운용 위한 실전 정보.자동매매뿐만 아니라 손매매시에도 유용한 정보.증권사 API 기반 자동매매 시스템 개발 . - API 활용 방법 정리.상용툴 S/W 기반 자동매매

igotit.tistory.com

 

 

 

 

 


첫 등록 : 2025.03.04

최종 수정 : 

단축 주소 : https://igotit.tistory.com/5995


 



비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5