Оператор переключатель switch

 Попробуем решить простую задачу. Пусть пользователь во внешних переменных выставляет оценку советнику, по 5 балльной шкале и в зависимости от этой оценки на экран выводится сообщение, примерно так:

0 — ужасно плохой советник

1 — очень плохой советник

2 — плохой советник

3 — советник посредственный, можно и получше)))))

4 — хороший советник

5 — супер-пупер советник.

(идея конечно бредовая, кто в здравом уме будет выставлять оценку советнику в самом советнике, да ещё во внешних переменных… но для иллюстрации работы оператора switch сойдёт))))))))))))

Нет проблемм задать внешнюю переменную (например: extern int ozenka=5;) Но простой конструкцией if-else тут не обойдёшься, возможных вариантов получается 6. Можно конечно изобразить что нибудь вроде:

 

extern int ozenka=5;

if ( ozenka==5 ) comment ( "супер-пупер советник" );

if ( ozenka==4 ) comment ( "хороший советник" );

............................................................................

............................................................................

if ( ozenka==0 ) comment ( "ужасно плохой советник" );

Получаем шесть строк примерно одинакового кода. Но эту же задачу можно решить проще, используя оператор switch.

extern int ozenka=5;

int start()

{

switch ( ozenka )

{

case 5: comment ( "супер-пупер советник" );break;

case 4: comment ( "хороший советник" );break;

case 3: comment ( "советник посредственный, можно и получше)))))" );break;

case 2: comment ( "плохой советник" );break;

case1: comment ( "очень плохой советник" );break;

case 0: comment ( "ужасно плохой советник" );break;

default: comment ( " полное.....))))))))" );

}

return(0);

}

 

На мой взгляд выглядит получше))) Значение выражения,(то что в скобках после switch) может быть только целочисленным (типа int) case обозначает метку, после двоеточия могут быть любые операторы или блок операторов. break прерывает выполнение оператора switch. Это необязательный оператор, если его не будет, то после того как будет обработан соответствующий вариант будут выполняться все остальные операторы, пока не встретиться оператор break. Это нужно для того, чтобы можно было комбинировать варианты. Для примера немного изменим задачу, пусть пользователь вводит число от нуля до пяти, если введено число от нуля до трёх, пишем сообщение "плохой советник", если 4 или 5-пишем "хороший советник"

extern int ozenka=5;

int start()

{

switch ( ozenka )

{

case 5:

case 4: comment ( "хороший советник" );break;

case 3:

case 2:

case1:

case 0: comment ( "плохой советник" );break;

default: comment ( " полное .....))))))))" );

}

return(0);

}

оператор после default, в конце выполняется в том случае, если значение выражения (в нашем примере ozenka) не соответствует ни одной из меток после case, например для нашего случая, если пользователь ввёл любое другое число, больше 5 или меньше нуля.

Для вывода сообщений удобнее задавать их в виде строковых переменных (string)

 

extern int ozenka=5;

string mess1,mess2,mess3,mess4,mess5,mess6,mess7,mess8;

int start()

{

mess1="супер-пупер ";

mess2=" советник";

mess3= "хороший ";

mess4=" посредственный, можно и получше)))))" ;

mess5="плохой " ;

mess6= "очень " ;

mess7= "ужасно ";

mess8= "полное.....))))))))" ;

switch ( ozenka )

{

case 5: comment ( mess1+mess2 );break;

case 4: comment ( mess3+mess2 );break;

case 3: comment ( mess2+mess4 );break;

case 2: comment ( mess5+mess2 );break;

case1: comment (mess6+mess5+mess2 );break;

case 0: comment (mess7+mess5+mess2 );break;

default: comment ( mess8 );

}

return(0);

}

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

У нас получилась однотипная последовательность данных (переменных типа string) Для обозначения таких последовательностей в языках программирования существует понятие массив. Массивы бывают тоже разных типов, к примеру int, double и как в нашем случае string.Каждый элемент в массиве имеет свой индекс начинающийся с нуля. Массив можно задать простым перечислением, например в нашем случае 8 значений.то есть индекс элемента будет от 0 до 7. Обьявим массив:

string message [8]={"супер-пупер "," советник", "хороший "," посредственный, можно и получше)))))","плохой ","очень " ,"ужасно ","полное.....))))))))" }

теперь мы задали имя массива (message), величину( то есть количество элементов [ 8]), перечислили все значения элементов и каждое сообщение имеет свой индекс Чтобы вызвать любой элемент массива (ещё говорят обратиться к элементу) нужно указать имя массива и индекс элемента (как фамилию и адрес)))))) Например если нам нужно сообщение "советник" пишем message [1]; сообщение "хороший" — message[2]; и т.д. При этом не забываем что нумерация (индекс) элементов начинается с нуля. Теперь пример будет выглядеть так:

extern int ozenka=5;

