Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1686

 
Aleksei Stepanenko #:
больше или равно, потому что первый элемент массива тоже нужно учесть, а его индекс в массиве равен нулю.
я не понимаю о каком массиве тут все ведут речь. Если OrdersTotal работает не так. Это же не массив, а функция возвращающая число.
 
Aleksei Stepanenko #:
Не, всё нормально. Если позиций нет, то  i=OrdersTotal()-1 будет равен -1. И условие цикла i>=0 сразу не выполнится. И программа не войдёт в цикл.
Но это не правильно, получается "сумма ордеров" - 1, то есть из цикла всегда будет исключаться 1 ордер.
 
Nerd Trader #:
я не понимаю о каком массиве тут все ведут речь. Если OrdersTotal работает не так.

Ордера по сути находятся в массиве программы, просто мы его не видим. OrdersTotal равносилен ArraySize, и показывает общее количество элементов.

В массиве индекс первого элемента всегда начинается с нуля, а последнего соответственно размер минус единица.

Пример: всего 5 ордеров, индексы: 0,1,2,3,4.

или массив из 5 элементов, индексы те же.

for(int i=5-1; i>=0; i--)
 
Aleksei Stepanenko #:

Ордера по сути находятся в массиве программы, просто мы его не видим. OrdersTotal равносилен ArraySize, и показывает общее количество элементов.

В массиве индекс первого элемента всегда равен нулю, а последнего соответственно размер минус единица.

Какая разница где находятся ордера, если OrdersTotal не массив. Он возвращает число ордеров, а не индекст массива.

 
Nerd Trader #:
Но это не правильно, получается "сумма ордеров" - 1, то есть из цикла всегда будет исключаться 1 ордер.

ордера находятся в пронумерованном списке.. Отсчет списка идет от 0..

Например

порядковый номер 0, тип бай, лот 0.1

 порядковый номер 1, тип селл, лот 1

порядковый номер 2, тип селл, лот 0.5

порядковый номер 3, тип бай, лот 0.16

Если сейчас вызвать OrdersTotal() она будет = 4

НО если нужно провести навигацию по всем строкам списка, то нужно пройтись по номерам 0 1 2 3, номера 4 тут нету.. хотя ордеров 4..

Поэтому делается хитрость, при составлении цикла перебора делается минус 1 на число ордеров, вот и все..


Nerd Trader #:

Какая разница где находятся ордера, если OrdersTotal не массив. Он возвращает число ордеров, а не индекст массива.

Правильно, НО есть неявный факт, имея число ордеров можно получить номера всех ордеров в списке
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
OrdersTotal это общее количество, но индексы практически во всех языках программирования начинаются с 0, а не с 1. Просто привыкните к этому. Сдвиньтесь на одну единицу назад и всё, а дальше будет всё так же, как Вы думаете.
 
Nerd Trader #:

Какая разница где находятся ордера, если OrdersTotal не массив

Количество ордеров и их порядковые номера которые в массиве это разные вещи. А ещё тикеты есть)
 
Nerd Trader #:
Но это не правильно, получается "сумма ордеров" - 1, то есть из цикла всегда будет исключаться 1 ордер.

Если не нравится "-1", то можно так

for(int i = OrdersTotal(); i >= 1 ; i --)
 
Aleksei Stepanenko #:

Ордера по сути находятся в массиве программы, просто мы его не видим. OrdersTotal равносилен ArraySize, и показывает общее количество элементов.

В массиве индекс первого элемента всегда начинается с нуля, а последнего соответственно размер минус единица.

Ну так общее кол-во и индекс массива это разные вещи, почему вы думаете что это одно и тоже? Чтобы создать массив с 1 индексом, вводим 1, а не 0, (int ar[1]) и соответственно ArraySize( ar ) вернет также 1, а не 0.

 
MakarFX #:

Если не нравится "-1", то можно так

for(int i = OrdersTotal(); i > 0 ; i --)

 это некорректно.. ордер с номером 0 будет пропущен..

А корректно так -

for(int i = OrdersTotal()-1; i >= 0 ; i --)
 {
 }
Причина обращения: