개요
- 본 글에서는 메타트레이더4 에서 진입 주문 체결된 주문(= 포지션) 정보를 EA 에서 검색 하는 방법 및 코드 정리.
- 메타 트레이더의 탭 "Trade" (아래 붉은 박스) 에는 아직 진입 되지 않은 지정가 주문들과 주문 체결되어 있으면서 미청산 상태인 주문(즉 포지션)들의 리스트가 보인다. Balance 라인 ( 아래 그림 녹색박스) 기준으로 아래 부분은 진입되지 않은 지정가 주문들 , Balance 라인 위쪽으로는 진입되어 있는 미청산 주문들이 리스팅된다.
- - 참고 : 탭 "Account History" (아래 파란박스)에는 청산 주문들 및 입 / 출금 내역, 수수료 정보들이 보인다. 이미 청산된 주문 정보만 보여주므로 매매중 관리대상은 아니고 매매 결과 검토 하는 경우에만 필요.
- 진입 주문 체결된 것들 (포지션)은 아래처럼 Balance 라인 윗부분에 보인다.
주문 검색 코드 기본 골격 이해
- MT4 에서 주문 검색 하는 코드 골격은 항상 아래 코드와 같은 구조를 가진다.
void Search_Orders()
{
int num_orders = OrdersTotal(); //
for(int idx_order = 0; idx_order < num_orders ; idx_order++)
{
if( false == OrderSelect(idx_order,SELECT_BY_POS,MODE_TRADES))
{
Print("OrderSelect returned the error of ",GetLastError()); // 에러 출력.
continue; // 아래 실행하지 않고 계속 루프 진행.
}
// 이지점 이후는 OrderSelect() 성공한 경우에만 실행.
}
}
- 단계1. 가장 먼저 OrdersTotal() 호출하여 현재 실행중인 MT4 의 모든 주문 건수 받는다. 이 수량은 앞의 그림에서 탭 Trade 에 보이는 모든 주문 건수를 보여준다. 즉 모든 심볼의 체결된 것 미체결된것 모든 수량을 받을 수 있다.
- 단계2. for 루프에서 모든 주문 건수 별로 루프 돌면서 함수 OrderSelect (idx_order,SELECT_BY_POS,MODE_TRADES) 호출하여 주문 1개 단위로 주문 정보 받기 한다. OrderSelect 호출하고 나면 MT4 내부 변수에 자동으로 각 주문에 대한 정보들이 저장된 상태가 되며 이 정보들을 코드에서 확보하기 위한 함수들은 아래와 같다.
OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType()
위 함수들 중에 필요한 정보 선택하여 활용하면 된다.
예를들어 상기 주문 검색 함수는 모든 심볼에 대한 주문 검색하는 루틴인데, 특정 심볼 1개에 대해서만 주문 검색 하고 싶다면 아래와 같은 코드 구성가능하다.
함수인자로 심볼명을 기록할 수 있게 하고 OrderSelect 이후에 OrderSymbol() 호출하여 심볼명 받고 이것이 인자에서 지정된 심볼이 아니면 무처리 스킵하게 했다.
void Search_Orders(string _filter_str_symbol)
{
int num_orders = OrdersTotal(); //
for(int idx_order = 0; idx_order < num_orders ; idx_order++)
{
if( false == OrderSelect(idx_order,SELECT_BY_POS,MODE_TRADES))
{
Print("OrderSelect returned the error of ",GetLastError()); // 에러 출력.
continue; // 아래 실행하지 않고 계속 루프 진행.
}
// 이지점 이후는 OrderSelect() 성공한 경우에만 실행.
if(_filter_str_symbol != OrderSymbol()) continue; // 인자로 지정된 심볼이 아니면 아래 실행 안되게 한것.
// 이 지점 이후는 인자에서 지정한 심볼인 경우에만 실행됨.
}
}
- 심볼명 에 추가로 조건들이 필요하면 추가하면 된다. 아래 코드 예는 지정 심볼 이면서 동시에 지정 magic number 인 것만 검색하는 예이다.
void Search_Orders(string _filter_str_symbol, int _filter_magic_number)
{
int num_orders = OrdersTotal(); //
for(int idx_order = 0; idx_order < num_orders ; idx_order++)
{
if( false == OrderSelect(idx_order,SELECT_BY_POS,MODE_TRADES))
{
Print("OrderSelect returned the error of ",GetLastError()); // 에러 출력.
continue; // 아래 실행하지 않고 계속 루프 진행.
}
// 이지점 이후는 OrderSelect() 성공한 경우에만 실행.
if(_filter_str_symbol != OrderSymbol()) continue; // 인자로 지정된 심볼이 아니면 아래 실행 안되게 한것.
if(_filter_magic_number != OrderMagicNumber()) continue; // 지정된 magic number 인것만 검출.
}
}
Order Ticket 인 것의 주문 정보들 받기.
- Order Ticket 은 각각의 주문별로 자동으로 할당된 고유 아이디 이므로 ticket 1개에 해당하는 주문은 1개만 가능하다. 따라서, 루프 돌리면서 검색할 필요없이 OrderSelect 호출하면서 2번인자에는 SELECT_BY_TICKET , 1번 인자에는 ticket 기록하여 호출하면 해당 1개의 주문 정보만 선택된다.
int Get_OrderInfo(int _filter_order_ticket)
{
if( false == OrderSelect(_filter_order_ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("OrderSelect returned the error of ",GetLastError()); // 에러 출력.
return 0;
}
// 이 지점 이후 선택된 1개 주문의 세부 정보 활용. OrderOpenPrice(),OrderStopLoss(),...등.
return 1;
}
포지션 검색 코드
- MT4 에서는 포지션 만을 핸들링 하는 별도의 개체가 있지 않고, 주문의 OrderType 으로 판단하게 된다.
- 주문의 OrderType 이 OP_BUY 라면 매수 체결된 주문(= Long Position)을 의미하고, OP_SELL 이라면 매도 체결된 주문을(= Short Position) 의미한다.
- 아래 코드는 앞의 코드에 추가로 Long Position , Short Position 인 것들만 선택하여 처리하는 필터 추가된 코드이다.
void Search_Orders(string _filter_str_symbol)
{
int num_orders = OrdersTotal(); //
int ordertype_selected;
for(int idx_order = 0; idx_order < num_orders ; idx_order++)
{
if( false == OrderSelect(idx_order,SELECT_BY_POS,MODE_TRADES))
{
Print("OrderSelect returned the error of ",GetLastError()); // 에러 출력.
continue; // 아래 실행하지 않고 계속 루프 진행.
}
// 이지점 이후는 OrderSelect() 성공한 경우에만 실행.
if(_filter_str_symbol != OrderSymbol()) continue; // 인자로 지정된 심볼이 아니면 아래 실행 안되게 한것.
// 이 지점 이후는 인자에서 지정한 심볼인 경우에만 실행됨.
ordertype_selected = OrderType();
if(OP_BUY == ordertype_selected){ // Buy 체결된것 = Long Position.
Print("Long Position found. ticket = " , OrderTicket());
}
else if(OP_BUY == ordertype_selected) { // Sell 체결된것 = Short Position
Print("Short Position found. ticket = " , OrderTicket());
}
}
}
연관
MT5 에서는 기본 제공되는 포지션 클래스이용하여 검색 한다.
상위정리
첫 등록 : 2023.03.01
최종 수정 : 2023.03.06
단축 주소 : https://igotit.tistory.com/4274
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
메타트레이더 . 코딩 . 클래스 만들기 (0) | 2023.03.20 |
---|---|
메타트레이더 4 . 챠트 . 오류 SL, TP 가격 차이 표현 단위 Pips (0) | 2023.03.14 |
메타 트레이더 . 주문 가격 규격화 Digits 으로는 불완전. 해결책. (0) | 2023.03.05 |
메타 트레이더 . 주문 종류 . stop limit pending (0) | 2023.02.16 |
메타 트레이더 . 주문 에러. Trade is disabled . 나스닥 거래 (0) | 2023.02.14 |
댓글