MT5. EA 종료 흐름 . IsStopped() , OnDeinit()

EA 종료 흐름
MQL5에서 EA 종료 시 발생하는 순서.
- 사용자가 EA 제거 버튼 클릭 / ExpertRemove() 호출 / 터미널 종료 등 EA 종료 요청 발생
- EA 내부에서 IsStopped()가 true를 반환
- OnTick(), 타이머 이벤트, 루프 등 EA 코드가 실행되는 중이면, 이 시점에서 IsStopped() 체크 가능
- EA가 완전히 종료되기 직전에 OnDeinit(const int reason) 이벤트 호출
- EA가 메모리에서 제거
핵심 포인트
- IsStopped()는 OnDeinit보다 “조금 더 먼저” 상태를 알 수 있음
- 즉, EA 종료 요청이 발생했지만 아직 OnDeinit 이벤트가 호출되기 전, EA 코드 내에서 종료 여부를 감지할 수 있음
- 루프나 반복 작업에서 체크하면, EA가 종료되기 전에 정리 작업이나 안전한 종료 처리가 가능
- OnDeinit는 EA가 완전히 종료 직전에 호출되는 콜백이므로,
이때는 이미 EA의 IsStopped() 상태가 true임
예제: 루프 내 안전한 종료 처리
void OnTick()
{
for(int i=0; i<1000000; i++)
{
// EA 종료 요청 감지
if(IsStopped())
{
Print("EA 종료 요청 감지, 루프 종료");
break;
}
// 반복 작업 수행
Sleep(1);
}
}
- 위처럼 루프 중간에 IsStopped() 체크하면,
사용자가 EA 제거 버튼을 누르거나 ExpertRemove 호출 시 즉시 루프 종료 가능
결론:
- EA 종료 요청 → IsStopped() true → EA 코드에서 종료 처리 가능
- OnDeinit는 EA 제거 직전에 호출되므로, 종료 요청 확인용으로는 IsStopped()로 먼저 알 수 있음
IsStopped() 시점과 OnDeinit() 시점 차이
| 항목 | IsStopped() | OnDeinit() |
| 호출 시점 | EA 코드가 실행 중일 때, EA 종료 요청 직후 | EA 종료 직전, EA 코드 실행 종료 직후 |
| 호출 조건 | EA 제거 버튼 / ExpertRemove() / 터미널 종료 | EA 제거 직전 |
| 반복 체크 가능 | 가능 (루프, 타이머 등) | 불가능 (자동 호출) |
| 메모리 접근 | EA 코드 실행 중이므로, 동적 할당/포인터 접근 가능 | 동일 |
IsStopped 시점에 ea 에서의 메모리 해제등 처리해도 됨.
ExpertRemove() ; EA 코드 내에서 EA 중단하는 함수
ExpertRemove();// EA 제거
주의 : ExpertRemove() 로 제거하면 OnDeinit 의 reason 이 REASON_REMOVE 가 아니고 REASON_PROGRAM 으로 들어옴.
연관
OnInit, OnDeinit . EA에서 1회만 실행 위한 코드 구조
개요 - 메타트레이더 EA의 필수 이벤트 핸들러 함수인 OnInit, OnDeinit 이 실행되는 시점은 EA 로딩 , 언로딩 시점 외에도 입력 파라미터 변경, 챠트의 타임프레임 변경 시 등에서도 여러 번 실행
igotit.tistory.com
첫 등록 : 2025.11.01
최종 수정 :
단축 주소 : https://igotit.tistory.com/6304
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
| MT5 . 여러 종목 과거 캔들 DB 저장. SQLite (0) | 2025.11.25 |
|---|---|
| MT5 . 전용 VPS 설정 방법 (1) | 2025.07.26 |
| MQL5 . 연속 시장 암호화폐 주문 불가능 시간 주의 (0) | 2025.04.08 |
| MQL5 . 사용자 정의 지표 만들기 (0) | 2025.03.24 |
| MT5 . 종목별 주문가능 최소수량 (5) | 2025.03.06 |
댓글