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으로 되어있다.
연관
첫 등록 : 2024.10.10
최종 수정 :
단축 주소 : https://igotit.tistory.com/5859
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MQL5 . SQLite 데이터베이스 직접 지원 . 활용 코드예 (1) | 2024.10.26 |
---|---|
bybit MT5 통신 속도 확인 . AWS 일본 , 싱가포르 (1) | 2024.10.09 |
MQL5. 외부 프로그램으로 실시간 데이터 송신 . SendMessage, PostMessage, WM_COPYDATA (0) | 2024.09.06 |
메타트레이더 5 . ONNX 모델 직접 지원 . (0) | 2024.08.29 |
MQL5 . 메타 시간을 UTC 로 변환하기 . 일광절약 시간제 (DST) 고려 (0) | 2024.08.28 |
댓글