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

메타트레이더 . 코딩 . 터미널 전역변수 . 멀티스레드 EA 동기화 처리

by i.got.it 2023. 4. 30.

 

 

 

 

터미널 전역 변수 . Global Variables of the Client Terminal 

 

- 메타트레이더 에서 실행 중인 2개 이상의 EA에서  동시 접근 가능한 전역변수 .

비교 : C/C++ 에서의 일반적인 "전역 변수"의 스코프는 1개의 EA 내부에서만 접근가능한 반면 터미널 전역 변수는 여러 EA 에서 접근 가능. 

 

- 터미널 전역변수는 스레드 세이프함.   메타트레이더의 EA 각각은 개별적으로 작동하는 비동기 스레드이며 여러 EA 에서 터미널 전역변수에 비동기 접근 하더래도 1번에 1개의 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를 모두 볼 수 있다. 

 

 

 

 

 

연관

 

 

 

메타트레이더 . 코딩 . 여러 EA 구동시 가용마진 확인 방법 . 터미널 전역 변수 활용

개요 - 문제 상황 메타트레이더에서 여러 EA를 동시에 구동하면서 각 EA에서 주문하기 전에 주문 가능한 가용 마진(Free Margin) 확인하면서 주문 실행 해야 하는 경우가 있다. 1개의 EA 만 실행될 때

igotit.tistory.com

 

 

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

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

igotit.tistory.com

 

 

 

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

MetaTrader 4 메타트레이더 4 활용정보 체계정리. - 글로벌 트레이딩 소프트웨어. - 지속 발전 가능한 안정된 시스템. - 직접 코딩 가능한 MQL4 언어. C 언어 유사 - - MQL4 에서도 클래스 사용가능하므로

igotit.tistory.com

 

 

 


첫 등록 : 2023.04.30

최종 수정 : 

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


 

 

 

 

댓글



 

비트코인




암호화폐       외환/나스닥/골드       암호화폐/외환/나스닥/골드 암호화폐/외환/나스닥/골드   암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)     롤오버 이자 없는 스왑프리계좌
( 스왑프리 암호화폐도 거래 가능 )    
MT4, MT5 , cTrader 모두 지원     FTMO 계좌 매매운용. MT4,MT5