Оператор цикла While

 Синтаксис этого цикла несколько отличается от цикла For, но принцип работы почти такой же. То что можно сделать с помощью оператора for можно сделать и с помощью оператора while и наоборот. Но так как они всё таки отличаются при решении конкретных задач иногда удобнее использовать цикл while а иногда for.Синтаксис оператора следующий:

while ( условие ) оператор;
если операторов несколько используются фигурные скобки
while ( условие ) { операторы }
Оператор цикла ( или операторы ) выполняются до тех пор, пока условие не станет ложным. В отличие от цикла for тут нет инициализации цикла и нет счётчика цикла. Ну они не особо и нужны, при необходимости всегда можно задать их программно Попробуем решить предыдущую задачу с помощью цикла while:

количество баров так же зададим во внешней переменной


extern int ma_period=100; // количество цен для расчёта
int i=0;
double prices;
int start()
{
while(i<ma_period)
{
prices+=Open[i];
i++
}
prices/=ma_period;
comment(prices);
return(0);
}

Таким образом мы задали инициализацию и счётчик цикла и получили практически аналог цикла for Но не всегда бывает точно известно сколько раз придётся проходить по циклу, в таких случаях цикл while несколько удобнее чем for
Например: пусть нужно найти номер ближайшего бара с заданной ценой закрытия. Как далеко он находится от нулевого бара мы не знаем, соответственно не можем задать параметр цикла. Конечно можно задать количество проходов заведомо больше требуемого, примерно так:
extern double prices=1.2544;
int number;
int start()
{
for (int i=0;i<1000; i++)
{
if (Close[i]==prices){number=i;break;}
}
comment(number);
return(0);
}
Если такого бара нет (по известному закону он окажется 1001)))))))) на выходе получим ноль. Но и если цена нулевого бара свпадёт с заданным значением получим тоже ноль...то есть возникает путаницаПоэтому лучше просто не учитывать нулевой бар, всё равно он ещё не сформирован и какой будет цена закрытия неизвестно. Для этого инициализируем цикл не нулём а 1.
For ( int i = 1 ; I<1000 ; i ++ ) {.......}
При использовании цикла while, получается немного по другому:
extern double prices=1.2544;
int i;
int start()
{
While (Close[i]!=prices)i++;
return(0);
}
Теперь наш цикл будет перебирать значения цен до тех пор, пока не найдёт нужное. Но что получится если такого значения нет? то же самое что в примере с циклом for, программа зависнет Значит надо предусмотреть этот случай и ввести дополнительное условие прерывания цикла. примерно так:
extern double prices=1.2544;
int i;
int start()
{
While (Close[i]!=prices)
{
i++;
if (i>1000)break;
}
return(0);
}
Оператор break нам уже известен по оператору-переключателю Swith. Его можно применять кроме оператора Swith, в циклах For и While. Его действие должно быть понятно, прерывание цикла и выход. Кроме этих трёх случаев, в других операторах применять его нельзя.
Кроме оператора break в циклах wile и for применяется ещё один оператор: continue. Опять же, в других операторах, в том числе и swith, применять его нельзя. В отличие от break оператор continue завершает только текущую итерацию (то есть проход по циклу) после чего изменяется значение счётчика и цикл продолжается дальше.

пример:

Допустим нам нужно найти несколько ближайших баров, с максимальными ценами выше заданного уровня. Этот уровень как обычно задаём в настройках. Если точнее, нам нужны не параметры баров, а только их индексы (порядковые номера)

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

Допустим что нас не интересуют устаревшие данные , поэтому ограничим область поиска каким то количеством баров. Это количество так же зададим в настройках. По умолчанию поставим к примеру 50.

Другими словами задача такая: берём ближайшие 50 баров (это число можно изменить в настройках) и из этого количества выбираем номера тех баров, у которых high выше уровня, также заданного в настройках. Эти номера сохраняем в массиве.

Тут возникает вопрос, а что делать с этим массивом? Если для вывода результата в предыдущих примерах мы просто использовали оператор comment(), так как там был всего один результат, то здесь так просто не получится, результатов может быть несколько,причём точно неизвестно сколько именно. Но этот вопрос так же можно решить с помощью цикла.

 

 

 Назад

 

Комментарии (0)

Нет комментариев. Ваш будет первым!

Яндекс.Метрика