Ошибка 148 (MT4)

 

Пытаюсь сделать обновление своего программного продукта.

При автоматическом тестировании все отлично - ошибок нету.

А вот от модераторов пришел ответ

2017.05.30 13:23:43.217    2016.01.07 20:00:00  JumperPro XAGUSD,H1: OrderSend error 148

Я добавил проверку по AccountInfoInteger(ACCOUNT_LIMIT_ORDERS).

Хотя, как написано в документации, это максимально количество ОТЛОЖЕННЫХ ордеров.

У меня они не используются. Использую только РЫНОЧНЫЕ (BUY и SELL).

Все равно ошибка повторяется. Как минимум по одному из символов (EURUSD) ошибки нету.

Сколько ни тестировал различных брокеров, AccountInfoInteger(ACCOUNT_LIMIT_ORDERS) везде выдает не менее 50.    

Где еще нужна проверка? и какая проверка? 

 
Uladzimir Kirychenka:

Пытаюсь сделать обновление своего программного продукта.

При автоматическом тестировании все отлично - ошибок нету.

А вот от модераторов пришел ответ

2017.05.30 13:23:43.217    2016.01.07 20:00:00  JumperPro XAGUSD,H1: OrderSend error 148

Я добавил проверку по AccountInfoInteger(ACCOUNT_LIMIT_ORDERS).

Хотя, как написано в документации, это максимально количество ОТЛОЖЕННЫХ ордеров.

У меня в справочнике написано так: 

Количество открытых и отложенных ордеров достигло предела, установленного брокером


Таким образом, речь идет именно обо всех ордерах.

У меня они не используются. Использую только РЫНОЧНЫЕ (BUY и SELL).

Все равно ошибка повторяется. Как минимум по одному из символов (EURUSD) ошибки нету.

Сколько ни тестировал различных брокеров, AccountInfoInteger(ACCOUNT_LIMIT_ORDERS) везде выдает не менее 50.    

Где еще нужна проверка? и какая проверка? 

Перед открытием/установкой любого ордера нужно провести такую проверку. Если предел достигнут, то разово выдать в журнал сообщение о невозможности открытия ордера. Потом, когда ордер можно будет открыть, сбросить флаг выдачи сообщения, чтобы в следующий раз при такой ситуации вновь один раз написать в журнале об ошибке.
 

Вот примерный код

long     maxcount;

int OnInit() {  

   // делаем что-то

   maxcount = MathMin(13, AccountInfoInteger(ACCOUNT_LIMIT_ORDERS));

   if (maxcount == 0) maxcount = 13;

   // делаем что-то

}


void OnTick () {

   // делаем что-то

   int count = 0;

   for (int i = 0; i < OrdersTotal(); i++) {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && (OrderCloseTime() == 0)) {

         count++;

         if (OrderSymbol() != Symbol()) continue;

         // делаем что-то

      }

   } 

   // делаем что-то

   if (count >= maxcount) return;

   // БЛОК ОТКРЫТИЯ ОРДЕРОВ

}

 
Uladzimir Kirychenka:

Вот примерный код

long     maxcount;

int OnInit() {  

   // делаем что-то

   maxcount = MathMin(13, AccountInfoInteger(ACCOUNT_LIMIT_ORDERS));

   if (maxcount == 0) maxcount = 13;

   // делаем что-то

}

Вторая часть по сути верная. В первой части мешает вот это:

if (maxcount == 0) maxcount = 13;

Ведь если не удалось получить значение лимита, то это ошибка. В таком случае нельзя запускать эксперт вообще:

if (maxcount == 0)
{
   Alert("Фатальная ошибка терминала - лимит ордеров не установлен.");
   return INIT_FAILED;
}
 
Ihor Herasko:

Вторая часть по сути верная. В первой части мешает вот это:

Ведь если не удалось получить значение лимита, то это ошибка. В таком случае нельзя запускать эксперт вообще:


А где написано, что 0 это ошибка?

Наоборот - 0 ОГРАНИЧЕНИЙ НЕТ 


ACCOUNT_LIMIT_ORDERS

Максимально допустимое количество действующих отложенных ордеров (0-ограничений нет)

 
Uladzimir Kirychenka:


А где написано, что 0 это ошибка?

Когда терминал возвращает 0 в размере пункта, то в документации тоже нигде не написано, что это ошибка. Пользуемся чисто здравым смыслом.

Uladzimir Kirychenka:


Наоборот - 0 ОГРАНИЧЕНИЙ НЕТ 


Я пока не видел бесконечной памяти ни у одного компьютера. Поэтому именно здесь не верю тому, что написано в документации. Есть большая вероятность того, что это поле попросту не заполнено на стороне сервера. Таким образом, это ошибка.
 
Ihor Herasko:

Когда терминал возвращает 0 в размере пункта, то в документации тоже нигде не написано, что это ошибка. Пользуемся чисто здравым смыслом.


Я пока не видел бесконечной памяти ни у одного компьютера. Поэтому именно здесь не верю тому, что написано в документации. Есть большая вероятность того, что это поле попросту не заполнено на стороне сервера. Таким образом, это ошибка.

Есть логика в ваших словах. Попробую. Результат сообщу позже.
 
0 == 200 по умолчанию со стороны сервера...
 
Ноль там или нет, в любом разе нужно иметь код который при получении err 148 запоминает реальное число. У вас же наверняка есть функция обработки ошибок, в неё и вставить. У меня так
 
Uladzimir Kirychenka:


ACCOUNT_LIMIT_ORDERS

Максимально допустимое количество действующих отложенных ордеров (0-ограничений нет)


Кстати, по-моему уже поднималась тема о том, что в справке допущена неточность. Точный вариант такой:

ACCOUNT_LIMIT_ORDERS

Максимально допустимое количество действующих и отложенных ордеров (0-ограничений нет)


Но пока воз и ныне там...
 

Как и обещал делюсь результатом:

Похоже настроено, что количество ордеров должно быть не более AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)-1. Потому что при открытии AccountInfoInteger(ACCOUNT_LIMIT_ORDERS) ордера уже сообщает об ошибке.

Например: если AccountInfoInteger(ACCOUNT_LIMIT_ORDERS) возвращает 10, то при открытии 10 (а не 11 !!!!) ордера уже ошибка. Может это особенность работы с металлами, может есть еще какой-то скрытый ордер для внутреннего использования.