872 lines
56 KiB
MQL5
872 lines
56 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Common.mqh |
|
|
//| Copyright 2014, MetaQuotes Software Corp. |
|
|
//| http://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2014, MetaQuotes Software Corp."
|
|
#property link "http://www.mql5.com"
|
|
//#property strict
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Define |
|
|
//+------------------------------------------------------------------+
|
|
#define CUSTOM_ERROR_FIRST ERR_USER_ERROR_FIRST
|
|
#define ERR_JSON_PARSING ERR_USER_ERROR_FIRST+1
|
|
#define ERR_JSON_NOT_OK ERR_USER_ERROR_FIRST+2
|
|
#define ERR_TOKEN_ISEMPTY ERR_USER_ERROR_FIRST+3
|
|
#define ERR_RUN_LIMITATION ERR_USER_ERROR_FIRST+4
|
|
//---
|
|
#define ERR_NOT_ACTIVE ERR_USER_ERROR_FIRST+100
|
|
#define ERR_NOT_CONNECTED ERR_USER_ERROR_FIRST+101
|
|
#define ERR_ORDER_SELECT ERR_USER_ERROR_FIRST+102
|
|
#define ERR_INVALID_ORDER_TYPE ERR_USER_ERROR_FIRST+103
|
|
#define ERR_INVALID_SYMBOL_NAME ERR_USER_ERROR_FIRST+104
|
|
#define ERR_INVALID_EXPIRATION_TIME ERR_USER_ERROR_FIRST+105
|
|
#define ERR_HTTP_ERROR_FIRST ERR_USER_ERROR_FIRST+1000 //+511
|
|
//+------------------------------------------------------------------+
|
|
//| ENUM_LANGUAGES |
|
|
//+------------------------------------------------------------------+
|
|
enum ENUM_LANGUAGES
|
|
{
|
|
LANGUAGE_EN,// English
|
|
LANGUAGE_RU // Russian
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| ENUM_UPDATE_MODE |
|
|
//+------------------------------------------------------------------+
|
|
enum ENUM_UPDATE_MODE
|
|
{
|
|
UPDATE_FAST, //Fast
|
|
UPDATE_NORMAL, //Normal
|
|
UPDATE_SLOW, //Slow
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| ENUM_RUN_MODE |
|
|
//+------------------------------------------------------------------+
|
|
enum ENUM_RUN_MODE
|
|
{
|
|
RUN_OPTIMIZATION,
|
|
RUN_VISUAL,
|
|
RUN_TESTER,
|
|
RUN_LIVE
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| GetRunMode |
|
|
//+------------------------------------------------------------------+
|
|
ENUM_RUN_MODE GetRunMode(void)
|
|
{
|
|
if(MQLInfoInteger(MQL_OPTIMIZATION))
|
|
|
|
return(RUN_OPTIMIZATION);
|
|
if(MQLInfoInteger(MQL_VISUAL_MODE))
|
|
return(RUN_VISUAL);
|
|
if(MQLInfoInteger(MQL_TESTER))
|
|
return(RUN_TESTER);
|
|
return(RUN_LIVE);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| ENUM_ERROR_LEVEL |
|
|
//+------------------------------------------------------------------+
|
|
enum ENUM_ERROR_LEVEL
|
|
{
|
|
LEVEL_INFO,
|
|
LEVEL_WARNING,
|
|
LEVEL_ERROR,
|
|
LEVEL_CRITICAL
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| CustomInfo |
|
|
//+------------------------------------------------------------------+
|
|
struct CustomInfo
|
|
{
|
|
string text1;
|
|
string text2;
|
|
color colour;
|
|
ENUM_ERROR_LEVEL level;
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| ErrorInfo |
|
|
//+------------------------------------------------------------------+
|
|
struct ErrorInfo
|
|
{
|
|
int code;
|
|
string desc;
|
|
ENUM_ERROR_LEVEL level;
|
|
ENUM_LANGUAGES lang;
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| GetErrorInfo |
|
|
//+------------------------------------------------------------------+
|
|
bool GetErrorInfo(ErrorInfo &info)
|
|
{
|
|
|
|
info.level=LEVEL_INFO;
|
|
|
|
if(info.lang==LANGUAGE_EN)
|
|
{
|
|
|
|
switch(info.code)
|
|
{
|
|
case ERR_NOT_CONNECTED:
|
|
info.desc="No connection with server";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_JSON_PARSING:
|
|
info.desc="JSON parsing error";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_JSON_NOT_OK:
|
|
info.desc="JSON parsing not OK";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TOKEN_ISEMPTY:
|
|
info.desc="Token is empty";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_RUN_LIMITATION:
|
|
info.desc="The bot does not run in tester mode";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
|
|
case ERR_WEBREQUEST_INVALID_ADDRESS:
|
|
info.desc="Invalid URL";
|
|
break;
|
|
case ERR_WEBREQUEST_CONNECT_FAILED:
|
|
info.desc="Failed to connect to specified URL";
|
|
break;
|
|
case ERR_WEBREQUEST_TIMEOUT:
|
|
info.desc="Timeout exceeded";
|
|
break;
|
|
case ERR_WEBREQUEST_REQUEST_FAILED:
|
|
info.desc="HTTP request failed";
|
|
break;
|
|
|
|
#ifdef __MQL4__
|
|
case ERR_FUNCTION_NOT_CONFIRMED:
|
|
info.desc="URL does not allowed for WebRequest";
|
|
break;
|
|
#endif
|
|
|
|
#ifdef __MQL5__
|
|
case ERR_FUNCTION_NOT_ALLOWED:
|
|
info.desc="URL does not allowed for WebRequest";
|
|
break;
|
|
case ERR_FILE_NOT_EXIST:
|
|
info.desc="File is not exists";
|
|
break;
|
|
case ERR_CHART_NOT_FOUND:
|
|
info.desc="Chart not found";
|
|
break;
|
|
case ERR_SUCCESS:
|
|
info.desc="The operation completed successfully";
|
|
break;
|
|
#endif
|
|
//---
|
|
case ERR_HTTP_ERROR_FIRST+100:
|
|
info.desc="Continue";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+101:
|
|
info.desc="Switching Protocols";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+103:
|
|
info.desc="Checkpoint";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+200:
|
|
info.desc="OK";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+201:
|
|
info.desc="Created";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+202:
|
|
info.desc="Accepted";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+203:
|
|
info.desc="Non-Authoritative Information";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+204:
|
|
info.desc="No Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+205:
|
|
info.desc="Reset Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+206:
|
|
info.desc="Partial Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+300:
|
|
info.desc="Multiple Choices";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+301:
|
|
info.desc="Moved Permanently";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+302:
|
|
info.desc="Found";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+303:
|
|
info.desc="See Other";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+304:
|
|
info.desc="Not Modified";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+306:
|
|
info.desc="Switch Proxy";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+307:
|
|
info.desc="Temporary Redirect";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+308:
|
|
info.desc="Resume Incomplete";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+400:
|
|
info.desc="Bad Request";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+401:
|
|
info.desc="Unauthorized";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+402:
|
|
info.desc="Payment Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+403:
|
|
info.desc="Forbidden";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+404:
|
|
info.desc="Not Found";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+405:
|
|
info.desc="Method Not Allowed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+406:
|
|
info.desc="Not Acceptable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+407:
|
|
info.desc="Proxy Authentication Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+408:
|
|
info.desc="Request Timeout";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+409:
|
|
info.desc="Conflict";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+410:
|
|
info.desc="Gone";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+411:
|
|
info.desc="Length Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+412:
|
|
info.desc="Precondition Failed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+413:
|
|
info.desc="Request Entity Too Large";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+414:
|
|
info.desc="Request-URI Too Long";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+415:
|
|
info.desc="Unsupported Media Type";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+416:
|
|
info.desc="Requested Range Not Satisfiable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+417:
|
|
info.desc="Expectation Failed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+500:
|
|
info.desc="Internal Server Error";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+501:
|
|
info.desc="Not Implemented";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+502:
|
|
info.desc="Bad Gateway";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+503:
|
|
info.desc="Service Unavailable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+504:
|
|
info.desc="Gateway Timeout";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+505:
|
|
info.desc="HTTP Version Not Supported";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+511:
|
|
info.desc="Network Authentication Required";
|
|
break;
|
|
|
|
//--- The error codes returned by trade server:
|
|
#ifdef __MQL4__
|
|
case ERR_NO_ERROR:
|
|
info.desc="No error";
|
|
break;
|
|
case ERR_NO_RESULT:
|
|
info.desc="No error returned, but the result is unknown";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_COMMON_ERROR:
|
|
info.desc="Common error.";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_TRADE_PARAMETERS:
|
|
info.desc="Invalid trade parameters";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_SERVER_BUSY:
|
|
info.desc="Trade server is busy";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_OLD_VERSION:
|
|
info.desc="Old version of the client terminal";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_NO_CONNECTION:
|
|
info.desc="No connection with trade server";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_NOT_ENOUGH_RIGHTS:
|
|
info.desc="Not enough rights";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TOO_FREQUENT_REQUESTS:
|
|
info.desc="Too frequent requests";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_MALFUNCTIONAL_TRADE:
|
|
info.desc="Malfunctional trade operation";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_ACCOUNT_DISABLED:
|
|
info.desc="Account disabled";
|
|
info.level= LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_ACCOUNT:
|
|
info.desc="Invalid account";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_TIMEOUT:
|
|
info.desc="Trade timeout";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_PRICE:
|
|
info.desc="Invalid price";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_STOPS:
|
|
info.desc="Invalid stops";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_TRADE_VOLUME:
|
|
info.desc="Invalid trade volume";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_MARKET_CLOSED:
|
|
info.desc="Market is closed";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_DISABLED:
|
|
info.desc="Trade is disabled";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_NOT_ENOUGH_MONEY:
|
|
info.desc="Not enough money";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_PRICE_CHANGED:
|
|
info.desc="Price changed";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_OFF_QUOTES:
|
|
info.desc="Off quotes";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_BROKER_BUSY:
|
|
info.desc="Broker is busy";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_REQUOTE:
|
|
info.desc="Requote";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_ORDER_LOCKED:
|
|
info.desc="Order is locked";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_LONG_POSITIONS_ONLY_ALLOWED:
|
|
info.desc="Long positions only allowed";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TOO_MANY_REQUESTS:
|
|
info.desc="Too many requests";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_MODIFY_DENIED:
|
|
info.desc="Modification denied because order too close to market";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_CONTEXT_BUSY:
|
|
info.desc="Trade context is busy";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_EXPIRATION_DENIED:
|
|
info.desc="Expirations are denied by broker";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_TOO_MANY_ORDERS:
|
|
info.desc="The amount of open and pending orders has reached the limit set by the broker";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_HEDGE_PROHIBITED:
|
|
info.desc="An attempt to open a position opposite to the existing one when hedging is disabled";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_PROHIBITED_BY_FIFO:
|
|
info.desc="An attempt to close a position contravening the FIFO rule";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
//--- MQL4 run time error codes
|
|
case ERR_TRADE_NOT_ALLOWED:
|
|
info.desc="Trade is not allowed. Enable checkbox (Allow live trading) in the expert properties";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_LONGS_NOT_ALLOWED:
|
|
info.desc="Longs are not allowed. Check the expert properties";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_SHORTS_NOT_ALLOWED:
|
|
info.desc="Shorts are not allowed. Check the expert properties";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
#endif
|
|
|
|
//---
|
|
case ERR_INVALID_ORDER_TYPE:
|
|
info.desc="Invalid order type";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_SYMBOL_NAME:
|
|
info.desc="Invalid symbol name";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_EXPIRATION_TIME:
|
|
info.desc="Invalid expiration time";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_ORDER_SELECT:
|
|
info.desc="Error function OrderSelect()";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
//---
|
|
|
|
default:
|
|
info.desc="Unknown error "+IntegerToString(info.code);
|
|
return(false);
|
|
|
|
}
|
|
}
|
|
|
|
//---
|
|
if(info.lang==LANGUAGE_RU)
|
|
{
|
|
switch(info.code)
|
|
{
|
|
case ERR_NOT_ACTIVE:
|
|
info.desc="Нет лицензии";
|
|
break;
|
|
case ERR_NOT_CONNECTED:
|
|
info.desc="Нет соединения с торговым сервером";
|
|
break;
|
|
|
|
case ERR_JSON_PARSING:
|
|
info.desc="Ошибка JSON структуры ответа";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_JSON_NOT_OK:
|
|
info.desc="Парсинг JSON завершен с ошибкой";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TOKEN_ISEMPTY:
|
|
info.desc="Токен-пустая строка";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_RUN_LIMITATION:
|
|
info.desc="Бот не работает в тестере стратегий";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
|
|
//---
|
|
case ERR_WEBREQUEST_INVALID_ADDRESS:
|
|
info.desc="URL не прошел проверку";
|
|
break;
|
|
case ERR_WEBREQUEST_CONNECT_FAILED:
|
|
info.desc="Не удалось подключиться к указанному URL";
|
|
break;
|
|
case ERR_WEBREQUEST_TIMEOUT:
|
|
info.desc="Превышен таймаут получения данных";
|
|
break;
|
|
case ERR_WEBREQUEST_REQUEST_FAILED:
|
|
info.desc="Ошибка в результате выполнения HTTP запроса";
|
|
break;
|
|
|
|
#ifdef __MQL4__
|
|
case ERR_FUNCTION_NOT_CONFIRMED:
|
|
info.desc="URL нет в списке для WebRequest";
|
|
break;
|
|
#endif
|
|
|
|
#ifdef __MQL5__
|
|
case ERR_FUNCTION_NOT_ALLOWED:
|
|
info.desc="URL нет в списке для WebRequest";
|
|
break;
|
|
case ERR_FILE_NOT_EXIST:
|
|
info.desc="Файла не существует";
|
|
break;
|
|
case ERR_CHART_NOT_FOUND:
|
|
info.desc="График не найден";
|
|
break;
|
|
case ERR_SUCCESS:
|
|
info.desc="Операция выполнена успешно";
|
|
break;
|
|
#endif
|
|
//---
|
|
case ERR_HTTP_ERROR_FIRST+100:
|
|
info.desc="Continue";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+101:
|
|
info.desc="Switching Protocols";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+103:
|
|
info.desc="Checkpoint";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+200:
|
|
info.desc="OK";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+201:
|
|
info.desc="Created";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+202:
|
|
info.desc="Accepted";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+203:
|
|
info.desc="Non-Authoritative Information";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+204:
|
|
info.desc="No Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+205:
|
|
info.desc="Reset Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+206:
|
|
info.desc="Partial Content";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+300:
|
|
info.desc="Multiple Choices";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+301:
|
|
info.desc="Moved Permanently";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+302:
|
|
info.desc="Found";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+303:
|
|
info.desc="See Other";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+304:
|
|
info.desc="Not Modified";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+306:
|
|
info.desc="Switch Proxy";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+307:
|
|
info.desc="Temporary Redirect";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+308:
|
|
info.desc="Resume Incomplete";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+400:
|
|
info.desc="Bad Request";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+401:
|
|
info.desc="Unauthorized";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+402:
|
|
info.desc="Payment Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+403:
|
|
info.desc="Forbidden";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+404:
|
|
info.desc="Not Found";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+405:
|
|
info.desc="Method Not Allowed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+406:
|
|
info.desc="Not Acceptable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+407:
|
|
info.desc="Proxy Authentication Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+408:
|
|
info.desc="Request Timeout";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+409:
|
|
info.desc="Conflict";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+410:
|
|
info.desc="Gone";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+411:
|
|
info.desc="Length Required";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+412:
|
|
info.desc="Precondition Failed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+413:
|
|
info.desc="Request Entity Too Large";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+414:
|
|
info.desc="Request-URI Too Long";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+415:
|
|
info.desc="Unsupported Media Type";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+416:
|
|
info.desc="Requested Range Not Satisfiable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+417:
|
|
info.desc="Expectation Failed";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+500:
|
|
info.desc="Internal Server Error";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+501:
|
|
info.desc="Not Implemented";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+502:
|
|
info.desc="Bad Gateway";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+503:
|
|
info.desc="Service Unavailable";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+504:
|
|
info.desc="Gateway Timeout";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+505:
|
|
info.desc="HTTP Version Not Supported";
|
|
break;
|
|
case ERR_HTTP_ERROR_FIRST+511:
|
|
info.desc="Network Authentication Required";
|
|
break;
|
|
|
|
//---
|
|
#ifdef __MQL4__
|
|
case ERR_NO_ERROR:
|
|
info.desc="Нет ошибки";
|
|
break;
|
|
case ERR_NO_RESULT:
|
|
info.desc="Нет ошибки, но результат неизвестен";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_COMMON_ERROR:
|
|
info.desc="Общая ошибка";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_TRADE_PARAMETERS:
|
|
info.desc="Неправильные параметры";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_SERVER_BUSY:
|
|
info.desc="Торговый сервер занят";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_OLD_VERSION:
|
|
info.desc="Старая версия клиентского терминала";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_NO_CONNECTION:
|
|
info.desc="Нет связи с торговым сервером";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_NOT_ENOUGH_RIGHTS:
|
|
info.desc="Недостаточно прав";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TOO_FREQUENT_REQUESTS:
|
|
info.desc="Слишком частые запросы";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_MALFUNCTIONAL_TRADE:
|
|
info.desc="Недопустимая операция нарушающая функционирование сервера";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_ACCOUNT_DISABLED:
|
|
info.desc="Счет заблокирован";
|
|
info.level= LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_ACCOUNT:
|
|
info.desc="Неправильный номер счета";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_TIMEOUT:
|
|
info.desc="Истек срок ожидания совершения сделки";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_PRICE:
|
|
info.desc="Неправильная цена";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_STOPS:
|
|
info.desc="Неправильные стопы";
|
|
info.level= LEVEL_WARNING;
|
|
break;
|
|
case ERR_INVALID_TRADE_VOLUME:
|
|
info.desc="Неправильный объем";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_MARKET_CLOSED:
|
|
info.desc="Рынок закрыт";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_DISABLED:
|
|
info.desc="Торговля запрещена";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_NOT_ENOUGH_MONEY:
|
|
info.desc="Недостаточно денег для совершения операции";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_PRICE_CHANGED:
|
|
info.desc="Цена изменилась";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_OFF_QUOTES:
|
|
info.desc="Нет цен";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_BROKER_BUSY:
|
|
info.desc="Брокер занят";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_REQUOTE:
|
|
info.desc="Новые цены";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_ORDER_LOCKED:
|
|
info.desc="Ордер заблокирован и уже обрабатывается";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_LONG_POSITIONS_ONLY_ALLOWED:
|
|
info.desc="Разрешена только покупка";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TOO_MANY_REQUESTS:
|
|
info.desc="Слишком много запросов";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_MODIFY_DENIED:
|
|
info.desc="Модификация запрещена, так как ордер слишком близок к рынку";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_CONTEXT_BUSY:
|
|
info.desc="Подсистема торговли занята";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_EXPIRATION_DENIED:
|
|
info.desc="Использование даты истечения ордера запрещено брокером";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_TRADE_TOO_MANY_ORDERS:
|
|
info.desc="Количество открытых и отложенных ордеров достигло предела, установленного брокером.";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_HEDGE_PROHIBITED:
|
|
info.desc="Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_TRADE_PROHIBITED_BY_FIFO:
|
|
info.desc="Попытка закрыть позицию по инструменту в противоречии с правилом FIFO";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
//--- MQL4 run time error codes
|
|
case ERR_TRADE_NOT_ALLOWED:
|
|
info.desc="Торговля не разрешена. Необходимо включить опцию `Разрешить советнику торговать` в свойствах эксперта";
|
|
info.level=LEVEL_WARNING;
|
|
break;
|
|
case ERR_LONGS_NOT_ALLOWED:
|
|
info.desc="Ордера на покупку не разрешены. Необходимо проверить свойства эксперта";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_SHORTS_NOT_ALLOWED:
|
|
info.desc="Ордера на продажу не разрешены. Необходимо проверить свойства эксперта";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
#endif
|
|
//--- торговые
|
|
case ERR_INVALID_ORDER_TYPE:
|
|
info.desc="Неправильный тип ордера";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_SYMBOL_NAME:
|
|
info.desc="Неправильное имя инструмента";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_INVALID_EXPIRATION_TIME:
|
|
info.desc="Неправильное время экспирации";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
case ERR_ORDER_SELECT:
|
|
info.desc="Ошибка функции OrderSelect()";
|
|
info.level=LEVEL_ERROR;
|
|
break;
|
|
|
|
//---
|
|
default:
|
|
info.desc="Неизвестная ошибка "+IntegerToString(info.code);
|
|
return(false);
|
|
}
|
|
}
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
string GetErrorDescription(const int _error_code,
|
|
const ENUM_LANGUAGES _language=LANGUAGE_EN)
|
|
{
|
|
ErrorInfo info;
|
|
info.code=_error_code;
|
|
info.lang=_language;
|
|
|
|
GetErrorInfo(info);
|
|
|
|
return(info.desc);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
ENUM_ERROR_LEVEL GetErrorLevel(const int _error_code)
|
|
{
|
|
ErrorInfo info;
|
|
info.code=_error_code;
|
|
info.lang=LANGUAGE_EN;
|
|
|
|
GetErrorInfo(info);
|
|
return(info.level);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| PrintError |
|
|
//+------------------------------------------------------------------+
|
|
ENUM_ERROR_LEVEL PrintError(int _error_code,const ENUM_LANGUAGES _lang=LANGUAGE_EN)
|
|
{
|
|
ErrorInfo info;
|
|
info.code=_error_code;
|
|
info.lang=_lang;
|
|
//---
|
|
GetErrorInfo(info);
|
|
//---
|
|
if(_lang==LANGUAGE_RU)
|
|
printf("Ошибка: %s",info.desc);
|
|
else
|
|
printf("Error: %s",info.desc);
|
|
//---
|
|
return(info.level);
|
|
}
|
|
//+------------------------------------------------------------------+
|