Files
xMQL5/MQLTestWorkspace/XBEEA/14030224/Libraries/x-saherelm.log.lib.mq5
T
2024-05-13 18:21:02 +03:30

1089 lines
23 KiB
Plaintext

///////////////////////////////////////////////////////
//
// 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 ...
//
//
// Including Models ...
#include "x-saherelm.models.lib.mq5"
//
// 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;
}