- •Внешние переменные
- •Глобальные переменные
- •Формальные параметры функций
- •Операции отношения
- •Логическая операция и (&&)
- •Побитовые операции
- •Объединение арифметических и побитовых операций с операцией присваивания
- •Формат оператора цикла while:
- •Формат оператора цикла for:
- •Оператор досрочного завершения цикла break
- •Формат оператора switch:
- •Формат функции OrderSelect():
- •IsStopped(): как проверить, что эксперт был остановлен
- •Выдерживаем паузу между торговыми операциями
- •Index - индекс элемента
- •Реализация трейлинг стопа в эксперте
- •Функция iAlligator() - Аллигатор Билла Вильямса (Alligator)
- •IGator() - определение периодов сна и бодроствования Аллигатора с помощью Gator Oscillator
- •Функция iGator()
- •IFractals(): фракталы б.Вильямса - первое измерение рынка
- •IAo(): Волшебный Осциллятор Билла Вильямса (Awesome Oscillator - ao) - второе измерение рынка
- •Сигналы Волшебного осциллятора (Awesome Oscillator)
Объединение арифметических и побитовых операций с операцией присваивания
Операция |
Пример |
Эквивалент |
Сложение j и k |
j += k |
j = j + k |
Вычитание второго аргумента (k) из первого (j) |
j -= k |
j = j - k |
Умножение j и k |
j *= k |
j = j * k |
Получить частное от деления j на k |
j /= k |
j = j / k |
Получить остаток от деления j на k |
j %= k |
j = j % k |
Сдвиг двоичного представления j на k бит вправо |
j >>= k |
j = j >> k |
Сдвиг двоичного представления j на k бит влево |
j <<= k |
j = j << k |
Побитовая операция И двоичных представлений j и k |
j &= k |
j = j & k |
Побитовая операция ИЛИ двоичных представлений j и k |
j |= k |
j = j | k |
Побитовая операция исключающее ИЛИ двоичных представлений j и k |
j ^= k |
j = j ^ k |
Приоритеты операций и порядок выполнения выражений
В прошлых выпусках я рассказал о следующих типах операций в выражении:
об арифметических операциях,
об операциях отношения,
о логических операциях НЕ, ИЛИ и И,
о побитовых операциях.
Зачастую в выражении можно встретить сразу несколько операций. Возникает вопрос - в какой последовательности эти операции будут выполняться. Это очень важный вопрос, ведь от этого зависит конечный результат, который мы в итоге получим.
Разобьем операции по группам в порядке уменьшения приоритетов.
1-я группа (наивысший приоритет). Вызов функции и доступ к элементу массива (например, a[7]).
2-я группа. Операции с одним операндом:
логическое отрицание (!);
побитовое отрицание (~);
прибавление единицы (++);
вычитание единицы (--);
изменение знака на противоположный (-).
3-я группа. Побитовые операции:
побитовая операция И (&);
побитовая операция ИЛИ (|);
побитовая операция исключающее ИЛИ (^);
побитовый сдвиг вправо (>>);
побитовый сдвиг влево (<<).
4-я группа. Ряд арифметических операций:
умножение (*);
деление (/);
получение остатка от деления (%).
5-я группа. Оставшиеся арифметические операции:
сложение (+);
вычитание (-).
6-я группа. Операции отношения:
больше (>);
больше или равно (>=);
меньше (<);
меньше или равно (<=);
равно (=);
не равно (!=).
7-я группа. Логическая операция И (&&).
8-я группа. Логическая операция ИЛИ (||).
9-я группа. Операция присваивания и объединенные арифметические и побитовые операции с операцией присваивания:
операция присваивания (=);
сложение с присваиванием (+=);
вычитание с присваиванием (-=);
умножение с присваиванием (*=);
деление с присваиванием (/=);
остаток от деления с присваиванием (%=);
побитовая операция "И" с присваиванием (&=);
побитовая операция "ИЛИ" с присваиванием (|=);
побитовая операция исключающее "ИЛИ" с присваиванием (^=);
побитовый сдвиг влево с присваиванием (<<=);
побитовый сдвиг вправо с присваиванием (>>=).
Сначала выполняются все операции первой группы, потом все операции второй группы и т.д. до девятой группы операций. Если в выражении присутствует несколько операций, принадлежащих одной группе, то они выполняются слева направо. Единственное исключение - операции второй и девятой групп - они выполняются справа налево.
Бывают случаи, когда Вам нужно изменить порядок выполнения операций по умолчанию. В этом случае Вы должны использовать круглые скобки () - они имеют наивысший приоритет.
Пример выражения:
a = 5 + 6 * 3; // переменной a будет присвоено значение 23
a = ( 5 + 6 ) *3; // переменной a будет присвоено значение 33
Условный оператор if-else
В этом выпуске я вернусь к рассмотрению нашего первого советника и расскажу об условном операторе if-else, который я использовал в функции init().
int init() { //---- if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG; MyOrderTicket = 0; //---- return(0); }
Формат условного оператора if-else:
if (выражение) первый_оператор else второй_оператор
Принцип работы оператора: вычисляется значение выражения в скобках; если оно равно true, то выполняется "первый_оператор", в противном случае - "второй_оператор".
В нашем первом эксперте в функции init() есть такая строчка:
if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG;
В этой строчке вычисляется выражение iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]. Забегая вперед, скажу, что в этом выражении сравнивается значение экспоненциальной скользящей средней по цене закрытия с периодом, определенным внешней переменной MAPeriod, и цена закрытия текущего бара ( Close[0] ).
Если значение скользяйшей средней больше цены закрытия, то выполняется первый оператор:
CurrentState = STATE_SHORT;
Если - меньше, то второй:
CurrentState = STATE_LONG;
Если в качестве оператора есть необходимость выполнить сразу несколько операторов, то можно использовать составной оператор, т.е. заключить в фигурные скобки необходимые нам операторы. При этом после закрывающей фигурной скобки точка с запятой уже не ставится.
Пример использования составного оператора можно найти и в нашем эксперте:
if (!IsTesting()) return(MarketInfo(s, MODE_LOTSIZE)*MarketInfo(StringSubstr(s, 0, 3)+"USD", MODE_BID)/AccountLeverage()); else { p = iClose(StringSubstr(s, 0, 3)+"USD", Period(), iBarShift(StringSubstr(s, 0, 3)+"USD", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)*p/AccountLeverage()); }
Если у нас нет необходимости в выполнении второго оператора (в случае, если выражение в круглых скобках не равно true), то часть else можно опустить:
if (выражение) первый_оператор
Пример из нашего эксперта:
if (s == "CHFJPY") { p = iClose("USDCHF", Period(), iBarShift("USDCHF", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)/(AccountLeverage()*p)); }
Если несколько операторов if-else вложены друг в друга, а часть операторов имеет пропущенную часть else, то else всегда связывается с ближайшим предыдущим оператором if в том же блоке, не имеющим части else.
Обычно операторы в коде эксперта выполняются последовательно - один за другим. Однако часто требуется изменить последовательность их выполнения в зависимости от каких-то условий. В этом выпуске я рассмотрел один из способов изменения этой последовательности: условный оператор if-else.
Оператор цикла while
Обычно операторы в коде эксперта выполняются последовательно - один за другим. Однако часто требуется изменить последовательность их выполнения в зависимости от каких-то условий. В прошлом выпуске я рассмотрел один из способов изменения этой последовательности: условный оператор if-else. Применение этого оператора оправдано, когда есть необходимость выполнить две разные последовательности действий в зависимости от какого-то условия.
В этом выпуске я планирую рассказать об операторе цикла while. Уже само название говорит о том, что этот оператор применяется в тех случаях, когда нужно повторить какое-то количество раз одну и ту же последовательность операторов.
