MQL4: Только половина моего цикла if/else if приводит к текущему выполнению

У меня есть эта маленькая функция, которая доставляет мне проблемы, только часть функции будет следовать моим условиям одновременно.

bool trend()
   {
     //is there a trend?
     close1 = iClose(NULL,0,1); //vars
     close2 = iClose(NULL,0,2);
     close3 = iClose(NULL,0,3);

     open1 = iOpen(NULL,0,1);
     open2 = iOpen(NULL,0,2);
     open3 = iOpen(NULL,0,3);

     if(close3 > open3 && close2 > open2 && close1 > open1)
     {
        return(true);           //uptrend
     }

     else if(close3 < open3 && close2 < open2 && close1 < open1)
     {
        return(false);         //downtrend
     }

     else return(EMPTY_VALUE);
  }

Вот как вызывается функция в int start()

  trending = trend();

  if (trending == true) Order = SIGNAL_BUY; // Rule to ENTER a Long trade

  if (trending == false) Order = SIGNAL_SELL; // Rule to ENTER a Short trade

Как написано выше, мой сигнал на продажу будет работать по условиям, но сигналы на покупку не следуют условиям, и я не могу понять, как они срабатывают.

Если я удалю «иначе вернуть (EMPTY_VALUE);» затем ордера на покупку начинают следовать условию, но ордера на продажу больше не следуют условиям. Сломанный ордер на продажу ведет себя так же, как и сломанный ордер на покупку.

Любые идеи, почему моя функция ведет себя так? Спасибо!


person Jacket    schedule 13.03.2017    source источник


Ответы (1)


Ваша функция объявлена ​​как bool trend(), что означает, что она может возвращать либо true, либо false. В строке else return(EMPTY_VALUE) константа EMPTY_VALUE (имеющая значение 0x7FFFFFFF согласно документации MQL) неявно преобразуется в true. Это означает, что ваша функция вернет true (который подает сигнал на покупку), если нет ни восходящего, ни нисходящего тренда.

Если вы пропустите последнюю строку else return(EMPTY_VALUE), вы потеряете оператор возврата. Это приводит к неопределенному поведению, если вы пытаетесь получить доступ к возвращаемому значению функции, что вы делаете в строке trending = trend().

Подводя итог: ваша проблема в том, что функция trend может возвращать только одно из двух значений: true или false. Но вам нужна функция, которая возвращает одно из трех значений uptrend, downtrend, no_trend. Вы можете объявить перечисление с этими тремя значениями и соответствующим образом изменить тип возвращаемого значения:

enum Trend {
    UPTREND,
    DOWNTREND,
    NONE
}

Trend trend() {
    // check if there is a trend
    // [...]
    if (close3 > open3 && close2 > open2 && close1 > open1) {
        return UPTREND;
    }
    else if (close3 < open3 && close2 < open2 && close1 < open1) {
        return DOWNTREND;
    }
    else {
        return NONE;
    }
}

а потом позже

Trend trending = trend();
if (trending == UPTREND) Order = SIGNAL_BUY;
if (trending == DOWNTREND) Order = SIGNAL_SELL;
person pschill    schedule 13.03.2017
comment
Спасибо, это было полезно. Мне не удалось заставить работать перечисление, но я придумал более грубое решение, преобразовав функцию в int и вернув значение для каждой возможности. - person Jacket; 14.03.2017