146 lines
6.4 KiB
MQL5
146 lines
6.4 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| TradeRetcode.mqh |
|
|
//| Copyright 2022, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| All TRADE_RETCODEs in MQL5. "TRADE_RETCODE_" prefixes are |
|
|
//| removed to eliminate name collisions with built-in constants. |
|
|
//+------------------------------------------------------------------+
|
|
enum TRADE_RETCODE
|
|
{
|
|
OK_0 = 0,
|
|
REQUOTE = 10004,
|
|
REJECT = 10006,
|
|
CANCEL = 10007,
|
|
PLACED = 10008,
|
|
DONE = 10009,
|
|
DONE_PARTIAL = 10010,
|
|
ERROR = 10011,
|
|
TIMEOUT = 10012,
|
|
INVALID = 10013,
|
|
INVALID_VOLUME = 10014,
|
|
INVALID_PRICE = 10015,
|
|
INVALID_STOPS = 10016,
|
|
TRADE_DISABLED = 10017,
|
|
MARKET_CLOSED = 10018,
|
|
NO_MONEY = 10019,
|
|
PRICE_CHANGED = 10020,
|
|
PRICE_OFF = 10021,
|
|
INVALID_EXPIRATION = 10022,
|
|
ORDER_CHANGED = 10023,
|
|
TOO_MANY_REQUESTS = 10024,
|
|
NO_CHANGES = 10025,
|
|
SERVER_DISABLES_AT = 10026,
|
|
CLIENT_DISABLES_AT = 10027,
|
|
LOCKED = 10028,
|
|
FROZEN = 10029,
|
|
INVALID_FILL = 10030,
|
|
CONNECTION = 10031,
|
|
ONLY_REAL = 10032,
|
|
LIMIT_ORDERS = 10033,
|
|
LIMIT_VOLUME = 10034,
|
|
INVALID_ORDER = 10035,
|
|
POSITION_CLOSED = 10036,
|
|
INVALID_CLOSE_VOLUME = 10038,
|
|
CLOSE_ORDER_EXIST = 10039,
|
|
LIMIT_POSITIONS = 10040,
|
|
REJECT_CANCEL = 10041,
|
|
LONG_ONLY = 10042,
|
|
SHORT_ONLY = 10043,
|
|
CLOSE_ONLY = 10044,
|
|
FIFO_CLOSE = 10045,
|
|
HEDGE_PROHIBITED = 10046,
|
|
};
|
|
|
|
#define TRCSTR(X) EnumToString((TRADE_RETCODE)(X))
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Simplified classification of retcodes, |
|
|
//| for more finegrained classification see severity groups below |
|
|
//+------------------------------------------------------------------+
|
|
#define IS_SERVICABLE(T) ((T) < TRADE_RETCODE_ERROR)
|
|
#define IS_TANGIBLE(T) ((T) >= TRADE_RETCODE_ERROR)
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Groups of retcodes by severity (from low to high) |
|
|
//| SEVERITY_INVALID and above require an intervention (user/program)|
|
|
//+------------------------------------------------------------------+
|
|
enum TRADE_RETCODE_SEVERITY
|
|
{
|
|
SEVERITY_UNDEFINED, // skip, output to log
|
|
SEVERITY_NORMAL, // keep normal operation
|
|
SEVERITY_RETRY, // retry (probably several times) on updated environment
|
|
SEVERITY_TRY_LATER, // wait a bit more and retry
|
|
SEVERITY_REJECT, // request is not processed, probably keep trying
|
|
//
|
|
SEVERITY_INVALID, // change input data and retry
|
|
SEVERITY_LIMITS, // check limits and adjust request
|
|
SEVERITY_PERMISSIONS, // notify user or adapt algorithm to settings
|
|
SEVERITY_ERROR, // output info to user or log
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Detect severity of a given retcode |
|
|
//| to make a decision on further actions |
|
|
//+------------------------------------------------------------------+
|
|
TRADE_RETCODE_SEVERITY TradeCodeSeverity(const uint retcode)
|
|
{
|
|
static const TRADE_RETCODE_SEVERITY severities[] =
|
|
{
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_RETRY, // REQUOTE (10004)
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_REJECT, // REJECT (10006)
|
|
SEVERITY_NORMAL, // CANCEL (10007)
|
|
SEVERITY_NORMAL, // PLACED (10008)
|
|
SEVERITY_NORMAL, // DONE (10009)
|
|
SEVERITY_NORMAL, // DONE_PARTIAL (10010)
|
|
SEVERITY_ERROR, // ERROR (10011)
|
|
SEVERITY_RETRY, // TIMEOUT (10012)
|
|
SEVERITY_INVALID, // INVALID (10013)
|
|
SEVERITY_INVALID, // INVALID_VOLUME (10014)
|
|
SEVERITY_INVALID, // INVALID_PRICE (10015)
|
|
SEVERITY_INVALID, // INVALID_STOPS (10016)
|
|
SEVERITY_PERMISSIONS, // TRADE_DISABLED (10017)
|
|
SEVERITY_TRY_LATER, // MARKET_CLOSED (10018)
|
|
SEVERITY_LIMITS, // NO_MONEY (10019)
|
|
SEVERITY_RETRY, // PRICE_CHANGED (10020) ~ REQUOTE
|
|
SEVERITY_RETRY, // PRICE_OFF (10021) ~ REQUOTE
|
|
SEVERITY_INVALID, // INVALID_EXPIRATION (10022)
|
|
SEVERITY_INVALID, // ORDER_CHANGED (10023)
|
|
SEVERITY_LIMITS, // TOO_MANY_REQUESTS (10024)
|
|
SEVERITY_NORMAL, // NO_CHANGES (10025)
|
|
SEVERITY_PERMISSIONS, // SERVER_DISABLES_AT (10026)
|
|
SEVERITY_PERMISSIONS, // CLIENT_DISABLES_AT (10027)
|
|
SEVERITY_TRY_LATER, // LOCKED (10028)
|
|
SEVERITY_TRY_LATER, // FROZEN (10029)
|
|
SEVERITY_INVALID, // INVALID_FILL (10030)
|
|
SEVERITY_TRY_LATER, // CONNECTION (10031)
|
|
SEVERITY_PERMISSIONS, // ONLY_REAL (10032)
|
|
SEVERITY_LIMITS, // LIMIT_ORDERS (10033)
|
|
SEVERITY_LIMITS, // LIMIT_VOLUME (10034)
|
|
SEVERITY_INVALID, // INVALID_ORDER (10035)
|
|
SEVERITY_NORMAL, // POSITION_CLOSED (10036)
|
|
SEVERITY_UNDEFINED,
|
|
SEVERITY_INVALID, // INVALID_CLOSE_VOLUME (10038)
|
|
SEVERITY_NORMAL, // CLOSE_ORDER_EXIST (10039)
|
|
SEVERITY_LIMITS, // LIMIT_POSITIONS (10040)
|
|
SEVERITY_REJECT, // REJECT_CANCEL (10041)
|
|
SEVERITY_PERMISSIONS, // LONG_ONLY (10042)
|
|
SEVERITY_PERMISSIONS, // SHORT_ONLY (10043)
|
|
SEVERITY_PERMISSIONS, // CLOSE_ONLY (10044)
|
|
SEVERITY_PERMISSIONS, // FIFO_CLOSE (10045)
|
|
SEVERITY_PERMISSIONS, // HEDGE_PROHIBITED (10046)
|
|
};
|
|
|
|
if(retcode == 0) return SEVERITY_NORMAL;
|
|
if(retcode < 10000 || retcode > HEDGE_PROHIBITED) return SEVERITY_UNDEFINED;
|
|
return severities[retcode - 10000];
|
|
};
|
|
//+------------------------------------------------------------------+
|