Вернемся к рассмотрению нашего первого советника и расскажу об
условном операторе 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.