[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 504

 
prom18:
График должен иметь вид возрастающей прямой.

Почему вы так решили?
 
Vinin:

Почему вы так решили?
Ну у каждого бара объем больше нуля и мне нужна их сумма, которая пересчитывается при появлении нового бара.
 

to sergeev:

А, теперь понял, о чем вы. for запоминает, с каким именно значением нужно сравнить счетчик, и не изменяет его. Т.е если OrdersTotal вернул 2, то for это запомнит, и будет работать с 2.

 
Solree:

to sergeev:

А, теперь понял, о чем вы. for запоминает, с каким именно значением нужно сравнить счетчик, и не изменяет его. Т.е если OrdersTotal вернул 2, то for это запомнит, и будет работать с 2.


нет же. я вам талдычу совсем про обратное.

условие остановки цикла (в вашем случае OrdersTotal()) вычисляется !на каждой итерации!

поэтому на первой итерации =2
на второй уже =1

вы программист, или как? что ж элементарного понять не в состоянии.

 

to sergeev:

Вы мне глаза открыли. Даже специально открыл IDE для С++, чтобы проверить, как оно там. И оказываться, вы в двойне правы! Спасибо! :) Но... ордер то все равно не выбирается, даже если сделать так:

int someA = OrdersTotal();
for (int a = 0; a < someA; a++)
    if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES))
        if (OrderComment() == "Aelit" && OrderType() == OP_SELL)
            OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), 0);
 
prom18:
Ну у каждого бара объем больше нуля и мне нужна их сумма, которая пересчитывается при появлении нового бара.

Суммарный объем может как расти, так и падать.
 
Vinin:

Суммарный объем может как расти, так и падать.
Не понимаю. Объем - это кол-во тиков внутри бара. Объем первого - 30, второго - 20, третьего - 10. Сумма будет равна 60. Или нет?
 
Solree:

to sergeev:

Вы мне глаза открыли. Даже специально открыл IDE для С++, чтобы проверить, как оно там. И оказываться, вы в двойне правы! Спасибо! :) Но... ордер то все равно не выбирается, даже если сделать так:


Удаляй ордера всегда обратным отсчетом

int someA = OrdersTotal();
for (int a = someA-1;a>=0 a--)
    if (OrderSelect(a, SELECT_BY_POS))
        if (OrderComment() == "Aelit" && OrderType() == OP_SELL)
            OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
 
Solree:

Но... ордер то все равно не выбирается, даже если сделать так:

и не будет!

вы делаете OrderSelect по номеру позиции.

в первой итерации вы выбираете первый ордер, позиция ордера а=0

после закрытия этого ордера число ордеров становится OrdersTotal=1.
Это значит, что тот бывший второй ордер с позиции 1 становится на позицию 0.

Но у вас на второй итерации а уже =1, а не 0 ! И получается OrderSelect по несуществующей теперь позиции=1 вернёт ошибку.

-------

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

 
prom18:
Не понимаю. Объем - это кол-во тиков внутри бара. Объем первого - 30, второго - 20, третьего - 10. Сумма будет равна 60. Или нет?


Возьмите временной ряд с объемами и ручками пересчитайте

Например есть следующие объемы

10, 15, 25, 8, 11, 24, 30

Вот суммы по три

50, 48, 44, 55

Есть и рост, есть и падение

Все как в жизни

Причина обращения: