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

MT5 . 주문 체결 에러 . No Prices . TRADE_RETCODE_PRICE_OFF (=10021)

by i.got.it 2024. 10. 10.

 

 

 

 

No Prices 오류 발생 상황.

 

보유 포지션 청산하려고 시장가 주문 하였는데 MT5 Journal 리스트를 보면  No prices 사유로 청산되지 못하는 경우 있다.  주문을 체결해줄 호가가 없다는 의미. 청산 주문뿐만 아니라 포지션 오픈 하려는 경우에도 간혹 발생함. 

 

 

 

위와 같은 No Prices 상황을 mql5 코드에서 검출하려면  OnTradeTransaction 에서 아래처럼 코드 작성.


void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
{

    if (result.retcode != TRADE_RETCODE_DONE)
    {
        // 오류 코드를 확인하여 주문 실패 원인 분석
        if(result.retcode == TRADE_RETCODE_REJECT)
        {
            Print(__FUNCTION__, " 주문 거부됨: 심볼 ", trans.symbol, ", 주문 티켓: ", trans.order);
        }
        if(result.retcode == TRADE_RETCODE_REQUOTE)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_REQUOTE: 심볼 ", trans.symbol, ", 주문 티켓: ", trans.order);
        }        
        else if(result.retcode == TRADE_RETCODE_INVALID)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_INVALID. 심볼 ", trans.symbol, ", 주문 티켓: ", trans.order);
        }
        else if(result.retcode == TRADE_RETCODE_PLACED)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_PLACED: 심볼 ", trans.symbol, ", 주문 티켓: ", trans.order);
        }
        else if(result.retcode == TRADE_RETCODE_PRICE_OFF)// No Prices 에러 일때 발생함  
        {
             Print(__FUNCTION__, " TRADE_RETCODE_PRICE_OFF: 심볼 ", trans.symbol, ", 주문 티켓: ", trans.order);
        }
    }
    
    ...

 

 

 

No Prices 오류시 발생하는 이벤트는 TRADE_RETCODE_PRICE_OFF 

 

 

 

그런데, OnTradeTransaction 에서는 TRADE_RETCODE_PRICE_OFF 발생했음을 보여주고 있는데,  Journal 에는 No Prices 에러 없는 상황도 있었다. 

 

 

Journal 에는 상기 시간에 No Prices 에러 없음. 

 

 

 

 

OnTradeTransaction 에서 오류 검출 코드 재작성. 

- 앞의 코드에서 trans.order, trans.symbol 로는 정보 확보 안되며 아래처럼 해야 정보 확보됨. 


void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
{

    if (result.retcode != TRADE_RETCODE_DONE)
    {
        // 'request' 구조체를 사용하여 원래 주문 정보를 확인
        string symbol = request.symbol;
        ulong order_ticket = request.order;
        ulong position_ticket = request.position;// 청산 주문인 경우 청산 대상 포지션 티켓.
        string comment = request.comment; 

        
        // 오류 코드 확인. 
        if(result.retcode == TRADE_RETCODE_REJECT)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_REJECT: 심볼 ", symbol, ", 주문 티켓: ", order_ticket, ", 포지션 티켓: ", position_ticket, ", comment", comment);
        }
        if(result.retcode == TRADE_RETCODE_REQUOTE) // 주문시 설정한 deviation 범위 초과한 시세인 경우 주문 미체결되고 본 이벤트 발생.
        {
            Print(__FUNCTION__, " TRADE_RETCODE_REQUOTE: 심볼 ", symbol, ", 주문 티켓: ", order_ticket, ", 포지션 티켓: ", position_ticket, ", comment", comment);
        }        
        else if(result.retcode == TRADE_RETCODE_INVALID)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_INVALID: 심볼 ", symbol, ", 주문 티켓: ", order_ticket, ", 포지션 티켓: ", position_ticket, ", comment", comment);
        }
        else if(result.retcode == TRADE_RETCODE_PLACED)
        {
            Print(__FUNCTION__, " TRADE_RETCODE_PLACED: 심볼 ", symbol, ", 주문 티켓: ", order_ticket, ", 포지션 티켓: ", position_ticket, ", comment", comment);
        }
        else if(result.retcode == TRADE_RETCODE_PRICE_OFF)// No Prices 에러 일때 발생함  
        {
            Print(__FUNCTION__, " TRADE_RETCODE_PRICE_OFF: 심볼 ", symbol, ", 주문 티켓: ", order_ticket, ", 포지션 티켓: ", position_ticket, ", comment", comment);

        }
    }
    
    ....

 

 

 

 

위와 같이 코드 수정하면 해당 이벤트 발생시 심볼, 청산 주문인 경우 청산대상 포지션 티켓도 확보.

 

 

포지션 오픈 주문에서 본 이벤트 발생시 포지션 티켓 0으로 되어있다. 

 

 

 

연관 

 

 

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

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

igotit.tistory.com

 

 

 

 

 

 


첫 등록 : 2024.10.10

최종 수정 : 

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


 

댓글



 

비트코인




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