string message [8]={"супер-пупер "," советник", "хороший "," посредственный, можно и получше)))))","плохой ","очень " ,"ужасно ","полное.....))))))))" }int start(){

switch ( ozenka )

{

case 5: comment ( message [0]+messssage [1] );break;

case 4: comment ( message [2]+messsage [1] );break;

case 3: comment ( message[1]+message[3] );break;

case 2: comment ( message [4]+message [1] );break;

case1: comment (message [5]+message [4]+message [1] );break;

case 0: comment (message [6]+message [4]+message [1] );break;

default: comment ( message [7] );

}

return(0);

}

Итак мы успешно привели простейший пример в состояние алкогольного и наркотического опьянения))))))) можно двигаться дальше)))))

Массивы можно обьявить и по другому:

string message [8];
здесь мы не перечисляем значения элементов, а просто задаём их количество. В дальнейшем мы можем присвоить любое значение (соответствующего типа) любому элементу массива. Например:
message[0]="хороший";
message[1]="советник";
и так далее. При таком объявлении массива мы сможем в любое время менять значения любых элементов.

Размерность массива:

Как быть если данные представлены не в виде последовательности данных а в виде таблицы? возьмём для примера шахматную доску. пусть каждая клетка обозначает какую то переменную. Можно обьявить массив величиной 64 (по количеству клеток), но тогда доступ к элементам массива усложняется.

Очень легко запутаться выискивая нужный элемент. Как вариант, можно обьявить 8 массивов по 8 элементов в каждом, например:

int line1[8];
int line2[8];
int line3[8];
и т.д.

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

int Chess [8][8];

тогда в первых квадратных скобках у нас будет номер строки, а во вторых — номер столбца. При этом достаточно легко найти любой элемент массива,
(например как во всем известной игре морской бой))))))))))) Обращение к элементу массива будет таким:
Chess [0][5]=10; то есть присваиваем элементу массива в первой строке, шестом столбце значение 10.
допускаются не более чем 4х мерные массивы.

Массивы таймсерии:

В mql существует несколько предопределённых массивов, К примеру каждый бар на графике имеет свои параметры, Цены открытия, закрытия, максимальная и минимальная цена, тиковый обьём, время открытия бара. Вся информация по любому бару на графике содержится в таких предопределённых массивах(предопределённые- значит с постоянными, заранее заданными именами, то есть объявлять их не нужно)


Цена открытия open [];
Цена закрытия close [];
Максимальная цена high [];
Минимальная цена low [];
Тиковый обьём volume [];
Время открытия свечи time [];
Кроме предопределённых массивов существуют предопределённые переменные:

Ask цена покупки
Bid цена продажи
Point размер пипса в валюте котировки
Digits количество знаков после запятой в цене инструмента
Bars количество баров на графике
Эти массивы и переменные используются практически в любом советнике или индикаторе, поэтому их нужно просто запомнить. С их помощью мы можем получить всю нужную нам информацию, которая содержится в текущем графике цены.Но массивы таймсерии содержат информацию только по текущему графику и текущему таймфрейму. Если нам нужно получить информацию с другого таймфрейма или по другому инструменту нужно использовать встроенные функции языка MQL. К примеру у нас текущий график евродоллара, таймфрейм Н1. Нам нужна цена открытия евродоллара по текущему бару тайма Н1 и Н4, а также цена открытия текущего бара GBP/USD.
По текущему графику мы используем массив таймсерию Open[0]; Для получения нужной нам цены в двух других случаях используем функцию iOpen();

Для таймфрейма Н4 по EUR/USD

iOpen (Symbol(),PERIOD_H4,0);

Здесь функция Symbol(); возвращает текстовую строку с именем инструмента, в нашем случае EURUSD, вместо этой функции можно просто написать NULL, это будет означать использование текущего инструмента, то есть то же самое)))). PERIOD_H4 стандартная именованая константа. она содержит число минут таймфрейма Н4. Можно написать просто 240, опять же получим то же самое)))) Ну и ноль в конце это просто номер нужного нам бара, по условию нам нужен текущий бар, а нумерация баров как мы знаем (я надеюсь)))))) начинается с нуля. То есть запись вида:

iOpen (Symbol(),PERIOD_H4,0); iOpen (NULL,240,0); iOpen ("EURUSD",240,0);

абсолютно равнозначны (для последнего варианта только в том случае, если текущий график это график евробакса).

Для тайма Н1 по фунтобаксу:

iOpen ("GBPUSD",PERIOD_H1,0);

Здесь то же самое. Кстати не нужно долго и мучительно запоминать эти функции. Вся эта информация содержится в словаре вашего редактора ( Metaeditor )

 

 

Кроме того изучение учебника MQL пока никто не отменял))))))))))))

 

 

 Назад

 

 

TEXT.RU - 100.00%

 

Комментарии (1)
a # 11 в 00:00 0
Помогло )
Яндекс.Метрика