개요 - 문제 상황
메타트레이더에서 여러 EA를 동시에 구동하면서 각 EA에서 주문하기 전에 주문 가능한 가용 마진(Free Margin) 확인하면서 주문 실행 해야 하는 경우가 있다.
1개의 EA 만 실행될 때는 코드에서 Free Margin 요청하여 현재 주문 하려는 수량이 주문 접수 가능한지 점검가능하면 된다.
그러나, 2개 이상의 EA 가 실행되는 경우에는 각각의 EA 에서 서버 측으로 Free Margin 정보 요청하는 방식으로는 필연 오류 발생한다. Free Margin 값은 주문이 완료되어 포지션 오픈 된 이후에 포지션 오픈 되고 남은 잔량이 표시되기 때문에, 아래와 같은 상황에서는 문제 발생함.
상황예.
2개의 EA 1, 2 에서 주문 송신 전 단계에서 아래처럼 Free Margin 확인하였고,
EA 1 에서 Free Margin 확인하고 EA 1 에서의 주문 실행 가능하다고 판단하였고,
EA 2 에서도 Free Margin 확인하고 주문 위한 마진 있음 확인하고 주문 실행 가능하다고 판단,
위 상황에서 EA1 이 먼저 주문 송신하여 Free Margin 을 사용해 버려 , EA 2에서 주문 송신한 경우 Free Margin 부족으로 주문 거부되는 상황이 발생할 수 있다. EA 2에서 종목 1개만 매매하는 경우에는 큰 문제 일으키지 않지만 동시 2개 이상 종목 동시 체결되어야 하는 상황이라면 2개 종목 중 1개만 포지션 오픈 된다든지 하는 오류 발생한다.
해결책 - 터미널 전역변수 활용
메타트레이더 함수로 확보가능한 Free Margin 요청 한 정보 만으로는 상기 문제점을 해결 하지 못한다.
여러 EA 들에서 공유 가능한 "터미널 전역변수" 활용하여 별도로 관리되는 Free Margin 변수가 필요하다.
아래처럼 코드 로직 구현되어야 한다.
터미널 전역변수 변수명을 GV_FreeMargin 이라고 하자.
GV_FreeMargin 변수에는 EA 1에서 주문하기 전에 현재 Free Margin에서 자신이 사용하게 될 마진을 차감한 금액을 주문 송신전 먼저 기록해 둔다. 이렇게 미리 기록해 두면 EA1 이 주문 송신하기 전이라도 다른 EA 2에서 주문 전에 GV_FreeMargin을 확인하여 마진잔고 부족하면 자신의 주문은 실행하지 않도록 한다. 마진 잔고 남아있다면 EA 2도 자신이 포지션 오픈에 사용하게 될 마진 차감한 것을 GV_FreeMargin에 갱신해 두고 이후 주문 실행한다.
mql5 에서 터미널 전역변수 관련 함수 전체 : https://www.mql5.com/en/docs/globals
참고.
메타트레이더에서 터미널 전역변수는 메뉴 : Tools -> Global Variables 에서 현재 어떤 값이 기록되어 있는지 확인가능하다.
위 메뉴에서 Global Variables 클릭하면 아래처럼 현재 메타트레이더에서 생성되어있는 Global Variables를 모두 볼 수 있다.
연관
첫 등록 : 2023.04.28
최종 수정 :
단축 주소 : https://igotit.tistory.com/4350
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
메타트레이더 . 코딩 . 시간 . MqlDateTime . 년 월 일 시 분 초 요일 (0) | 2023.05.04 |
---|---|
메타트레이더 . 코딩 . 터미널 전역변수 . 멀티스레드 EA 동기화 처리 (0) | 2023.04.30 |
메타트레이더 . 다 종목 매매 전략 백테스팅 MT5 만 가능 (0) | 2023.04.02 |
메타트레이더 . 코딩 . 파일 . 클래스 CCy_File (0) | 2023.03.31 |
메타트레이더 . 코딩 . 거래 수수료 . 클래스 CCy_Commission (0) | 2023.03.22 |
댓글