//+------------------------------------------------------------------+ //| ErrDescription.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372 | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372" #property strict #ifndef MQLARTICLES_UTILS_ERRDESCRIPTION_MQH #define MQLARTICLES_UTILS_ERRDESCRIPTION_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #define MQLARTICLES_FIRST_RUNTIME_ERROR ERR_SUCCESS #define MQLARTICLES_LAST_RUNTIME_ERROR ERR_ONNX_WRONG_DIMENSION #define MQLARTICLES_FIRST_TRADE_SERVER_ERROR TRADE_RETCODE_REQUOTE #define MQLARTICLES_LAST_TRADE_SERVER_ERROR TRADE_RETCODE_HEDGE_PROHIBITED //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CMt5ErrorDesc { public: CMt5ErrorDesc(void) {} ~CMt5ErrorDesc(void) {} //--- static string TradeServerReturnCodeDescription(int return_code); static string ErrorDescription(int error_code); //--- static __forceinline bool IsSuccess(int return_code = -1); static __forceinline bool IsTradeServerError(int return_code = -1); static __forceinline bool IsRuntimeError(int return_code = -1); static __forceinline bool IsUserError(int return_code = -1); static void GetError(string& error_desc, int error_code = -1, bool include_code = true); }; //+------------------------------------------------------------------+ //| Gets the Trade Server Return Code Description | //+------------------------------------------------------------------+ static string CMt5ErrorDesc::TradeServerReturnCodeDescription(int return_code) { switch(return_code) { // --- case TRADE_RETCODE_REQUOTE: return("Requote"); case TRADE_RETCODE_REJECT: return("Request rejected"); case TRADE_RETCODE_CANCEL: return("Request canceled by trader"); case TRADE_RETCODE_PLACED: return("Order placed"); case TRADE_RETCODE_DONE: return("Request completed"); case TRADE_RETCODE_DONE_PARTIAL: return("Only part of the request was completed"); case TRADE_RETCODE_ERROR: return("Request processing error"); case TRADE_RETCODE_TIMEOUT: return("Request canceled by timeout"); case TRADE_RETCODE_INVALID: return("Invalid request"); case TRADE_RETCODE_INVALID_VOLUME: return("Invalid volume in the request"); case TRADE_RETCODE_INVALID_PRICE: return("Invalid price in the request"); case TRADE_RETCODE_INVALID_STOPS: return("Invalid stops in the request"); case TRADE_RETCODE_TRADE_DISABLED: return("Trade is disabled"); case TRADE_RETCODE_MARKET_CLOSED: return("Market is closed"); case TRADE_RETCODE_NO_MONEY: return("There is not enough money to complete the request"); case TRADE_RETCODE_PRICE_CHANGED: return("Prices changed"); case TRADE_RETCODE_PRICE_OFF: return("There are no quotes to process the request"); case TRADE_RETCODE_INVALID_EXPIRATION: return("Invalid order expiration date in the request"); case TRADE_RETCODE_ORDER_CHANGED: return("Order state changed"); case TRADE_RETCODE_TOO_MANY_REQUESTS: return("Too frequent requests"); case TRADE_RETCODE_NO_CHANGES: return("No changes in request"); case TRADE_RETCODE_SERVER_DISABLES_AT: return("Autotrading disabled by server"); case TRADE_RETCODE_CLIENT_DISABLES_AT: return("Autotrading disabled by client terminal"); case TRADE_RETCODE_LOCKED: return("Request locked for processing"); case TRADE_RETCODE_FROZEN: return("Order or position frozen"); case TRADE_RETCODE_INVALID_FILL: return("Invalid order filling type"); case TRADE_RETCODE_CONNECTION: return("No connection with the trade server"); case TRADE_RETCODE_ONLY_REAL: return("Operation is allowed only for live accounts"); case TRADE_RETCODE_LIMIT_ORDERS: return("The number of pending orders has reached the limit"); case TRADE_RETCODE_LIMIT_VOLUME: return("The volume of orders and positions for the symbol has reached the limit"); case TRADE_RETCODE_INVALID_ORDER: return("Incorrect or prohibited order type"); case TRADE_RETCODE_POSITION_CLOSED: return("Position with the specified POSITION_IDENTIFIER has already been closed"); case TRADE_RETCODE_INVALID_CLOSE_VOLUME: return("A close volume exceeds the current position volume"); case TRADE_RETCODE_CLOSE_ORDER_EXIST: return("A close order already exists for a specified position"); case TRADE_RETCODE_LIMIT_POSITIONS: return("The number of open positions simultaneously present on an account can be limited by the server settings"); case TRADE_RETCODE_REJECT_CANCEL: return("The pending order activation request is rejected, the order is canceled"); case TRADE_RETCODE_LONG_ONLY: return("The request is rejected, because the \"Only long positions are allowed\" rule is set for the symbol (POSITION_TYPE_BUY)"); case TRADE_RETCODE_SHORT_ONLY: return("The request is rejected, because the \"Only short positions are allowed\" rule is set for the symbol (POSITION_TYPE_SELL)"); case TRADE_RETCODE_CLOSE_ONLY: return("The request is rejected, because the \"Only position closing is allowed\" rule is set for the symbol"); case TRADE_RETCODE_FIFO_CLOSE: return("The request is rejected, because \"Position closing is allowed only by FIFO rule\" flag is set for the trading account (ACCOUNT_FIFO_CLOSE=true)"); case TRADE_RETCODE_HEDGE_PROHIBITED: return("The request is rejected, because the \"Opposite positions on a single symbol are disabled\" rule is set for the trading account"); } // --- return(NULL); } //+------------------------------------------------------------------+ //| Gets the Runtime Error Code Description | //+------------------------------------------------------------------+ static string CMt5ErrorDesc::ErrorDescription(int error_code) { switch(error_code) { // --- case ERR_SUCCESS: return("The operation completed successfully"); case ERR_INTERNAL_ERROR: return("Unexpected internal error"); case ERR_WRONG_INTERNAL_PARAMETER: return("Wrong parameter in the inner call of the client terminal function"); case ERR_INVALID_PARAMETER: return("Wrong parameter when calling the system function"); case ERR_NOT_ENOUGH_MEMORY: return("Not enough memory to perform the system function"); case ERR_STRUCT_WITHOBJECTS_ORCLASS: return("The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"); case ERR_INVALID_ARRAY: return("Array of a wrong type, wrong size, or a damaged object of a dynamic array"); case ERR_ARRAY_RESIZE_ERROR: return("Not enough memory for the relocation of an array, or an attempt to change the size of a static array"); case ERR_STRING_RESIZE_ERROR: return("Not enough memory for the relocation of string"); case ERR_NOTINITIALIZED_STRING: return("Not initialized string"); case ERR_INVALID_DATETIME: return("Invalid date and/or time"); case ERR_ARRAY_BAD_SIZE: return("Total amount of elements in the array cannot exceed 2147483647"); case ERR_INVALID_POINTER: return("Wrong pointer"); case ERR_INVALID_POINTER_TYPE: return("Wrong type of pointer"); case ERR_FUNCTION_NOT_ALLOWED: return("Function is not allowed for call"); case ERR_RESOURCE_NAME_DUPLICATED: return("The names of the dynamic and the static resource match"); case ERR_RESOURCE_NOT_FOUND: return("Resource with this name has not been found in EX5"); case ERR_RESOURCE_UNSUPPORTED_TYPE: return("Unsupported resource type or its size exceeds 16 Mb"); case ERR_RESOURCE_NAME_IS_TOO_LONG: return("The resource name exceeds 63 characters"); case ERR_MATH_OVERFLOW: return("Overflow occurred when calculating math function"); case ERR_SLEEP_ERROR: return("Out of test end date after calling Sleep()"); case ERR_PROGRAM_STOPPED: return("Test forcibly stopped from the outside"); case ERR_INVALID_TYPE: return("Invalid type"); case ERR_INVALID_HANDLE: return("Invalid handle"); case ERR_TOO_MANY_OBJECTS: return("Object pool filled out"); // Charts case ERR_CHART_WRONG_ID: return("Wrong chart ID"); case ERR_CHART_NO_REPLY: return("Chart does not respond"); case ERR_CHART_NOT_FOUND: return("Chart not found"); case ERR_CHART_NO_EXPERT: return("No Expert Advisor in the chart that could handle the event"); case ERR_CHART_CANNOT_OPEN: return("Chart opening error"); case ERR_CHART_CANNOT_CHANGE: return("Failed to change chart symbol and period"); case ERR_CHART_WRONG_PARAMETER: return("Error value of the parameter for the function of working with charts"); case ERR_CHART_CANNOT_CREATE_TIMER: return("Failed to create timer"); case ERR_CHART_WRONG_PROPERTY: return("Wrong chart property ID"); case ERR_CHART_SCREENSHOT_FAILED: return("Error creating screenshots"); case ERR_CHART_NAVIGATE_FAILED: return("Error navigating through chart"); case ERR_CHART_TEMPLATE_FAILED: return("Error applying template"); case ERR_CHART_WINDOW_NOT_FOUND: return("Subwindow containing the indicator was not found"); case ERR_CHART_INDICATOR_CANNOT_ADD: return("Error adding an indicator to chart"); case ERR_CHART_INDICATOR_CANNOT_DEL: return("Error deleting an indicator from the chart"); case ERR_CHART_INDICATOR_NOT_FOUND: return("Indicator not found on the specified chart"); // Graphical Objects case ERR_OBJECT_ERROR: return("Error working with a graphical object"); case ERR_OBJECT_NOT_FOUND: return("Graphical object was not found"); case ERR_OBJECT_WRONG_PROPERTY: return("Wrong ID of a graphical object property"); case ERR_OBJECT_GETDATE_FAILED: return("Unable to get date corresponding to the value"); case ERR_OBJECT_GETVALUE_FAILED: return("Unable to get value corresponding to the date"); // MarketInfo case ERR_MARKET_UNKNOWN_SYMBOL: return("Unknown symbol"); case ERR_MARKET_NOT_SELECTED: return("Symbol is not selected in MarketWatch"); case ERR_MARKET_WRONG_PROPERTY: return("Wrong identifier of a symbol property"); case ERR_MARKET_LASTTIME_UNKNOWN: return("Time of the last tick is not known (no ticks)"); case ERR_MARKET_SELECT_ERROR: return("Error adding or deleting a symbol in MarketWatch"); // History Access case ERR_HISTORY_NOT_FOUND: return("Requested history not found"); case ERR_HISTORY_WRONG_PROPERTY: return("Wrong ID of the history property"); case ERR_HISTORY_TIMEOUT: return("Exceeded history request timeout"); case ERR_HISTORY_BARS_LIMIT: return("Number of requested bars limited by terminal settings"); case ERR_HISTORY_LOAD_ERRORS: return("Multiple errors when loading history"); case ERR_HISTORY_SMALL_BUFFER: return("Receiving array is too small to store all requested data"); // Global_Variables case ERR_GLOBALVARIABLE_NOT_FOUND: return("Global variable of the client terminal is not found"); case ERR_GLOBALVARIABLE_EXISTS: return("Global variable of the client terminal with the same name already exists"); case ERR_GLOBALVARIABLE_NOT_MODIFIED: return("Global variables were not modified"); case ERR_GLOBALVARIABLE_CANNOTREAD: return("Cannot read file with global variable values"); case ERR_GLOBALVARIABLE_CANNOTWRITE: return("Cannot write file with global variable values"); case ERR_MAIL_SEND_FAILED: return("Email sending failed"); case ERR_PLAY_SOUND_FAILED: return("Sound playing failed"); case ERR_MQL5_WRONG_PROPERTY: return("Wrong identifier of the program property"); case ERR_TERMINAL_WRONG_PROPERTY: return("Wrong identifier of the terminal property"); case ERR_FTP_SEND_FAILED: return("File sending via ftp failed"); case ERR_NOTIFICATION_SEND_FAILED: return("Failed to send a notification"); case ERR_NOTIFICATION_WRONG_PARAMETER: return("Invalid parameter for sending a notification – an empty string or NULL has been passed to the SendNotification() function"); case ERR_NOTIFICATION_WRONG_SETTINGS: return("Wrong settings of notifications in the terminal (ID is not specified or permission is not set)"); case ERR_NOTIFICATION_TOO_FREQUENT: return("Too frequent sending of notifications"); case ERR_FTP_NOSERVER: return("FTP server is not specified"); case ERR_FTP_NOLOGIN: return("FTP login is not specified"); case ERR_FTP_FILE_ERROR: return("File not found in the MQL5/Files directory to send on FTP server"); case ERR_FTP_CONNECT_FAILED: return("FTP connection failed"); case ERR_FTP_CHANGEDIR: return("FTP path not found on server"); // Custom Indicator Buffers case ERR_BUFFERS_NO_MEMORY: return("Not enough memory for the distribution of indicator buffers"); case ERR_BUFFERS_WRONG_INDEX: return("Wrong indicator buffer index"); // Custom Indicator Properties case ERR_CUSTOM_WRONG_PROPERTY: return("Wrong ID of the custom indicator property"); // Account case ERR_ACCOUNT_WRONG_PROPERTY: return("Wrong account property ID"); case ERR_TRADE_WRONG_PROPERTY: return("Wrong trade property ID"); case ERR_TRADE_DISABLED: return("Trading by Expert Advisors prohibited"); case ERR_TRADE_POSITION_NOT_FOUND: return("Position not found"); case ERR_TRADE_ORDER_NOT_FOUND: return("Order not found"); case ERR_TRADE_DEAL_NOT_FOUND: return("Deal not found"); case ERR_TRADE_SEND_FAILED: return("Trade request sending failed"); case ERR_TRADE_CALC_FAILED: return("Failed to calculate profit or margin"); // Indicators case ERR_INDICATOR_UNKNOWN_SYMBOL: return("Unknown symbol"); case ERR_INDICATOR_CANNOT_CREATE: return("Indicator cannot be created"); case ERR_INDICATOR_NO_MEMORY: return("Not enough memory to add the indicator"); case ERR_INDICATOR_CANNOT_APPLY: return("The indicator cannot be applied to another indicator"); case ERR_INDICATOR_CANNOT_ADD: return("Error applying an indicator to chart"); case ERR_INDICATOR_DATA_NOT_FOUND: return("Requested data not found"); case ERR_INDICATOR_WRONG_HANDLE: return("Wrong indicator handle"); case ERR_INDICATOR_WRONG_PARAMETERS: return("Wrong number of parameters when creating an indicator"); case ERR_INDICATOR_PARAMETERS_MISSING: return("No parameters when creating an indicator"); case ERR_INDICATOR_CUSTOM_NAME: return("The first parameter in the array must be the name of the custom indicator"); case ERR_INDICATOR_PARAMETER_TYPE: return("Invalid parameter type in the array when creating an indicator"); case ERR_INDICATOR_WRONG_INDEX: return("Wrong index of the requested indicator buffer"); // Depth of Market case ERR_BOOKS_CANNOT_ADD: return("Depth Of Market can not be added"); case ERR_BOOKS_CANNOT_DELETE: return("Depth Of Market can not be removed"); case ERR_BOOKS_CANNOT_GET: return("The data from Depth Of Market can not be obtained"); case ERR_BOOKS_CANNOT_SUBSCRIBE: return("Error in subscribing to receive new data from Depth Of Market"); // File Operations case ERR_TOO_MANY_FILES: return("More than 64 files cannot be opened at the same time"); case ERR_WRONG_FILENAME: return("Invalid file name"); case ERR_TOO_LONG_FILENAME: return("Too long file name"); case ERR_CANNOT_OPEN_FILE: return("File opening error"); case ERR_FILE_CACHEBUFFER_ERROR: return("Not enough memory for cache to read"); case ERR_CANNOT_DELETE_FILE: return("File deleting error"); case ERR_INVALID_FILEHANDLE: return("A file with this handle was closed, or was not opening at all"); case ERR_WRONG_FILEHANDLE: return("Wrong file handle"); case ERR_FILE_NOTTOWRITE: return("The file must be opened for writing"); case ERR_FILE_NOTTOREAD: return("The file must be opened for reading"); case ERR_FILE_NOTBIN: return("The file must be opened as a binary one"); case ERR_FILE_NOTTXT: return("The file must be opened as a text"); case ERR_FILE_NOTTXTORCSV: return("The file must be opened as a text or CSV"); case ERR_FILE_NOTCSV: return("The file must be opened as CSV"); case ERR_FILE_READERROR: return("File reading error"); case ERR_FILE_BINSTRINGSIZE: return("String size must be specified, because the file is opened as binary"); case ERR_INCOMPATIBLE_FILE: return("A text file must be for string arrays, for other arrays - binary"); case ERR_FILE_IS_DIRECTORY: return("This is not a file, this is a directory"); case ERR_FILE_NOT_EXIST: return("File does not exist"); case ERR_FILE_CANNOT_REWRITE: return("File can not be rewritten"); case ERR_WRONG_DIRECTORYNAME: return("Wrong directory name"); case ERR_DIRECTORY_NOT_EXIST: return("Directory does not exist"); case ERR_FILE_ISNOT_DIRECTORY: return("This is a file, not a directory"); case ERR_CANNOT_DELETE_DIRECTORY: return("The directory cannot be removed"); case ERR_CANNOT_CLEAN_DIRECTORY: return("Failed to clear the directory (probably one or more files are blocked and removal operation failed)"); case ERR_FILE_WRITEERROR: return("Failed to write a resource to a file"); case ERR_FILE_ENDOFFILE: return("Unable to read the next piece of data from a CSV file (FileReadString, FileReadNumber, FileReadDatetime, FileReadBool), since the end of file is reached"); // String Casting case ERR_NO_STRING_DATE: return("No date in the string"); case ERR_WRONG_STRING_DATE: return("Wrong date in the string"); case ERR_WRONG_STRING_TIME: return("Wrong time in the string"); case ERR_STRING_TIME_ERROR: return("Error converting string to date"); case ERR_STRING_OUT_OF_MEMORY: return("Not enough memory for the string"); case ERR_STRING_SMALL_LEN: return("The string length is less than expected"); case ERR_STRING_TOO_BIGNUMBER: return("Too large number, more than ULONG_MAX"); case ERR_WRONG_FORMATSTRING: return("Invalid format string"); case ERR_TOO_MANY_FORMATTERS: return("Amount of format specifiers more than the parameters"); case ERR_TOO_MANY_PARAMETERS: return("Amount of parameters more than the format specifiers"); case ERR_WRONG_STRING_PARAMETER: return("Damaged parameter of string type"); case ERR_STRINGPOS_OUTOFRANGE: return("Position outside the string"); case ERR_STRING_ZEROADDED: return("0 added to the string end, a useless operation"); case ERR_STRING_UNKNOWNTYPE: return("Unknown data type when converting to a string"); case ERR_WRONG_STRING_OBJECT: return("Damaged string object"); // Operations with Arrays case ERR_INCOMPATIBLE_ARRAYS: return("Copying incompatible arrays"); case ERR_SMALL_ASSERIES_ARRAY: return("The receiving array is declared as AS_SERIES, and it is of insufficient size"); case ERR_SMALL_ARRAY: return("Too small array, the starting position is outside the array"); case ERR_ZEROSIZE_ARRAY: return("An array of zero length"); case ERR_NUMBER_ARRAYS_ONLY: return("Must be a numeric array"); case ERR_ONEDIM_ARRAYS_ONLY: return("Must be a one-dimensional array"); case ERR_SERIES_ARRAY: return("Timeseries cannot be used"); case ERR_DOUBLE_ARRAY_ONLY: return("Must be an array of type double"); case ERR_FLOAT_ARRAY_ONLY: return("Must be an array of type float"); case ERR_LONG_ARRAY_ONLY: return("Must be an array of type long"); case ERR_INT_ARRAY_ONLY: return("Must be an array of type int"); case ERR_SHORT_ARRAY_ONLY: return("Must be an array of type short"); case ERR_CHAR_ARRAY_ONLY: return("Must be an array of type char"); case ERR_STRING_ARRAY_ONLY: return("String array only"); // Operations with OpenCL case ERR_OPENCL_NOT_SUPPORTED: return("OpenCL functions are not supported on this computer"); case ERR_OPENCL_INTERNAL: return("Internal error occurred when running OpenCL"); case ERR_OPENCL_INVALID_HANDLE: return("Invalid OpenCL handle"); case ERR_OPENCL_CONTEXT_CREATE: return("Error creating the OpenCL context"); case ERR_OPENCL_QUEUE_CREATE: return("Failed to create a run queue in OpenCL"); case ERR_OPENCL_PROGRAM_CREATE: return("Error occurred when compiling an OpenCL program"); case ERR_OPENCL_TOO_LONG_KERNEL_NAME: return("Too long kernel name (OpenCL kernel)"); case ERR_OPENCL_KERNEL_CREATE: return("Error creating an OpenCL kernel"); case ERR_OPENCL_SET_KERNEL_PARAMETER: return("Error occurred when setting parameters for the OpenCL kernel"); case ERR_OPENCL_EXECUTE: return("OpenCL program runtime error"); case ERR_OPENCL_WRONG_BUFFER_SIZE: return("Invalid size of the OpenCL buffer"); case ERR_OPENCL_WRONG_BUFFER_OFFSET: return("Invalid offset in the OpenCL buffer"); case ERR_OPENCL_BUFFER_CREATE: return("Failed to create an OpenCL buffer"); case ERR_OPENCL_TOO_MANY_OBJECTS: return("Too many OpenCL objects"); case ERR_OPENCL_SELECTDEVICE: return("OpenCL device selection error"); // Working with databases case ERR_DATABASE_INTERNAL: return("Internal database error"); case ERR_DATABASE_INVALID_HANDLE: return("Invalid database handle"); case ERR_DATABASE_TOO_MANY_OBJECTS: return("Exceeded the maximum acceptable number of Database objects"); case ERR_DATABASE_CONNECT: return("Database connection error"); case ERR_DATABASE_EXECUTE: return("Request execution error"); case ERR_DATABASE_PREPARE: return("Request generation error"); case ERR_DATABASE_NO_MORE_DATA: return("No more data to read"); case ERR_DATABASE_STEP: return("Failed to move to the next request entry"); case ERR_DATABASE_NOT_READY: return("Data for reading request results are not ready yet"); case ERR_DATABASE_BIND_PARAMETERS: return("Failed to auto substitute parameters to an SQL request"); // Operations with WebRequest case ERR_WEBREQUEST_INVALID_ADDRESS: return("Invalid URL"); case ERR_WEBREQUEST_CONNECT_FAILED: return("Failed to connect to specified URL"); case ERR_WEBREQUEST_TIMEOUT: return("Timeout exceeded"); case ERR_WEBREQUEST_REQUEST_FAILED: return("HTTP request failed"); // Operations with network (sockets) case ERR_NETSOCKET_INVALIDHANDLE: return("Invalid socket handle passed to function"); case ERR_NETSOCKET_TOO_MANY_OPENED: return("Too many open sockets (max 128)"); case ERR_NETSOCKET_CANNOT_CONNECT: return("Failed to connect to remote host"); case ERR_NETSOCKET_IO_ERROR: return("Failed to send/receive data from socket"); case ERR_NETSOCKET_HANDSHAKE_FAILED: return("Failed to establish secure connection (TLS Handshake)"); case ERR_NETSOCKET_NO_CERTIFICATE: return("No data on certificate protecting the connection"); // Custom Symbols case ERR_NOT_CUSTOM_SYMBOL: return("A custom symbol must be specified"); case ERR_CUSTOM_SYMBOL_WRONG_NAME: return("The name of the custom symbol is invalid"); case ERR_CUSTOM_SYMBOL_NAME_LONG: return("The name of the custom symbol is too long"); case ERR_CUSTOM_SYMBOL_PATH_LONG: return("The path of the custom symbol is too long"); case ERR_CUSTOM_SYMBOL_EXIST: return("A custom symbol with the same name already exists"); case ERR_CUSTOM_SYMBOL_ERROR: return("Error occurred while creating, deleting or changing the custom symbol"); case ERR_CUSTOM_SYMBOL_SELECTED: return("You are trying to delete a custom symbol selected in Market Watch"); case ERR_CUSTOM_SYMBOL_PROPERTY_WRONG: return("An invalid custom symbol property"); case ERR_CUSTOM_SYMBOL_PARAMETER_ERROR: return("A wrong parameter while setting the property of a custom symbol"); case ERR_CUSTOM_SYMBOL_PARAMETER_LONG: return("A too long string parameter while setting the property of a custom symbol"); case ERR_CUSTOM_TICKS_WRONG_ORDER: return("Ticks in the array are not arranged in the order of time"); // Economic Calendar case ERR_CALENDAR_MORE_DATA: return("Array size is insufficient for receiving descriptions of all values"); case ERR_CALENDAR_TIMEOUT: return("Request time limit exceeded"); case ERR_CALENDAR_NO_DATA: return("Country is not found"); // Working with databases case ERR_DATABASE_ERROR: return("Generic error"); case ERR_DATABASE_LOGIC: return("SQLite internal logic error"); case ERR_DATABASE_PERM: return("Access denied"); case ERR_DATABASE_ABORT: return("Callback routine requested abort"); case ERR_DATABASE_BUSY: return("Database file locked"); case ERR_DATABASE_LOCKED: return("Database table locked"); case ERR_DATABASE_NOMEM: return("Insufficient memory for completing operation"); case ERR_DATABASE_READONLY: return("Attempt to write to readonly database"); case ERR_DATABASE_INTERRUPT: return("Operation terminated by sqlite3_interrupt()"); case ERR_DATABASE_IOERR: return("Disk I/O error"); case ERR_DATABASE_CORRUPT: return("Database disk image corrupted"); case ERR_DATABASE_NOTFOUND: return("Unknown operation code in sqlite3_file_control()"); case ERR_DATABASE_FULL: return("Insertion failed because database is full"); case ERR_DATABASE_CANTOPEN: return("Unable to open the database file"); case ERR_DATABASE_PROTOCOL: return("Database lock protocol error"); case ERR_DATABASE_EMPTY: return("Internal use only"); case ERR_DATABASE_SCHEMA: return("Database schema changed"); case ERR_DATABASE_TOOBIG: return("String or BLOB exceeds size limit"); case ERR_DATABASE_CONSTRAINT: return("Abort due to constraint violation"); case ERR_DATABASE_MISMATCH: return("Data type mismatch"); case ERR_DATABASE_MISUSE: return("Library used incorrectly"); case ERR_DATABASE_NOLFS: return("Uses OS features not supported on host"); case ERR_DATABASE_AUTH: return("Authorization denied"); case ERR_DATABASE_FORMAT: return("Not used"); case ERR_DATABASE_RANGE: return("Bind parameter error, incorrect index"); case ERR_DATABASE_NOTADB: return("File opened that is not database file"); // Matrix and Vector Methods case ERR_MATRIX_INTERNAL: return("Internal error of the matrix/vector executing subsystem"); case ERR_MATRIX_NOT_INITIALIZED: return("Matrix/vector not initialized"); case ERR_MATRIX_INCONSISTENT: return("Inconsistent size of matrices/vectors in operation"); case ERR_MATRIX_INVALID_SIZE: return("Invalid matrix/vector size"); case ERR_MATRIX_INVALID_TYPE: return("Invalid matrix/vector type"); case ERR_MATRIX_FUNC_NOT_ALLOWED: return("Function not available for this matrix/vector"); case ERR_MATRIX_CONTAINS_NAN: return("Matrix/vector contains non-numbers (Nan/Inf)"); // ONNX models case ERR_ONNX_INTERNAL: return("ONNX internal error"); case ERR_ONNX_NOT_INITIALIZED: return("ONNX Runtime API initialization error"); case ERR_ONNX_NOT_SUPPORTED: return("Property or value not supported by MQL5"); case ERR_ONNX_RUN_FAILED: return("ONNX runtime API run error"); case ERR_ONNX_INVALID_PARAMETERS_COUNT: return("Invalid number of parameters passed to OnnxRun"); case ERR_ONNX_INVALID_PARAMETER: return("Invalid parameter value"); case ERR_ONNX_INVALID_PARAMETER_TYPE: return("Invalid parameter type"); case ERR_ONNX_INVALID_PARAMETER_SIZE: return("Invalid parameter size"); case ERR_ONNX_WRONG_DIMENSION: return("Tensor dimension not set or invalid"); // User-Defined Errors default: if(error_code >= ERR_USER_ERROR_FIRST && error_code < ERR_USER_ERROR_LAST) return("User error " + string(error_code - ERR_USER_ERROR_FIRST)); } // --- return(NULL); } //+------------------------------------------------------------------+ //| Checks whether the operation was completed successfully. | //+------------------------------------------------------------------+ static __forceinline bool CMt5ErrorDesc::IsSuccess(int return_code = -1) { if(return_code == -1) return_code = ::GetLastError(); return(return_code == ERR_SUCCESS); } //+------------------------------------------------------------------+ //| Checks whether an return code is a Trade Server Error. | //+------------------------------------------------------------------+ static __forceinline bool CMt5ErrorDesc::IsTradeServerError(int return_code = -1) { if(return_code == -1) return_code = ::GetLastError(); return(return_code >= MQLARTICLES_FIRST_TRADE_SERVER_ERROR && return_code <= MQLARTICLES_LAST_TRADE_SERVER_ERROR); } //+------------------------------------------------------------------+ //| Checks whether an return code is a Runtime Error. | //+------------------------------------------------------------------+ static __forceinline bool CMt5ErrorDesc::IsRuntimeError(int return_code = -1) { if(return_code == -1) return_code = ::GetLastError(); return(return_code >= MQLARTICLES_FIRST_RUNTIME_ERROR && return_code <= MQLARTICLES_LAST_RUNTIME_ERROR); } //+------------------------------------------------------------------+ //| Checks whether an return code is a User-Defined Error. | //+------------------------------------------------------------------+ static __forceinline bool CMt5ErrorDesc::IsUserError(int return_code = -1) { if(return_code == -1) return_code = ::GetLastError(); return(return_code >= ERR_USER_ERROR_FIRST && return_code < ERR_USER_ERROR_LAST); } //+------------------------------------------------------------------+ //| Gets the Error Code Description. | //+------------------------------------------------------------------+ static void CMt5ErrorDesc::GetError(string& error_desc, int error_code = -1, bool include_code = true) { //--- get last error code if(error_code == -1) error_code = ::GetLastError(); //--- get error description if(IsTradeServerError(error_code)) error_desc = TradeServerReturnCodeDescription(error_code); else error_desc = ErrorDescription(error_code); //--- include error code in description if(error_desc != NULL && include_code) error_desc = StringFormat("%s [%d]", error_desc, error_code); } //+------------------------------------------------------------------+ #endif // MQLARTICLES_UTILS_ERRDESCRIPTION_MQH