Обработка ошибки 6 при установке отложенных ордеров - страница 2

 
ir0407:
Ну не знаю... В моей практике такого еще не было. Даже тогда, когда я сидел на старых паршивых модемных соединениях.
А в моей это случилось сегодня. Котировки поступали и была ошибка 6.
 
khorosh:

А мне кажется большей глупостью является пример Вашего кода, где при закрытии ордеров Вы так организуете цикл:

Ух ты-ы-ы... :))) И откуда это? Если у меня такое и было  то довольно давно. И по моему я тут на форуме и вопрос об этом задавал. Во всяком случае я уже давно в курсе как это делается правильно. Так что - укол не получился. :)
 
А в моей это случилось сегодня. Котировки поступали и была ошибка 6.
Это каким же нестабильным соединением надо обладать чтоб такое случилось? Как вариант, возможно, между проверкой соединения и торговой операцией есть какой нибудь долгоиграющий код? И ошибка вылазит уже после проверки соединения, но перед или во время торговой операции.
 
ir0407:
Это каким же нестабильным соединением надо обладать чтоб такое случилось? Как вариант, возможно, между проверкой соединения и торговой операцией есть какой нибудь долгоиграющий код? И ошибка вылазит уже после проверки соединения, но перед или во время торговой операции.

На мобильном GPRS было регулярно.
 
ir0407:
Ух ты-ы-ы... :))) И откуда это? Если у меня такое и было то довольно давно. И по моему я тут на форуме и вопрос об этом задавал. Во всяком случае я уже давно в курсе как это делается правильно. Так что - укол не получился. :)
Все мы когда то чего то не знали, а потом узнали. Так что не надо бросаться такими эпитетами.
 

GPRS - это такое же модемное соединение. Ну ладно, вот моя функция которую я использую практически везде. Работает вполне стабильно даже на модемных соединениях. По крайней мере у меня проблем с 6-й ошибкой не возникало.

int SendMarketOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, int& Error)
{
  double Price, Take, Stop;
  int Ticket, Slippage, Color, Err; 
  bool Delay = False;

  while(!IsStopped())
  {
    if(!IsExpertEnabled())
    {
      Error = ERR_TRADE_DISABLED;
      Print("Эксперту запрещено торговать! Кнопка \"Эксперты\" отжата.");
      return(-1);
    }
    if(!IsConnected())
    {
      Error = ERR_NO_CONNECTION;
      Print("Связь отсутствует!");
      return(-1);
    }
    if(IsTradeContextBusy())
    {
      Print("Торговый поток занят!");
      Print("Ожидаем 3 сек...");
      Sleep(3000);
      Delay = True;
      continue;
    }
    if(Delay) 
    {
      RefreshRates();
      Delay = False;
    }

    switch(Type)
    {
      case OP_BUY:
        Price = NormalizeDouble( Ask, Digits);
        Take = IIFd(TP == 0, 0, NormalizeDouble( Ask + TP * Point, Digits));
        Stop = IIFd(SL == 0, 0, NormalizeDouble( Ask - SL * Point, Digits));
        Color = Blue;
        break;
      case OP_SELL:
        Price = NormalizeDouble( Bid, Digits);
        Take = IIFd(TP == 0, 0, NormalizeDouble( Bid - TP * Point, Digits));
        Stop = IIFd(SL == 0, 0, NormalizeDouble( Bid + SL * Point, Digits));
        Color = Red;
        break;
      default:
        Print("Тип ордера не соответствует требованиям.");
        return(-1);
    }
    Slippage = MarketInfo(Symbol(), MODE_SPREAD);

    if(IsTradeAllowed())
    {
      Print("Торговля разрешена, отправляем ордер...");
      Ticket = OrderSend(Symbol(), Type, Lots, Price, Slippage, Stop, Take, Cmnt, Magic, 0, Color);
      if(Ticket < 0)
      {
        Err = GetLastError();
        if (Err == 4   || /* SERVER_BUSY */
            //Err == 130 || /* INVALID_STOPS */ 
            Err == 135 || /* PRICE_CHANGED */ 
            Err == 137 || /* BROKER_BUSY */ 
            Err == 138 || /* REQUOTE */ 
            Err == 146 || /* TRADE_CONTEXT_BUSY */
            Err == 136 )  /* OFF_QUOTES */
        {
          Print("Ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
          Print("Ожидаем 3 сек...");
          Sleep(3000);
          Delay = True;
          continue;
        }
        else
        {
          Print("Критическая ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err));
          Error = Err;
          break;
        }
      }
      break;
    }
    else
    {
      Print("Эксперту запрещено торговать! Снята галка в свойствах эксперта.");
      break;
    }
  }
  if(Ticket > 0)
    Print("Ордер отправлен успешно. Тикет = ",Ticket);
  else
    Print("Ошибка! Ордер не отправлен. (ErrorCode = ", Error, ": ", ErrorDescription(Error), ")");

  return(Ticket);
}
 
ir0407:
Это каким же нестабильным соединением надо обладать чтоб такое случилось? Как вариант, возможно, между проверкой соединения и торговой операцией есть какой нибудь долгоиграющий код? И ошибка вылазит уже после проверки соединения, но перед или во время торговой операции.

У меня выделенная линия - соединение хорошее. А причина здесь в другом. На графике был установлен тормозной индюк. И началось быстрое движение цены.

И процессору приходилось перерассчитывать индюк на каждом тике в нахлынувшем потоке котировок. А процессор слабенький - нетбук - процессор Атом N450.

Сейчас убрал этот индюк, должно быть всё нормально. Зато у нетбука малое потребление электроэнергии, у меня на нём круглосуточно работает эксперт.

А программирую на стационарном.

 
ir0407:

GPRS - это такое же модемное соединение. Ну ладно, вот моя функция которую я использую практически везде. Работает вполне стабильно даже на модемных соединениях. По крайней мере у меня проблем с 6-й ошибкой не возникало.

Надо не только фиксировать факт наличия ошибки, но и, если тип ошибки позволяет, повторить попытки открыть ордер определённое количество раз с определёнными паузами. А также принять возможные меры к восстановлению связи пересканированием серверов. Так что Ваша функция далека от совершенства и над ней ещё надо поработать.
 
А я и не говорил, что она идеальна. :)) В ней минимальный функционал, не более того (хотя задержки и повторы в ней все таки реализованы, неужели не видно?). Для серьезных вещей у меня есть подключаемая библиотека, которую используют все экземпляры советников в терминале. А их иногда может быть до 10 шт. Там все сделано более изящно. Идею в свое время подхватил у komposter здесь на сайте.
 
ir0407:

Не заморачивайся на ошибках - это следствие, а факт - это отсутсвие связи. В справке написано:

bool IsConnected(

) Возвращает

..

Функция IsConnected() не надёжна. Тестировать её начинал 2-3 года назад Игорь Ким.

Почитайте https://forum.mql4.com/ru/10488 и https://forum.mql4.com/ru/8229

Если не ошибаюсь то ничего с тех пор не изменилось.

Причина обращения: