터미널 전역 변수 . Global Variables of the Client Terminal
- 메타트레이더 에서 실행 중인 2개 이상의 EA에서 동시 접근 가능한 전역변수 .
비교 : C/C++ 에서의 일반적인 "전역 변수"의 스코프는 1개의 EA 내부에서만 접근가능한 반면 터미널 전역 변수는 여러 EA 에서 접근 가능.
- 터미널 전역변수 자료형은 double 만 가능.
- 터미널 전역변수는 4주 동안 EA 에서 접근하지 않는 경우 메타트레이더에서 자동 삭제됨.
MQL5 에서 제공되는 터미널 전역 변수 관련 함수 전체 : https://www.mql5.com/en/docs/globals
터미널 전역변수 기본 사용법
전역변수 이름 GV_FreeMargin 으로 하여 이 변수에 값 기록하고 읽는 방법.
// 터미널 전역변수에 값 기록.
GlobalVariableSet("GV_FreeMargin", 2000.0) ; //변수 미생성이면 변수 생성하고 값 2000.0 기록됨.
// 터미널 전역변수의 값 읽기
double _value = GlobalVariableGet("GV_FreeMargin");
멀티 스레드 EA 동기화 처리
메타트레이더의 EA 는 개별적으로 작동하는 비동기 스레드 이므로 각각의 EA 는 서로 따로 작동된다. 한편, 매매로직상 여러 EA 의 실행 동기화 제어가 필요한 경우에 사용가능한 수단이 터미널 전역변수 함수 중 아래 함수 이용하여 구현 가능하다.
함수 : GlobalVariableSetOnCondition
bool GlobalVariableSetOnCondition(
string name, // Global variable name
double value, // New value for variable if condition is true
double check_value // Check value condition
);
- 현재 전역변수값이 check_value 와 동일한 경우 전역변수의 값을 value 로 갱신하고 true 반환함. 현재 전역변수값이 check_value 와 다른 경우 변수값 갱신하지 않고 false 반환.
- 이 함수는 전역변수 접근에 있어 atomic access 지원된다. 즉 여러 EA 에서 동시 다발 본 함수 호출시 1번에 1개의 EA 만 접근 가능함.
코드 예 - 1개의 EA 만 독점 실행 구간 만들기.
EA 의 OnTick() 함수 내부에 아래처럼 if 문 구현했다면, if 문 내부는 여러 EA 중 항상 1개의 EA 만 실행 가능 구간이 된다.
void OnInit()
{
GlobalVariableSet("GV_Sync",0);// GV_Sync 생성및 초기화 .
}
void OnTick()
{
if(true == GlobalVariableSetOnCondition("GV_Sync",1,0))
{
//if 문 내부는 1개의 EA 만 독점 실행 구간.
GlobalVariableSet("GV_Sync",0); //this EA 에서 독점적 할일 다했고 이제 다른 EA 에서도 실행가능하게 하는것.
}
}
코드로직 상세설명.
1. 여러 EA 중 특정 EA 에서 먼저 GlobalVariableSetOnCondition("GV_Sync",1,0) 을 호출하였다면 이 시점에 GV_Sync 값이 0인 상태이므로 check_value 인 0과 동일하다. 따라서 변수 GV_Sync 에는 1이 기록되고 함수 반환값 true 리턴되어 if 문 내부가 실행된다.
2. 상기 1에서 먼저 선점한 EA 실행중에 다른 EA 에서 GlobalVariableSetOnCondition("GV_Sync",1,0) 호출한 경우 GV_Sync 값이 1이어서 check_value 와 다른 값이라서 함수 반환값 false 리턴된다. 따라서 다른 EA 에서는 if 문 내부 실행되지 않는다.
3. 상기1의 선점한 EA 가 지 할일 다하고 if 문 마지막에 GV_Sync 값을 0으로 설정한다.
4. 상기 3 이후 다른 EA 에서 GlobalVariableSetOnCondition("GV_Sync",1,0) 호출하면 이번엔 GV_Sync 에 1이 기록되면서 true 리턴되므로 다른 EA 1개도 if 문 내부를 실행 하게 된다.
위와 같은 방식으로 멀티 스레드EA 구동 중이어도 특정 처리 구간실행을 1개의 EA 에서만 독점적 실행 가능하다.
코드예 - 모든 EA 들이 특정 구간 모두 실행완료 했는지 점검 하는 용도
본 코드예는 EA 에서 다른 모든 EA 가 특정 구간을 실행완료했는지 혹은 해당 구간 실행 중인지 점검하는 코드예이다.
앞의 코드와 달리 if 문으로 독점 실행 구간을 만드는 것이 아닌 그냥 값 설정 하는게 전부임.
void OnTick()
{
GlobalVariableSet("GV_Check", 1); // 점검구간 진입시 값을 1로 한다.
// 모든 EA 들이 이 구간 벗어났는지 점검됨.
GlobalVariableSet("GV_Check", 0); // 점검 구간 종료시 값을 0으로 한다.
// 점검
if(GlobalVariableGet("GV_Check") == 0) // 다른 EA 중 1개라도 상기 점검구간에 있다면 이 값은 1.
{
// 모든 EA 들이 상기 점검구간 실행완료된 경우에만 실행됨.
}
}
메타트레이더에서 터미널 전역변수 보는 방법.
메타트레이더에서 터미널 전역변수는 메뉴 : Tools -> Global Variables 에서 현재 생성되어 있는 전역변수와 변수에 기록되어 값 확인가능하며, 사용자가 해당 값을 수정도 가능하다.
위 메뉴에서 Global Variables 클릭하면 아래처럼 현재 메타트레이더에서 생성되어있는 Global Variables를 모두 볼 수 있다.
연관
첫 등록 : 2023.04.30
최종 수정 : 2024.10.16
단축 주소 : https://igotit.tistory.com/4351
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
메타트레이더 . 코딩 . OnTimer . 시간격 이벤트 (1) | 2023.05.04 |
---|---|
메타트레이더 . 코딩 . 시간 . MqlDateTime . 년 월 일 시 분 초 요일 (0) | 2023.05.04 |
메타트레이더 . 코딩 . 여러 EA 구동시 가용마진 확인 방법 . 터미널 전역 변수 활용 (0) | 2023.04.28 |
메타트레이더 . 다 종목 매매 전략 백테스팅 MT5 만 가능 (0) | 2023.04.02 |
메타트레이더 . 코딩 . 파일 . 클래스 CCy_File (0) | 2023.03.31 |
댓글