У меня есть эта маленькая функция, которая доставляет мне неприятности, только часть функции будет следовать моим условиям за один раз.
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);» тогда ордера на покупку начинают следовать условию, но ордера на продажу больше не соответствуют условиям. Сломанный ордер на продажу, похоже, ведет себя так же, как и сломанный ордер на покупку.
Есть идеи, почему моя функция ведет себя так? Спасибо!
Ваша функция объявлена как 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;
Других решений пока нет …