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

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

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

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

0

Решение

Ваша функция объявлена ​​как 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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]