- нужна помощь
- Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6.
- переменная не определена
1. Нумерация ордеров в списке открытых позиций начинается с нуля, а не с 1.
2. OrdersTotal показывает количество ордеров, а не индекс последнего ордера в списке. Индекс последнего ордера - OrdersTotal()-1.
3. При выборе ордера используется переменная i, последний раз задействованная в цикле перебора ордеров. В итоге она стала равна OrdersTotal()+1. такого ордера не может быть в списке.
Это только при беглом рассмотрении.
P.S. Что Вы хотели получить, используя функцию OrderCloseTime в качестве оператора?
1. Нумерация ордеров в списке открытых позиций начинается с нуля, а не с 1.
2. OrdersTotal показывает количество ордеров, а не индекс последнего ордера в списке. Индекс последнего ордера - OrdersTotal()-1.
3. При выборе ордера используется переменная i, последний раз задействованная в цикле перебора ордеров. В итоге она стала равна OrdersTotal()+1. такого ордера не может быть в списке.
Это только при беглом рассмотрении.
P.S. Что Вы хотели получить, используя функцию OrderCloseTime в качестве оператора?
время закрытия ордера
время закрытия ордера
Здравствуйте уважаемые. Проблема в следующем не закрывается ордер по команде OrderClose подскажите пож. в чем я ошибся.
Дмитрий, у вас логически неправильно организован цикл перебора ордеров. Вот смотрите как у Вас:
for(int i=1; i<=OrdersTotal(); i++) { //здесь закрывается один ордер }
Прежде всего нумерация ордеров в списке открытых начинается с нуля, как верно заметил Scriptong
Исправляем:
for(int i=0; i<=OrdersTotal(); i++) { //здесь закрывается один ордер }
Теперь далее. Допустим у нас есть несколько открытых ордеров, ну скажем 5. Запуская наш цикл перебора мы закрываем ордер, идущий в списке под номером 0. При следующей итерации i увеличится на 1 и будет указывать, как нам кажется, на второй ордер в списке. На самом деле это не так. Как только мы удалили ордер номер 0, список ордеров уменьшился, и следующий за ним ордер получил номер 0, а третий ордер сдвинулся на позицию 1 (его то мы и удалим во второй итерации нашего цикла перескочив через один ордер). Это логическая ошибка, возникающая вследствие того, что при каждой итерации цикла у нас изменяются не одна, а две величины: индекс цикла(списка ордеров) и сам список ордеров(уменьшается).
Чтобы избежать такой ситуации, следует использовать другую форму цикла перебора ордеров:
for(i=OrdersTotal()-1;i>=0;i--) { //здесь удаляем ордер }
Теперь мы гарантированно сможем выбрать каждый ордер в списке и сделать с ним все что захотим (ну почти).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования