Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2663

 
Aleksei Stepanenko #:

Есть вопрос, а чему равняется коэффициент, если не выполняется условие?

нулю. Перед "void OnTick()" - объявлены переменные

double ppTP=0;  

double ppSL=0;  
 
Я дописал предыдущий пост. Как Вы объявляете переменную 
koef1
и какое значение присваиваете до того условия, которое, вероятно, иногда не выполняется?
 
Aleksei Stepanenko #:
Я дописал предыдущий пост. Как Вы объявляете переменную  и какое значение присваиваете до того условия, которое, вероятно, иногда не выполняется?

Вот алгоритм.


double koef1_i_max=DBL_MIN;
double koef1_i_min=DBL_MAX;
double  koef1=0;

int OnInit()
   {
   return(INIT_SUCCEEDED);
   }
void OnDeinit(const int reason)
   {
   }

double ppTP=0;  // Отображение итоговой прибыли в пунктах по TP
double ppSL=0;  // Отображение итогового убытка в пунктах по SL

void OnTick()
{
Основной код запоняющий значения ppTP и ppSL
......................................
....................................
...................................
..................................

if ((ppTP>0) && (ppSL>0))
{
koef1=NormalizeDouble(ppTP/ppSL,3); 
}

   if (koef1 > koef1_i_max) 
     {
     koef1_i_max=koef1;
     }
   if (koef1 < koef1_i_min) 
     {
     koef1_i_min=koef1;
     }

Comment(    
     
    "КОЭФФ (№1)_(в моменте)==   ",koef1,"\n",
    "КОЭФФ (№1)_(max_историч.)==   ",koef1_i_max,"\n",
    "КОЭФФ (№1)_(min_историч.)==   ",koef1_i_min,"\n");  
}


  

"ppTP" - В процессе работы эксперта это значение заполняется. К чему я это.....- тип поступаемых значений  в переменную "ppTP" принципиально отличаются от значений получаемых из  " !Open... " и подобных ему. Это как бы произвольные значения.   

Можно сказать: возьмём два генератора случайных чисел - первый обзовём  - "ppTP".  Второй  - "ppSL".  А потом поделим один на другой.   И получается переменная "koef1" - которя отображает отношение одного значения к другому. В моём случае - "koef1" -  это просто

итоговое отношение пунктов прибыли к убыточным пунктам. 

В начале работы эксперта "koef1" - приравниваю к нулю, естественно.

 

Если прочитать этот код, то koef1 равен нулю, потому что условие не выполняется, затем мы ищем минимальное значение, и оно после сравнения тоже становится равно koef1, то есть нулю. 

Где-то ошибка в этой переменной, поищите. Минимумы и максимумы работают правильно.

Где меняются ppTP и ppSL? На какие значения?
 
Alexey Belyakov #:
возьмём два генератора случайных чисел

Распринтуйте ppTP, ppSL, koef1, где-то получаете не те значения, на которые рассчитываете. Вероятно, в первом расчёте на первом тике.

 
Если koef1 изначально равняется ноль, то это значение и запишется, как самое минимальное.
 
if ((ppTP>0) && (ppSL>0))
{
koef1=NormalizeDouble(ppTP/ppSL,3); 
//}

   if (koef1 > koef1_i_max) 
     {
     koef1_i_max=koef1;
     }
   if (koef1 < koef1_i_min) 
     {
     koef1_i_min=koef1;
     }
} //Перенести скобку сюда
 
Putnik #:
Если koef1 изначально равняется ноль, то это значение и запишется, как самое минимальное.

Да! сделал "koef1=100;" на глобальном. Работает! Минимум есть! Считает.

Теперь максимум висит "100" )) 

 
Putnik #:

Скобку перенёс! Ура победа!  Теперь всё считает! И Max и Min!

Низкий поклон всем кто помог! Спасибо!

Сейчас вставлю готовый, полный код. 

double koef1_i_max=DBL_MIN;
double koef1_i_min=DBL_MAX;
double  koef1=100;

int OnInit()
   {
   return(INIT_SUCCEEDED);
   }
void OnDeinit(const int reason)
   {
   }

double ppTP=0;  // Отображение итоговой прибыли в пунктах по TP
double ppSL=0;  // Отображение итогового убытка в пунктах по SL

void OnTick()
{
Основной код запоняющий значения ppTP и ppSL
......................................
....................................
...................................
..................................

if ((ppTP>0) && (ppSL>0))
{
koef1=NormalizeDouble(ppTP/ppSL,3); 


   if (koef1 > koef1_i_max) 
     {
     koef1_i_max=koef1;
     }
   if (koef1 < koef1_i_min) 
     {
     koef1_i_min=koef1;
     }
}

Comment(    
     
    "КОЭФФ (№1)_(в моменте)==   ",koef1,"\n",
    "КОЭФФ (№1)_(max_историч.)==   ",koef1_i_max,"\n",
    "КОЭФФ (№1)_(min_историч.)==   ",koef1_i_min,"\n");  
}
 
Тут ошибка:
double koef1_i_max=DBL_MIN;
Надо так:
double koef1_i_max=-DBL_MAX;