Нашёл возможную логическую ошибку в ключевом коде стандартной библиотеки, а конкретно в методе Direction класса СExpertSignal
double CExpertSignal::Direction(void)
{
long mask;
double direction;
double result=m_weight*(LongCondition()-ShortCondition());
int number=(result==0.0)? 0 : 1; // number of "voted"//---int total=m_filters.Total();
//--- loop by filtersfor(int i=0;i<total;i++)
{
//--- mask for bit maps
mask=((long)1)<<i;
//--- check of the flag of ignoring the signal of filterif((m_ignore&mask)!=0)
continue;
CExpertSignal *filter=m_filters.At(i);
//--- check pointerif(filter==NULL)
continue;
direction=filter.Direction();
//--- the "prohibition" signalif(direction==EMPTY_VALUE)
return(EMPTY_VALUE);
if(direction == 0.0) //код отсутствует
continue;//--- check of flag of inverting the signal of filterif((m_invert&mask)!=0)
result-=direction;
else
result+=direction;
number++;
}
//--- normalizationif(number!=0)
result/=number;
//--- return the resultreturn(result);
}
Фильтры посылающие в этот модуль значение 0.0 посредством своих собственных методов Direction
direction=filter.Direction();
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до
number++;
и считаются проголосовавшими, не привнося никаких добавочных значений к результирующей переменной direction.
А так как итоговая переменная result определяющая направление и силу сигнала с учётом всех фильтров высчитывается как
if(number!=0)
result/=number;
//--- return the resultreturn(result);
что в связке например любого сигнального индикатора и модуля СSignalITF - intraday time filter - приводит к уменьшению результирующего сигнала в два раза.
Если условная СSignalMA говорит direction = 100, а стандартный СSignalITF в обычный разрешенный день/час/минуту в соответствии со своим кодом выдаёт всегда direction = 0.0, то сейчас получается result = (100 + 0.0) / 2 проголосовавших = 50 результирующая сила сигнала. А в реальности все фильтры с 0.0 не должны считаться голосовавшими.
Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.
bred_bred1 #: Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.
Я прекрасно вижу continue в коде после if(direction==0.0). Вы же сами его выделили....
Чтобы сэкономить время на дальнейшие пререкания добираются/не добираются, объясню на пальцах.
Если в используемом сигнале отсутствует имплементированный метод Direction, как в случае с SignalMA например, то берётся метод Direction из родительского класса CExpertSignal, код которого выше. При переборе фильтров получается рекурсивный вызов.
И если вызывается этот метод из родительского класса, то мы видим вначале что
int number=(result==0.0)? 0 : 1; // number of "voted"
однако в случае с SignalITF метод Direction переопределен в самом классе SignalITF. Тогда никакого рекурсивного вызова не происходит
direction=filter.Direction();
//--- the "prohibition" signalif(direction==EMPTY_VALUE)
return(EMPTY_VALUE);
filter.Direction отрабатывает выдаёт 0.0 в переменную direction следуя дальше. Поскольку direction далее проверяется только на Empty_Value, в результате добираемся до
При выполнении следующего кода возникает критическая ошибка (баг существует, как минимум с билда 4040):
class A
{
public: int val;
};
class B
{
public: vector vec;
public: A a;
};
voidOnStart(void)
{
B Array[];
ArrayResize(Array, 1);
ArrayResize(Array, 2);
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Нашёл возможную логическую ошибку в ключевом коде стандартной библиотеки, а конкретно в методе Direction класса СExpertSignal
Фильтры посылающие в этот модуль значение 0.0 посредством своих собственных методов Direction
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до
и считаются проголосовавшими, не привнося никаких добавочных значений к результирующей переменной direction.
А так как итоговая переменная result определяющая направление и силу сигнала с учётом всех фильтров высчитывается как
что в связке например любого сигнального индикатора и модуля СSignalITF - intraday time filter - приводит к уменьшению результирующего сигнала в два раза.
Если условная СSignalMA говорит direction = 100, а стандартный СSignalITF в обычный разрешенный день/час/минуту в соответствии со своим кодом выдаёт всегда direction = 0.0, то сейчас получается result = (100 + 0.0) / 2 проголосовавших = 50 результирующая сила сигнала.
А в реальности все фильтры с 0.0 не должны считаться голосовавшими.
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до
Не добираются.
Не добираются.
Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.
Я прекрасно вижу continue в коде после if(direction==0.0). Вы же сами его выделили....
Не добираются.
Если в используемом сигнале отсутствует имплементированный метод Direction, как в случае с SignalMA например, то берётся метод Direction из родительского класса CExpertSignal, код которого выше. При переборе фильтров получается рекурсивный вызов.
И если вызывается этот метод из родительского класса, то мы видим вначале что
double result=m_weight*(LongCondition()-ShortCondition());и доп проверку как раз на 0.0 значение result
однако в случае с SignalITF метод Direction переопределен в самом классе SignalITF. Тогда никакого рекурсивного вызова не происходит
filter.Direction отрабатывает выдаёт 0.0 в переменную direction следуя дальше. Поскольку direction далее проверяется только на Empty_Value, в результате добираемся до
и получаем некорректное значение direction.
Я прекрасно вижу continue в коде после if(direction==0.0). Вы же сами его выделили....
Это мой код, уважаемый - комментарий справа "Код отсутствует" и выделение зелёным вроде должно намекнуть :)
я намеки плохо понимаю :). Выражайтесь яснее, прямо. Если это Ваш код, и в исходниках его нет, то Вы правы
я намеки плохо понимаю :). Выражайтесь яснее, прямо. Если это Ваш код, и в исходниках его нет, то Вы правы
Бывает :) Нет, в исходниках этого нет.
А можно кого-то тэгнуть или куда-то это зарепортить/закоммитить? Вы, вижу, старожил, а то я не в курсе как тут устроено)
При выполнении следующего кода возникает критическая ошибка (баг существует, как минимум с билда 4040):
2023.12.08 23:54:53.414 Test (EURUSD,H1) runtime error
я после // в коде в индикаторе mql4 написал текст а он во настройках не отображается dj входных параметрах. Что делать?!