/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Logger Library // --------------------------------------- // Name: XLogger // Description: provides Logging abilities ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // START Inputs ... // // input group "Logging"; // input bool enableLogging = true; // Enable Logging bool enableLogging = true; // Enable Logging // // END Inputs ... // // // START Global Definitions: Variables, Properties and etc ... // string logTag = "X-Logger"; // LogTag // // END Global Definitions: Variables, Properties and etc ... // // // START Provided Functions ... // // // Logging a Message ... void LogMessage(string message) { // if (!enableLogging) { return; } // Print(logTag, " > ", message); } void LogMessage(string tag, string message) { // if (!enableLogging) { return; } // Print(tag, " > ", message); } // void LogEmptyLine() { LogMessage(" "); } // void LogError( int error = -1 // Specific Error ) { // if (error <= -1) { error = GetLastError(); } // string errorMsg = GetErrorDescription(error); // LogMessage("Error: " + errorMsg); } // // Logging an Array ... void LogArray(int &array[]) { // if (!enableLogging) { return; } // Print(logTag, ">"); ArrayPrint(array); } void LogArray(double &array[]) { // if (!enableLogging) { return; } // Print(logTag, ">"); ArrayPrint(array); } void LogArray(string &array[]) { // if (!enableLogging) { return; } // Print(logTag, ">"); ArrayPrint(array); } // // END Provided Functions ... // // // Error Descriptions Functions ... // // // Retrieve Specified Error Code Description ... string GetErrorDescription(int err_code) { // string result = ""; // switch (err_code) { // //--- Constant Description // case ERR_SUCCESS: result = "The operation completed successfully"; break; // case ERR_INTERNAL_ERROR: result = "Unexpected internal error"; break; // case ERR_WRONG_INTERNAL_PARAMETER: result = "Wrong parameter in the inner call of the client terminal function"; break; // case ERR_INVALID_PARAMETER: result = "Wrong parameter when calling the system function"; break; // case ERR_NOT_ENOUGH_MEMORY: result = "Not enough memory to perform the system function"; break; // case ERR_STRUCT_WITHOBJECTS_ORCLASS: result = "The structure contains objects of strings and/or dynamic arrays and/or structure of such objects and/or classes"; break; // case ERR_INVALID_ARRAY: result = "Array of a wrong type, wrong size, or a damaged object of a dynamic array"; break; // case ERR_ARRAY_RESIZE_ERROR: result = "Not enough memory for the relocation of an array, or an attempt to change the size of a static array"; break; // case ERR_STRING_RESIZE_ERROR: result = "Not enough memory for the relocation of string"; break; // case ERR_NOTINITIALIZED_STRING: result = "Not initialized string"; break; // case ERR_INVALID_DATETIME: result = "Invalid date and/or time"; break; // case ERR_ARRAY_BAD_SIZE: result = "Requested array size exceeds 2 GB"; break; // case ERR_INVALID_POINTER: result = "Wrong pointer"; break; // case ERR_INVALID_POINTER_TYPE: result = "Wrong type of pointer"; break; // case ERR_FUNCTION_NOT_ALLOWED: result = "System function is not allowed to call"; break; // //--- Charts // case ERR_CHART_WRONG_ID: result = "Wrong chart ID"; break; // case ERR_CHART_NO_REPLY: result = "Chart does not respond"; break; // case ERR_CHART_NOT_FOUND: result = "Chart not found"; break; // case ERR_CHART_NO_EXPERT: result = "No Expert Advisor in the chart that could handle the event"; break; // case ERR_CHART_CANNOT_OPEN: result = "Chart opening error"; break; // case ERR_CHART_CANNOT_CHANGE: result = "Failed to change chart symbol and period"; break; // case ERR_CHART_CANNOT_CREATE_TIMER: result = "Failed to create timer"; break; // case ERR_CHART_WRONG_PROPERTY: result = "Wrong chart property ID"; break; // case ERR_CHART_SCREENSHOT_FAILED: result = "Error creating screenshots"; break; // case ERR_CHART_NAVIGATE_FAILED: result = "Error navigating through chart"; break; // case ERR_CHART_TEMPLATE_FAILED: result = "Error applying template"; break; // case ERR_CHART_WINDOW_NOT_FOUND: result = "Subwindow containing the indicator was not found"; break; // case ERR_CHART_INDICATOR_CANNOT_ADD: result = "Error adding an indicator to chart"; break; // case ERR_CHART_INDICATOR_CANNOT_DEL: result = "Error deleting an indicator from the chart"; break; // case ERR_CHART_INDICATOR_NOT_FOUND: result = "Indicator not found on the specified chart"; break; // //--- Graphical Objects case ERR_OBJECT_ERROR: result = "Error working with a graphical object"; break; // case ERR_OBJECT_NOT_FOUND: result = "Graphical object was not found"; break; // case ERR_OBJECT_WRONG_PROPERTY: result = "Wrong ID of a graphical object property"; break; // case ERR_OBJECT_GETDATE_FAILED: result = "Unable to get date corresponding to the value"; break; // case ERR_OBJECT_GETVALUE_FAILED: result = "Unable to get value corresponding to the date"; break; // //--- MarketInfo // case ERR_MARKET_UNKNOWN_SYMBOL: result = "Unknown symbol"; break; // case ERR_MARKET_NOT_SELECTED: result = "Symbol is not selected in MarketWatch"; break; // case ERR_MARKET_WRONG_PROPERTY: result = "Wrong identifier of a symbol property"; break; // case ERR_MARKET_LASTTIME_UNKNOWN: result = "Time of the last tick is not known (no ticks)"; break; // case ERR_MARKET_SELECT_ERROR: result = "Error adding or deleting a symbol in MarketWatch"; break; // //--- History Access // case ERR_HISTORY_NOT_FOUND: result = "Requested history not found"; break; // case ERR_HISTORY_WRONG_PROPERTY: result = "Wrong ID of the history property"; break; // //--- Global_Variables // case ERR_GLOBALVARIABLE_NOT_FOUND: result = "Global variable of the client terminal is not found"; break; // case ERR_GLOBALVARIABLE_EXISTS: result = "Global variable of the client terminal with the same name already exists"; break; // case ERR_MAIL_SEND_FAILED: result = "Email sending failed"; break; // case ERR_PLAY_SOUND_FAILED: result = "Sound playing failed"; break; // case ERR_MQL5_WRONG_PROPERTY: result = "Wrong identifier of the program property"; break; // case ERR_TERMINAL_WRONG_PROPERTY: result = "Wrong identifier of the terminal property"; break; // case ERR_FTP_SEND_FAILED: result = "File sending via ftp failed"; break; // case ERR_NOTIFICATION_SEND_FAILED: result = "Error in sending notification"; break; // //--- Custom Indicator Buffers // case ERR_BUFFERS_NO_MEMORY: result = "Not enough memory for the distribution of indicator buffers"; break; // case ERR_BUFFERS_WRONG_INDEX: result = "Wrong indicator buffer index"; break; // //--- Custom Indicator Properties // case ERR_CUSTOM_WRONG_PROPERTY: result = "Wrong ID of the custom indicator property"; break; // //--- Account // case ERR_ACCOUNT_WRONG_PROPERTY: result = "Wrong account property ID"; break; // case ERR_TRADE_WRONG_PROPERTY: result = "Wrong trade property ID"; break; // case ERR_TRADE_DISABLED: result = "Trading by Expert Advisors prohibited"; break; // case ERR_TRADE_POSITION_NOT_FOUND: result = "Position not found"; break; // case ERR_TRADE_ORDER_NOT_FOUND: result = "Order not found"; break; // case ERR_TRADE_DEAL_NOT_FOUND: result = "Deal not found"; break; // case ERR_TRADE_SEND_FAILED: result = "Trade request sending failed"; break; // //--- Indicators // case ERR_INDICATOR_UNKNOWN_SYMBOL: result = "Unknown symbol"; break; // case ERR_INDICATOR_CANNOT_CREATE: result = "Indicator cannot be created"; break; // case ERR_INDICATOR_NO_MEMORY: result = "Not enough memory to add the indicator"; break; // case ERR_INDICATOR_CANNOT_APPLY: result = "The indicator cannot be applied to another indicator"; break; // case ERR_INDICATOR_CANNOT_ADD: result = "Error applying an indicator to chart"; break; // case ERR_INDICATOR_DATA_NOT_FOUND: result = "Requested data not found"; break; // case ERR_INDICATOR_WRONG_HANDLE: result = "Wrong indicator handle"; break; // case ERR_INDICATOR_WRONG_PARAMETERS: result = "Wrong number of parameters when creating an indicator"; break; // case ERR_INDICATOR_PARAMETERS_MISSING: result = "No parameters when creating an indicator"; break; // case ERR_INDICATOR_CUSTOM_NAME: result = "The first parameter in the array must be the name of the custom indicator"; break; // case ERR_INDICATOR_PARAMETER_TYPE: result = "Invalid parameter type in the array when creating an indicator"; break; // case ERR_INDICATOR_WRONG_INDEX: result = "Wrong index of the requested indicator buffer"; break; // //--- Depth of Market // case ERR_BOOKS_CANNOT_ADD: result = "Depth Of Market can not be added"; break; // case ERR_BOOKS_CANNOT_DELETE: result = "Depth Of Market can not be removed"; break; // case ERR_BOOKS_CANNOT_GET: result = "The data from Depth Of Market can not be obtained"; break; // case ERR_BOOKS_CANNOT_SUBSCRIBE: result = "Error in subscribing to receive new data from Depth Of Market"; break; // //--- File Operations // case ERR_TOO_MANY_FILES: result = "More than 64 files cannot be opened at the same time"; break; // case ERR_WRONG_FILENAME: result = "Invalid file name"; break; // case ERR_TOO_LONG_FILENAME: result = "Too long file name"; break; // case ERR_CANNOT_OPEN_FILE: result = "File opening error"; break; // case ERR_FILE_CACHEBUFFER_ERROR: result = "Not enough memory for cache to read"; break; // case ERR_CANNOT_DELETE_FILE: result = "File deleting error"; break; // case ERR_INVALID_FILEHANDLE: result = "A file with this handle was closed, or was not opening at all"; break; // case ERR_WRONG_FILEHANDLE: result = "Wrong file handle"; break; // case ERR_FILE_NOTTOWRITE: result = "The file must be opened for writing"; break; // case ERR_FILE_NOTTOREAD: result = "The file must be opened for reading"; break; // case ERR_FILE_NOTBIN: result = "The file must be opened as a binary one"; break; // case ERR_FILE_NOTTXT: result = "The file must be opened as a text"; break; // case ERR_FILE_NOTTXTORCSV: result = "The file must be opened as a text or CSV"; break; // case ERR_FILE_NOTCSV: result = "The file must be opened as CSV"; break; // case ERR_FILE_READERROR: result = "File reading error"; break; // case ERR_FILE_BINSTRINGSIZE: result = "String size must be specified, because the file is opened as binary"; break; // case ERR_INCOMPATIBLE_FILE: result = "A text file must be for string arrays, for other arrays - binary"; break; // case ERR_FILE_IS_DIRECTORY: result = "This is not a file, this is a directory"; break; // case ERR_FILE_NOT_EXIST: result = "File does not exist"; break; // case ERR_FILE_CANNOT_REWRITE: result = "File can not be rewritten"; break; // case ERR_WRONG_DIRECTORYNAME: result = "Wrong directory name"; break; // case ERR_DIRECTORY_NOT_EXIST: result = "Directory does not exist"; break; // case ERR_FILE_ISNOT_DIRECTORY: result = "This is a file, not a directory"; break; // case ERR_CANNOT_DELETE_DIRECTORY: result = "The directory cannot be removed"; break; // case ERR_CANNOT_CLEAN_DIRECTORY: result = "Failed to clear the directory (probably one or more files are blocked and removal operation failed)"; break; // case ERR_FILE_WRITEERROR: result = "Failed to write a resource to a file"; break; // //--- String Casting // case ERR_NO_STRING_DATE: result = "No date in the string"; break; // case ERR_WRONG_STRING_DATE: result = "Wrong date in the string"; break; // case ERR_WRONG_STRING_TIME: result = "Wrong time in the string"; break; // case ERR_STRING_TIME_ERROR: result = "Error converting string to date"; break; // case ERR_STRING_OUT_OF_MEMORY: result = "Not enough memory for the string"; break; // case ERR_STRING_SMALL_LEN: result = "The string length is less than expected"; break; // case ERR_STRING_TOO_BIGNUMBER: result = "Too large number, more than ULONG_MAX"; break; // case ERR_WRONG_FORMATSTRING: result = "Invalid format string"; break; // case ERR_TOO_MANY_FORMATTERS: result = "Amount of format specifiers more than the parameters"; break; // case ERR_TOO_MANY_PARAMETERS: result = "Amount of parameters more than the format specifiers"; break; // case ERR_WRONG_STRING_PARAMETER: result = "Damaged parameter of string type"; break; // case ERR_STRINGPOS_OUTOFRANGE: result = "Position outside the string"; break; // case ERR_STRING_ZEROADDED: result = "0 added to the string end, a useless operation"; break; // case ERR_STRING_UNKNOWNTYPE: result = "Unknown data type when converting to a string"; break; // case ERR_WRONG_STRING_OBJECT: result = "Damaged string object"; break; // //--- Operations with Arrays // case ERR_INCOMPATIBLE_ARRAYS: result = "Copying incompatible arrays. String array can be copied only to a string array, and a numeric array - in numeric array only"; break; // case ERR_SMALL_ASSERIES_ARRAY: result = "The receiving array is declared as AS_SERIES, and it is of insufficient size"; break; // case ERR_SMALL_ARRAY: result = "Too small array, the starting position is outside the array"; break; // case ERR_ZEROSIZE_ARRAY: result = "An array of zero length"; break; // case ERR_NUMBER_ARRAYS_ONLY: result = "Must be a numeric array"; break; // case ERR_ONEDIM_ARRAYS_ONLY: result = "Must be a one-dimensional array"; break; // case ERR_SERIES_ARRAY: result = "Timeseries cannot be used"; break; // case ERR_DOUBLE_ARRAY_ONLY: result = "Must be an array of type double"; break; // case ERR_FLOAT_ARRAY_ONLY: result = "Must be an array of type float"; break; // case ERR_LONG_ARRAY_ONLY: result = "Must be an array of type long"; break; // case ERR_INT_ARRAY_ONLY: result = "Must be an array of type int"; break; // case ERR_SHORT_ARRAY_ONLY: result = "Must be an array of type short"; break; // case ERR_CHAR_ARRAY_ONLY: result = "Must be an array of type char"; break; // //--- Operations with OpenCL // case ERR_OPENCL_NOT_SUPPORTED: result = "OpenCL functions are not supported on this computer"; break; // case ERR_OPENCL_INTERNAL: result = "Internal error occurred when running OpenCL"; break; // case ERR_OPENCL_INVALID_HANDLE: result = "Invalid OpenCL handle"; break; // case ERR_OPENCL_CONTEXT_CREATE: result = "Error creating the OpenCL context"; break; // case ERR_OPENCL_QUEUE_CREATE: result = "Failed to create a run queue in OpenCL"; break; // case ERR_OPENCL_PROGRAM_CREATE: result = "Error occurred when compiling an OpenCL program"; break; // case ERR_OPENCL_TOO_LONG_KERNEL_NAME: result = "Too long kernel name (OpenCL kernel)"; break; // case ERR_OPENCL_KERNEL_CREATE: result = "Error creating an OpenCL kernel"; break; // case ERR_OPENCL_SET_KERNEL_PARAMETER: result = "Error occurred when setting parameters for the OpenCL kernel"; break; // case ERR_OPENCL_EXECUTE: result = "OpenCL program runtime error"; break; // case ERR_OPENCL_WRONG_BUFFER_SIZE: result = "Invalid size of the OpenCL buffer"; break; // case ERR_OPENCL_WRONG_BUFFER_OFFSET: result = "Invalid offset in the OpenCL buffer"; break; // case ERR_OPENCL_BUFFER_CREATE: result = "Failed to create and OpenCL buffer"; break; // //--- User-Defined Errors default: result = "UNKNOWN Erro ..."; break; } // return result; } // // Retrieve Specified Error Code Description ... string GetTradeServerReturnCodeDescription(int return_code) { // string result = ""; // switch (return_code) { // case TRADE_RETCODE_REQUOTE: result = "Requote"; break; // case TRADE_RETCODE_REJECT: result = "Request rejected"; break; // case TRADE_RETCODE_CANCEL: result = "Request canceled by trader"; break; // case TRADE_RETCODE_PLACED: result = "Order placed"; break; // case TRADE_RETCODE_DONE: result = "Request completed"; break; // case TRADE_RETCODE_DONE_PARTIAL: result = "Only part of the request was completed"; break; // case TRADE_RETCODE_ERROR: result = "Request processing error"; break; // case TRADE_RETCODE_TIMEOUT: result = "Request canceled by timeout"; break; // case TRADE_RETCODE_INVALID: result = "Invalid request"; break; // case TRADE_RETCODE_INVALID_VOLUME: result = "Invalid volume in the request"; break; // case TRADE_RETCODE_INVALID_PRICE: result = "Invalid price in the request"; break; // case TRADE_RETCODE_INVALID_STOPS: result = "Invalid stops in the request"; break; // case TRADE_RETCODE_TRADE_DISABLED: result = "Trade is disabled"; break; // case TRADE_RETCODE_MARKET_CLOSED: result = "Market is closed"; break; // case TRADE_RETCODE_NO_MONEY: result = "There is not enough money to complete the request"; break; // case TRADE_RETCODE_PRICE_CHANGED: result = "Prices changed"; break; // case TRADE_RETCODE_PRICE_OFF: result = "There are no quotes to process the request"; break; // case TRADE_RETCODE_INVALID_EXPIRATION: result = "Invalid order expiration date in the request"; break; // case TRADE_RETCODE_ORDER_CHANGED: result = "Order state changed"; break; // case TRADE_RETCODE_TOO_MANY_REQUESTS: result = "Too frequent requests"; break; // case TRADE_RETCODE_NO_CHANGES: result = "No changes in request"; break; // case TRADE_RETCODE_SERVER_DISABLES_AT: result = "Autotrading disabled by server"; break; // case TRADE_RETCODE_CLIENT_DISABLES_AT: result = "Autotrading disabled by client terminal"; break; // case TRADE_RETCODE_LOCKED: result = "Request locked for processing"; break; // case TRADE_RETCODE_FROZEN: result = "Order or position frozen"; break; // case TRADE_RETCODE_INVALID_FILL: result = "Invalid order filling type"; break; // case TRADE_RETCODE_CONNECTION: result = "No connection with the trade server"; break; // case TRADE_RETCODE_ONLY_REAL: result = "Operation is allowed only for live accounts"; break; // case TRADE_RETCODE_LIMIT_ORDERS: result = "The number of pending orders has reached the limit"; break; // case TRADE_RETCODE_LIMIT_VOLUME: result = "The volume of orders and positions for the symbol has reached the limit"; break; // default: result = "Invalid return code of the trade server"; break; } // return result; }