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