Цикл for() в цикле for()

 

Уважаемые эксперты.

Подскажите, пожалуйста, как сделать грамотную выборку из выборки в индикаторе, а именно:

Есть диапазон данных от 0 до limit (максимальное количество баров):

for(int k=0;k<limit;k++)

Как посчитать какие-ибо значения определенным размером в этом цикле?

Допустим всего 1000 баров, а нам нужно в этом цикле посчитать что-либо группами по, например, 20 баров (пусть будет сумма всех закрытий):

int countbars=20;
for(int k=0;k<limit;k++)
{
	for(int i=0;i<countbars;i++)
	iClose[k+i]++;
}

Верно ли так будет?

 
33valeta.ru:

Уважаемые эксперты.

Подскажите, пожалуйста, как сделать грамотную выборку из выборки в индикаторе, а именно:

Есть диапазон данных от 0 до limit (максимальное количество баров):

for(int k=0;k<limit;k++)

Как посчитать какие-ибо значения определенным размером в этом цикле?

Допустим всего 1000 баров, а нам нужно в этом цикле посчитать что-либо группами по, например, 20 баров (пусть будет сумма всех закрытий):

Верно ли так будет?

вот как вы написали - будет в корне неверно..

PS/ ну не учите уже программирование по MQL. Он хороший, удобный, но школу не заменяет.

PPS/ И с каждой версией всё более не заменяет

 
Maxim Kuznetsov:

вот как вы написали - будет в корне неверно..

PS/ ну не учите уже программирование по MQL. Он хороший, удобный, но школу не заменяет.

PPS/ И с каждой версией всё более не заменяет

Ну второпях опечатку допустил:

m+=iClose[k+i];


Но не в этом смысл. Вопрос в самом цикле. Верно ли?

 
33valeta.ru:

Ну второпях опечатку допустил:

m+=iClose[k+i];


Но не в этом смысл. Вопрос в самом цикле. Верно ли?

если не забудете вовремя обнулять m - то получится "скользящая сумма" по Close за countbars.
 
33valeta.ru:

Уважаемые эксперты.

Подскажите, пожалуйста, как сделать грамотную выборку из выборки в индикаторе, а именно:

Есть диапазон данных от 0 до limit (максимальное количество баров):

for(int k=0;k<limit;k++)

Как посчитать какие-ибо значения определенным размером в этом цикле?

Допустим всего 1000 баров, а нам нужно в этом цикле посчитать что-либо группами по, например, 20 баров (пусть будет сумма всех закрытий):

Верно ли так будет?

почти.

во первых, непонятно что за выражение Close[k+i]++ ? ))))

во вторых, учитывайте что заходить за пределы limit нельзя, там нет свечей.
допустим рассмотрим последнюю интерацию первого цикла for. k будет равен limit -1.
а теперь вы к этому k прибавляете от 0 до 19. т.е. считаете свечи от limit -1 до limit +18.
в конкретно этом примере можно добавить еще одну проверку, вот так:

   int countbars=5;
   for(int k=0;k<limit;k++)
   {
        for(int i=0;i<countbars && k<limit-countbars;i++)
        Print( iClose[k+i] );
   }
если это был чисто гипотетических пример, и вы спрашивали именно про цикл в цикле, то все верно, смысл вы поняли.
 
Maxim Kuznetsov:
если не забудете вовремя обнулять m - то получится "скользящая сумма" по Close за countbars.

Это я понимаю, просто беспокоит нюанс:

k достигнет значения limit-1 (значения 999)

i достигнет значения countbars-1 (значения 19)

Что же тогда выдаст функция iClose[k+i], если бара № 999+19 не существует?

 
33valeta.ru:

Это я понимаю, просто беспокоит нюанс:

k достигнет значения limit-1 (значения 999)

i достигнет значения countbars-1 (значения 19)

Что же тогда выдаст функция iClose[k+i], если бара № 999+19 не существует?

вылетит птичка )
которая называется "array out of range"

 
Nikolay Khrushchev:

почти.

во первых, непонятно что за выражение Close[k+i]++ ? ))))

во вторых, учитывайте что заходить за пределы limit нельзя, там нет свечей.
допустим рассмотрим последнюю интерацию первого цикла for. k будет равен limit -1.
а теперь вы к этому k прибавляете от 0 до 20. т.е. считаете свечи от limit -1 до limit +18.
в конкретно этом примере можно добавить еще одну проверку, вот так:

если это был чисто гипотетических пример, и вы спрашивали именно про цикл в цикле, то все верно, смысл вы поняли.
 for(int i=0;i<countbars && k<limit-countbars;i++)

Вот чего мне хватало!!! Ура! Вот про это я спрашивал! Спасибо огромнейшее!

 
33valeta.ru:

Это я понимаю, просто беспокоит нюанс:

k достигнет значения limit-1 (значения 999)

i достигнет значения countbars-1 (значения 19)

Что же тогда выдаст функция iClose[k+i], если бара № 999+19 не существует?

не ходите в циклы если гарантированно во вложенных выходите за границы.

если все ваши вычисления/функции и проч. определены (то есть требуют и имеют разумное значение) для числа баров > 100 то пока этих баров меньше то и нечего в первый цикл входить.

 
33valeta.ru:

Вот чего мне хватало!!! Ура! Вот про это я спрашивал! Спасибо огромнейшее!

ну это тоже не совсем верно, так как в последних 20 интерациях у вас будет посчтиано не 20 свечей как вы хотели, а 19 18 и так далее. 
зависит от ваших задачь конечно. 

корректней так:

   int countbars=20;
   for(int k=0;k<limit;k++)
   {
        if(k+countbars-1 >= limit) break;
        for(int i=0;i<countbars;i++)
        Print( iClose[k+i] );
   }
 
Nikolay Khrushchev:

ну это тоже не совсем верно, так как в последних 20 интерациях у вас будет посчтиано не 20 свечей как вы хотели, а 19 18 и так далее. 
зависит от ваших задачь конечно. 

корректней так:

Вообще красивый код.

Да, все верно. Нужно именно по 20 свечей. То есть дойти до 80 свечи, посчитать от 80 до 100 и остановиться.

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