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

메타 트레이더4 . MQL4 . 주문 (포지션) 검색 코드

by i.got.it 2023. 3. 6.

 

개요 

- 본 글에서는 메타트레이더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 에서는 기본 제공되는 포지션 클래스이용하여 검색 한다.  

 

MQL5. 포지션 함수, 클래스 활용코드 . 심볼1개의 모든 포지션등.

1. 계정의 모든 심볼의 모든 포지션 정보들 확보하기. #include CPositionInfo m_PosiInfo; int Proc_SupplyPosition() { int num_position_all_symbol = PositionsTotal(); // 계좌의 모든 포지션 수량 반환됨. for(int idx_posi = 0 ; idx

igotit.tistory.com

 

 

상위정리

 

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

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

igotit.tistory.com

 

 

 

 


첫 등록 : 2023.03.01

최종 수정 : 2023.03.06

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


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5