Select() пропустил позиции, а почему? Или: чего я не вижу? - страница 2

 
Aleksei Radchenko:

Тут все просто, вы не все ошибки обрабатываете, и по остальным просто выходите из цикла, отсюда и пропуск (это причина раз)

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

Таймауты отрабатываете не следуя рекомендациям Метаквотов, рост задержки после каждой попытки это так и задумано?

Также после столь больших таймаутов я бы сделал RefreshRates, одному богу известно, обновляется ли предопределенная переменная Ask внутри тика

Проверка потока (коннект, поток, рынок) надо делать перед торговыми операциями, поскольку ответ может быть не корректен (это тоже есть в рекомендациях)

Надо также проверять уровень заморозки (Freeze) и обрабатывать ошибку - "нет ошибки, но результат не известен" (случается у некоторых брокеров) 

В любом случае, на следующем тике, не мешает перепроверить исполнение команды, путем запроса ордеров в рынке 

Предпочтительнее другой подход выполнения и контроля операций растянутых во времени:

- делаем предварительную проверку исполнимости команды 

- даем все необходимые команды

- по коду ответа определяем максимальный таймаут

- в конце тика отрабатываем таймаут

- на следующем тике проверяем реальное исполнение, при необходимости повторяем 

Прочие ошибки выводятся функцией PrintErr().

Да, счетчик позиций не сбрасывается в начальное положение - это стратегическая ошибка.

Если не затруднит, дайте, пожалуйста, ссылку на рекомендации по таймаутам? А RefreshRates() стоит!

Про проверку  потока, упустил, каюсь...

Подскажите, какие последствия дают проблемы  " уровень заморозки (Freeze) ", код ошибки =1?

Перепроверка исполнения на следующем тике - О!, Это меняет серьезно код "совы".

Понял, Вас - спасибо за столь обстоятельный ответ! 

 
fromme2you:
Я в первом посте привел фрагмент такого лога, показывая, что модификация позиций выполнялась успешно для всех 5-ти позиций, а затем закрылись только две позиции из 5-ти. Между закрытиями позиций 6 сек, что указывает на какие-то задержки, если сравнивать время между модификациями позиций.

Кода модификцаии я не видел, сравнивать не с чем.

Задержка действительно большая, но это никак не влияет на выполнение остального кода.

Судя по отсутствию каких-либо записей про остальные 3 сделки, до их закрытия просто не доходит. Иначе были бы хотя бы строки "close order" про попытку закрыть.

А сброс счетчика можно рассматривать с двух сторон - вариант с общим количеством ошибок на все закрытия тоже вполне рабочий. 

 

По таймаутам оказалось найти информацию достаточно сложно =)

Вот тут кое что есть: https://book.mql4.com/ru/trading/index 

Вот это было ооочень давно скопированно с документации по mql4, теперь найти не могу 

// Обработка ошибок по коду в соответствии с рекомендациями
void Err(int id)
{
        switch (id) {
                case 4 :
                case 132 :
                        timeout = fmax(timeout, 60000);
                        break;
                case 6 :
                case 129 :
                case 130 :
                case 136 :
                        timeout = fmax(timeout, 5000);
                        break;
                case 128 :
                case 142 :
                case 143 :
                        timeout = fmax(timeout, 60000);
                        break;
                case 145 :
                        timeout = fmax(timeout, 15000);
                        break;
                case 146 :
                        timeout = fmax(timeout, 10000);
                        break;
        }
}

 Вот тут еще есть пример, но таймауты уже не правильные: https://book.mql4.com/ru/samples/expert, возможно со временем рекомендации изменились

Уровень заморозки ордеров в пунктах. Если цена исполнения находится в пределах, определяемых уровнем заморозки, то ордер не может быть модифицирован, отменен или закрыт.

Вот тут основные ограничения по заморозке: https://book.mql4.com/ru/appendix/limits 

Торговые операции - Учебник по MQL4
  • book.mql4.com
Торговые операции - Учебник по MQL4