О причинах возникновения некоторых критических ошибок.

 

Интересуют следующие ошибки #2, #9 и #141, причины возникновения, следствия и пути устранения.

Если кто сталкивался и имеет представления об этих ошибках то поделитесь информацией.

Или пусть разработчики прольют свет...

 
141 может тральщик вызвать на быстром рынке. Решение - шаг трала более 1 пункта.
 
KimIV:
141 может тральщик вызвать на быстром рынке. Решение - шаг трала более 1 пункта.

Спасибо, но самая загадочная #2, общая ошибка, что за общая не понятно.
 
А как её обработать, остановить эксперт или достаточно сделать паузу и торговать дальше.
 

Я для себя как-то давненько на основе инфы отсюда делал такую табличку

 

Чем краснее строка, тем критичнее ошибка... 

 
Слева столбцы, в них буквы M и S означают обработку ошибок после исполнения функций OrderModify() и OrderSend() соответственно.
 
Спасибо.
 
KimIV:

Я для себя как-то давненько на основе инфы отсюда делал такую табличку

Чем краснее строка, тем критичнее ошибка... 

спасибо, полезная расшифровка, еще бы функицю-логер которая бы в зависимости от настройки в файл или в принт выводила бы эту инфу, примерно как:

133 | Critical  error = Торговля запрещена | advice = Прекратить попытки | action = блокировка советника | pause= -1

может быть будет проще отлаживать программы на mql4 для начинающих, вставил в проблемный участок LogError(GetLastError()); и сразу распринтовка пошла 

 

нет ничего проще..

пишете что-типа..


void ErrorBlock(bool show, int& err, string& msg){ 
    err = GetLastError();
    switch (err) {
    case 0:
        err = ERR_NOERROR;break;
    case 1:
        msg = "Ошибка ERR_NO_ERROR (" + err + "): Данные параметры были выставлены ранее.";
        if (show) Print(msg);
        err = ERR_SKIP;break;
    case 2:
        msg = "Ошибка ERR_COMMON_ERROR (" + err + "): Сбой системы. Перезагрузить компьютер/проверить сервер.";
        if (show) Print(msg);
        err = ERR_FATAL;break;
    //case и т.д.
    }
}

где


Параметры:                     
    show            - выводить/не выводить сообщение об ошибке на консоль
    err         - уровень критичности ошибки                    
                      ERR_NOERROR - нет ошибки,                             
                      ERR_WAITING - надо ждать и обновлять,                 
                      ERR_SKIP - операция бракуется,                        
                      ERR_FATAL - фатальная ошибка                          
    msg         - сообщение содержащее информацию об ошибке     
 

Можно так:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                         |
//+-----------------------------------------------------------------------------------+
//|        Функция обрабатывает ошибки                       |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fErrorHandling (int fi_Error, bool& fb_InvalidSTOP)
{   
//----
    if (fi_Error == 0) return (true);
    switch (fi_Error)
    {
        case 4:   /*ERR_SERVER_BUSY*/
        case 137: /*ERR_BROKER_BUSY*/
        case 139: /*ERR_ORDER_LOCKED*/
        case 146: /*ERR_TRADE_CONTEXT_BUSY*/ Sleep (500); return (false);
        case 6:   /*ERR_NO_CONNECTION*/ fReConnect(); Sleep (1000); return (false);
        case 135: /*ERR_PRICE_CHANGED*/ 
        case 136: /*ERR_OFF_QUOTES*/
        case 138: /*ERR_REQUOTE*/ Sleep (1); return (false);
        case 129: /*ERR_INVALID_PRICE*/
        case 130: /*ERR_INVALID_STOPS*/ fb_InvalidSTOP = true; return (false);
        case 128: /*ERR_TRADE_TIMEOUT*/
        case 142: /*Ордер поставлен в очередь.*/
        case 143: /*Ордер принят дилером к исполнению.*/
            Sleep (5000);
            int li_Ticket = fGet_TicketLastOrder (-1);
            if (li_Ticket > 0)
            {
                OrderSelect (li_Ticket, SELECT_BY_TICKET);
                if (OrderOpenTime() >= bdt_curTime)
                {
                    fWrite_Log (StringConcatenate ("Ошибка № ", fi_Error, " - ", ErrorDescription (fi_Error), ": ордер[", li_Ticket, "] уже открыт !!!"), bi_indERR);
                    return (true);
                }
            }
            return (false);
        case 4109: /*ERR_TRADE_NOT_ALLOWED*/
            Alert ("TRADE NOT ALLOWED ! SWITCH ON option \' Allow live trading\' (Необходимо включить опцию \'Разрешить советнику торговать\')");
            return (true);
        default: fWrite_Log (StringConcatenate ("Order[", OrderTicket(), "]: Критическая ошибка № ", fi_Error, " - ", ErrorDescription (fi_Error)), bi_indERR); return (true);
    }
//----
    return (true);
}
Размеры Sleep() на любителя.
Причина обращения: