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

 
Alexey Belyakov #:

Обозначая "DBL_MAX" мы пытаемся идти от максимума, и находить любое значение, которое ниже "DBL_MAX". А нужно находить самое минимальное значение из поступающих данных.

Если я Вас правильно понял, Вы рассчитываете коэффициент с приходом тика, и также хотите иметь максимальное и минимальное значения этого коэффициента за всю историю. Если это так, то код который я написал должен Вам подойти, по идее.

Он работает следующим образом, на примере минимального значения: На глобальном уровне объявляем переменную минимума, и присваиваем ей максимальное значение. При первом же расчёте коэффициента, он точно не будет больше, вряд ли равен, и скорее всего меньше переменной минимума. И тут же после первого сравнения минимальное значение станет равно коэффициенту. Сравнения со следующими меньшими коэффициентами будут делать минимальную переменную только меньше. Что и требовалось. Цикл не нужен. Вы обрабатываете всё сразу по мере прихода тиков и расчёта коэффициента.

Если Вы что-то делаете в цикле, тогда покажите больший кусок кода с этим циклом, чтобы было понятнее.
 
Alexey Belyakov #:
Я вот думаю. Неужели разработчики не могли предусмотреть простейший математический оператор, кторый в динамичной переменной фикисирует всё меньший, и меньший минимум, но больше нуля. Это же выглядит элементарщиной!))
Это не то, что должны предусматривать разработчики.
 
Alexey Belyakov #:

Да, так и есть.

Я вот думаю. Неужели разработчики не могли предусмотреть простейший математический оператор, кторый в динамичной переменной фикисирует всё меньший, и меньший минимум, но больше нуля. Это же выглядит элементарщиной!))

Я два дня потратил на это, но толкового так ничего и не придумал...

Фактически по этой теме -"поиск макс/мин. значения" есть две методики.

Это массив  ArrayMinimum/Max и  MathMin/MathMax и Всё!  

- В массив нужно данные забивать....перед тем, как анализировать

- В MathMax, MathMin - только два значения.... а почему только два?  Почему нет оператора который анализирует все новые поступающие значения...

Cтранно...

Вторую переменную надо. Текущая в которую приходят значения и максимальная. Если максимальная меньше текущей, максимальная равна текущей. На каждой итерации. Т на глобальном уровне переменные, что бы не терялись.
 

Aleksei Stepanenko дело толкует. )))

static double koef1_i_max=DBL_MIN;
static double koef1_i_min=DBL_MAX;

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;
  }
Aleksei Stepanenko - realtools.pro - Профиль трейдера
Aleksei Stepanenko - realtools.pro - Профиль трейдера
  • 2025.09.01
  • www.mql5.com
Профиль трейдера
 
Aleksei Stepanenko #:

Если я Вас правильно понял, Вы рассчитываете коэффициент с приходом тика, и также хотите иметь максимальное и минимальное значения этого коэффициента за всю историю. Если это так, то код который я написал должен Вам подойти, по идее.

Он работает следующим образом, на примере минимального значения: На глобальном уровне объявляем переменную минимума, и присваиваем ей максимальное значение. При первом же расчёте коэффициента, он точно не будет больше, вряд ли равен, и скорее всего меньше переменной минимума. И тут же после первого сравнения минимальное значение станет равно коэффициенту. Сравнения со следующими меньшими коэффициентами будут делать минимальную переменную только меньше. Что и требовалось. Цикл не нужен. Вы обрабатываете всё сразу по мере прихода тиков и расчёта коэффициента.

Если Вы что-то делаете в цикле, тогда покажите больший кусок кода с этим циклом, чтобы было понятнее.

Ваш код сразу же проверил, как вы его написали. Не работает. Вы сами проверяли?

Если вы проверяли и у вас выдаёт правильный результат, то это уже вопросы ко мне) - почему у меня не совпадает результат c вашим. 

Циклы... нет. Циклом "for" я не стал делать. У меня нет более чётких очертаний как это сделать.  Я нашёл другой способ. Но этот способ  чёрт- побери - " путь в Москву - через Японию". Там что то страшное получилось из- за которой весь эксперт дико тормозит! грузит систему.

потому что идёт куча опросов разных циклов типа "if"

Я применил массив ArrayMinimum , и сделал грубую градацию уровней по 0,1 в циклах типа if. 

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



if (koef1 > koef1_i_max) // Поиск максимального исторического значения коэффициента "koef1"
{
koef1_i_max=koef1;
}
else 
{ 
if (koef1_i_max>0)
{
koef1_i_max=koef1_i_max;
}
}



 if (koef1 < 2) 
     {
 koef1_min20=koef1;   
     }
 if (koef1 < 1.9) 
     {
 koef1_min19=koef1;   
     }
 if (koef1 < 1.8) 
     {
 koef1_min18=koef1;   
     }
  if (koef1 < 1.7) 
     {
 koef1_min17=koef1;   
     }   
  if (koef1 < 1.6) 
     {
 koef1_min16=koef1;   
     }
  if (koef1 < 1.5) 
     {
 koef1_min15=koef1;   
     }   
  if (koef1 < 1.4) 
     {
 koef1_min14=koef1;   
     }
 if (koef1 < 1.3) 
     {
 koef1_min13=koef1;   
     }
 if (koef1 < 1.2) 
     {
 koef1_min12=koef1;   
     }
 if (koef1 < 1.1) 
     {
 koef1_min11=koef1;   
     } 
 if (koef1 < 1) 
     {
 koef1_min1=koef1;   
     } 
     
     
if (koef1_min20==0)
{
koef1_min20=koef1_i_max;
koef1_min19=koef1_i_max;
koef1_min18=koef1_i_max;
koef1_min17=koef1_i_max;
koef1_min16=koef1_i_max;
koef1_min15=koef1_i_max;
koef1_min14=koef1_i_max;
koef1_min13=koef1_i_max;
koef1_min12=koef1_i_max;
koef1_min11=koef1_i_max;
koef1_min1=koef1_i_max;
}

double ar[]={ koef1_min20, koef1_min19, koef1_min18, koef1_min17, koef1_min16, koef1_min15, koef1_min14, koef1_min13, koef1_min12, koef1_min11, koef1_min1 };

int MaxIndex=ArrayMaximum(ar);
int MinIndex=ArrayMinimum(ar);
double MaxValue=ar[MaxIndex];
double MinValue=ar[MinIndex];
   
//Print ("Индекс с минимальным значением== ",MinIndex);
//Print ("Min значение в индексе== ",MinValue);
koef1_i_min=MinValue;


  

 
Putnik #:

Aleksei Stepanenko дело толкует. )))

"statiс...."

Добавили статик. Интересно, сейчас проверю.

 
Alexey Belyakov #:
Ваш код сразу же проверил, как вы его написали. Не работает. Вы сами проверяли?
Вы невнимательны.
Ваш код:
if (koef1 > koef1_i_max) // Поиск максимального исторического значения коэффициента "koef1"
{
koef1_i_max=koef1;
}
else 
{ 
if (koef1_i_max>0)
{
koef1_i_max=koef1_i_max;
}
}


А его код:
if (koef1 > koef1_i_max) // Поиск максимального исторического значения коэффициента "koef1"
{
koef1_i_max=koef1;
}
if (koef1_i_max>0)
{
koef1_i_max=koef1_i_max;
}


Разницу видите?
 
Putnik #:

Aleksei Stepanenko дело толкует. )))

Нет. Хоть static , хоть не статик...

Не работает.

Переменная отвечающая за минимум в нуле стабильно, и не меняется. (если static)

 
Alexey Belyakov #:
Ваш код сразу же проверил, как вы его написали. Не работает
double koef1_i_max=DBL_MIN;
double koef1_i_min=DBL_MAX;


int OnInit()
   {

   return(INIT_SUCCEEDED);
   }

void OnDeinit(const int reason)
   {

   }

void OnTick()
   {
   double koef1=iClose(Symbol(),0,0); 
   if (koef1 > koef1_i_max) 
     {
     koef1_i_max=koef1;
     }
   if (koef1 < koef1_i_min) 
     {
     koef1_i_min=koef1;
     }
   Comment("koef1_i_max="+DoubleToString(koef1_i_max,5)+"\nkoef1_i_min="+DoubleToString(koef1_i_min,5));  
   }

static нужно убрать

Файлы:
min_max.mq5  1 kb
 

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

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

Возможно он ноль Вам выдаёт. Напишите в программе 

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

printf(DoubleToString(koef1,3));

и почитайте на вкладке Эксперты