Ошибки, баги, вопросы - страница 3430

 
Привет,

Нашёл возможную логическую ошибку в ключевом коде стандартной библиотеки, а конкретно в методе 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 filters
   for(int i=0;i<total;i++)
     {
      //--- mask for bit maps
      mask=((long)1)<<i;
      //--- check of the flag of ignoring the signal of filter
      if((m_ignore&mask)!=0)
         continue;
      CExpertSignal *filter=m_filters.At(i);
      //--- check pointer
      if(filter==NULL)
         continue;
      direction=filter.Direction();
      //--- the "prohibition" signal
      if(direction==EMPTY_VALUE)
         return(EMPTY_VALUE);
	
	if(direction == 0.0)  //код отсутствует
	continue;

	
      //--- check of flag of inverting the signal of filter
      if((m_invert&mask)!=0)
         result-=direction;
      else
         result+=direction;
      number++;
     }
//--- normalization
   if(number!=0)
      result/=number;
//--- return the result
   return(result);
  }   
Фильтры посылающие в этот модуль значение 0.0 посредством своих собственных методов Direction

direction=filter.Direction();
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до

      number++;
и считаются проголосовавшими, не привнося никаких добавочных значений к результирующей переменной direction.

А так как итоговая переменная result определяющая направление и силу сигнала с учётом всех фильтров высчитывается как

   if(number!=0)
      result/=number;
//--- return the result
   return(result);
что в связке например любого сигнального индикатора и модуля СSignalITF  - intraday time filter - приводит к уменьшению результирующего сигнала в два раза.

Если условная СSignalMA говорит direction = 100, а стандартный СSignalITF в обычный разрешенный день/час/минуту  в соответствии со своим кодом выдаёт всегда direction = 0.0, то сейчас получается result = (100 + 0.0) / 2 проголосовавших = 50 результирующая сила сигнала.
А в реальности все фильтры с 0.0 не должны считаться голосовавшими.
 
 
bred_bred1 #:
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до

Не добираются.

 
Andrey Barinov #:

Не добираются.

Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.
 
bred_bred1 #:
Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.

Я прекрасно вижу continue в коде после if(direction==0.0). Вы же сами его выделили....

 
Andrey Barinov #:

Не добираются.

Чтобы сэкономить время на дальнейшие пререкания добираются/не добираются, объясню на пальцах.

Если в используемом сигнале отсутствует имплементированный метод Direction, как в случае с SignalMA например, то берётся метод Direction из родительского класса CExpertSignal, код которого выше. При переборе фильтров получается рекурсивный вызов.

И если вызывается этот метод из родительского класса, то мы видим вначале что

double result=m_weight*(LongCondition()-ShortCondition());

и доп проверку как раз на 0.0 значение result

   int    number=(result==0.0)? 0 : 1;      // number of "voted"
однако в случае с SignalITF метод Direction переопределен в самом классе SignalITF. Тогда никакого рекурсивного вызова не происходит

direction=filter.Direction();
      //--- the "prohibition" signal
      if(direction==EMPTY_VALUE)
         return(EMPTY_VALUE);
filter.Direction отрабатывает выдаёт 0.0 в переменную direction следуя дальше. Поскольку direction далее проверяется только на Empty_Value, в результате добираемся до 

 number++;
и получаем некорректное значение direction.
 
Andrey Barinov #:

Я прекрасно вижу continue в коде после if(direction==0.0). Вы же сами его выделили....

Это мой код, уважаемый - комментарий справа "Код отсутствует" и выделение зелёным вроде должно намекнуть :)
 
bred_bred1 #:
Это мой код, уважаемый - комментарий справа "Код отсутствует" и выделение зелёным вроде должно намекнуть :)

я намеки плохо понимаю :). Выражайтесь яснее, прямо. Если это Ваш код, и в исходниках его нет, то Вы правы

 
Andrey Barinov #:

я намеки плохо понимаю :). Выражайтесь яснее, прямо. Если это Ваш код, и в исходниках его нет, то Вы правы

"Я человек военный, Повторяй два разА и медленно " (с) Две сорванные башни

Бывает :) Нет, в исходниках этого нет.

А можно кого-то тэгнуть или куда-то это зарепортить/закоммитить? Вы, вижу, старожил, а то я не в курсе как тут устроено)
 

При выполнении следующего кода возникает критическая ошибка (баг существует, как минимум с билда 4040):

class A
{
   public: int    val;
};

class B
{

   public: vector vec;
   public: A      a;
};

void OnStart(void)
{
   B Array[];
   ArrayResize(Array, 1);
   ArrayResize(Array, 2);
}

2023.12.08 23:54:53.414 Test (EURUSD,H1) runtime error

 
Здравствуйте. Подскажите пжл.. почему не отображается комментарий в коде и во входных параметрах extern bool или string.. после //

я после // в коде в индикаторе mql4 написал текст а он во настройках не отображается dj входных параметрах. Что делать?!