Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй статьи и увеличивай свой рейтинг!
dimarik0000
164
dimarik0000 2012.11.01 16:46 
Здравствуйте уважаемые. Проблема в следующем не закрывается ордер по команде OrderClose подскажите пож. в чем я ошибся. 
Файлы:
proga1_1.mq4 4 kb
Ihor Herasko
8468
Ihor Herasko 2012.11.01 16:53  

1. Нумерация ордеров в списке открытых позиций начинается с нуля, а не с 1. 

2. OrdersTotal показывает количество ордеров, а не индекс последнего ордера в списке. Индекс последнего ордера - OrdersTotal()-1.

3. При выборе ордера используется переменная i, последний раз задействованная в цикле перебора ордеров. В итоге она стала равна OrdersTotal()+1. такого ордера не может быть в списке.

 

Это только при беглом рассмотрении.

P.S. Что Вы хотели получить, используя функцию OrderCloseTime в качестве оператора? 

dimarik0000
164
dimarik0000 2012.11.01 16:56  
Scriptong:

1. Нумерация ордеров в списке открытых позиций начинается с нуля, а не с 1. 

2. OrdersTotal показывает количество ордеров, а не индекс последнего ордера в списке. Индекс последнего ордера - OrdersTotal()-1.

3. При выборе ордера используется переменная i, последний раз задействованная в цикле перебора ордеров. В итоге она стала равна OrdersTotal()+1. такого ордера не может быть в списке.

 

Это только при беглом рассмотрении.

P.S. Что Вы хотели получить, используя функцию OrderCloseTime в качестве оператора? 


время закрытия ордера
Михаил
68
Михаил 2012.11.01 18:43  
dimarik0000:

время закрытия ордера
функция Вам конечно его вернет, только Вы его никак не увидите, потому что возвращенное ею значение никак не используете
Михаил
68
Михаил 2012.11.01 18:46  
dimarik0000:
Здравствуйте уважаемые. Проблема в следующем не закрывается ордер по команде OrderClose подскажите пож. в чем я ошибся. 
если хотите узнать, почему у Вас не закрывается ордер, вызовите сразу после функции  OrderClose функцию GetLastError, а ошибку выведите в журнал или сообщение - вот и узнаете 
Михаил
68
Михаил 2012.11.01 19:15  

Дмитрий, у вас логически неправильно организован цикл перебора ордеров. Вот смотрите как у Вас:

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--)
{
   //здесь удаляем ордер
}

 Теперь мы гарантированно сможем выбрать каждый ордер в списке и сделать с ним все что захотим (ну почти).

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий