Какой фрактал из всех сформированных имеет максимальную цену?

 

Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?

есть код, только он видит ближайший фрактал... в чем проблема...?

void OnTick()
  {
      double price_up[50];
      for(int n = 0;  n < (Bars-1); n ++)
      {
         if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) break;
         fractal_up = n + 1;//индекс бара ближайшего фрактала
         price_up[n] = iHigh(NULL, 0, fractal_up - n);//через цикл заполняем массив ценами фракталов
      }
     
      int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);//поиск индекса в массиве с максимальной ценой
     
      double max = price_up[index_max_price];//присваеваем переменной максимум цены
    

      Comment("max: ", max);//но показывает ближайший фрактал
  }

 
Aleksandr Glebov:

Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?

есть код, только он видит ближайший фрактал... в чем проблема...?

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

У вас стоит проверка, если вы при получении фрактала получаете что-то отличное от нуля (ясное дело, получаете, в обычной ситуации) - то происходит выход из цикла. А вам надо в цикле проверить все фракталы.

 
George Merts:

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

У вас стоит проверка, если вы при получении фрактала получаете что-то отличное от нуля (ясное дело, получаете, в обычной ситуации) - то происходит выход из цикла. А вам надо в цикле проверить все фракталы.

Точно!!! Заработало!!! Спасибо, друг!!! :))))))
 

Неожиданная проблема появилась: не могу понять почему переменная min обнуляется?

for(int n = 0;  n < 25; n ++)
      {
         if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) fractal_up = n + 1;//индекс бара ближайшего фрактала up
         if(iFractals(NULL, 0, MODE_LOWER, n) != NULL) fractal_low = n + 1;
      }
     
      for(int i = 0; i <= 25; i ++)
      {
         price_up[i] = iHigh(NULL, 0, fractal_up - i);
         price_low[i] = iLow(NULL, 0, fractal_low - i);
      }
    
      int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);
      int index_min_price = ArrayMinimum(price_low, WHOLE_ARRAY, 0);
     
      double max = price_up[index_max_price];
      double min = price_low[index_min_price];
     
      Comment("max: ", max, ", min: ", min); // эта переменная иногда показывает ноль, кто знает из-за чего???

 
Aleksandr Glebov:

Неожиданная проблема появилась: не могу понять почему переменная min обнуляется?

Из-за того, что в массиве price_low не 25 фракталов, а меньше. В итоге те элементы массива, которые не были заполнены, содержат 0. А 0 - это минимальное значение в массиве, что и выдает ArrayMinimum.

 

P. S. Для поиска минимального и максимального значения фракталов на интервале N баров проще использовать поиск мин. и макс. цены на этом интервале при помощи iHighest и iLowest.

 
Игорь Герасько:

Из-за того, что в массиве price_low не 25 фракталов, а меньше. В итоге те элементы массива, которые не были заполнены, содержат 0. А 0 - это минимальное значение в массиве, что и выдает ArrayMinimum.

 

Цикл считывает не фрактылы, а бары. То есть, пытается найти за 25 баров все сформированные фракталы. Какой есть выход из ситуации?

 
Aleksandr Glebov:

Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?

есть код, только он видит ближайший фрактал... в чем проблема...?

void OnTick()
  {
      double price_up[50];
      for(int n = 0;  n < (Bars-1); n ++)
      {
         if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) break;
         fractal_up = n + 1;//индекс бара ближайшего фрактала
         price_up[n] = iHigh(NULL, 0, fractal_up - n);//через цикл заполняем массив ценами фракталов
      }
     
      int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);//поиск индекса в массиве с максимальной ценой
     
      double max = price_up[index_max_price];//присваеваем переменной максимум цены
    

      Comment("max: ", max);//но показывает ближайший фрактал
  }

Такой скриптик поглядите:

//+------------------------------------------------------------------+
//|                                               MaxMinFractals.mq4 |
//|              Copyright 2015, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      NumberFractalsForFind=25;
int numberFractalsForFind=(NumberFractalsForFind<1)?1:NumberFractalsForFind;
//--- global variables   
double priceMax=DBL_MIN;   // Максимальная цена найденных фракталов
double priceMin=DBL_MAX;   // Минимальная цена найденных фракталов
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int numberUpFr=0, // количество проверенных верхних фракталов
       numberDnFr=0, // количество проверенных нижних фракталов
       barMaxFr=0,   // бар максимального верхнего фрактала
       barMinFr=0;   // бар максимального нижнего фрактала
   //---
   for(int i=0; i<Bars; i++) {
      double frUp=iFractals(NULL,PERIOD_CURRENT,MODE_UPPER,i);
      double frDn=iFractals(NULL,PERIOD_CURRENT,MODE_LOWER,i);
      if(frUp!=0 && numberUpFr<numberFractalsForFind) {
         numberUpFr++;
         if(frUp>priceMax) {
            priceMax=frUp;
            barMaxFr=i;
            //Print("barMaxFr="+IntegerToString(barMaxFr)+", numberUpFr="+IntegerToString(numberUpFr)+", frUp="+DoubleToString(frUp,Digits)+", priceMax="+DoubleToString(priceMax,Digits));
            }
         }
      if(frDn!=0 && numberDnFr<numberFractalsForFind) {
         numberDnFr++;
         if(frDn<priceMin) {
            priceMin=frDn;
            barMinFr=i;
            //Print("barMinFr="+IntegerToString(barMinFr)+", numberDnFr="+IntegerToString(numberDnFr)+", frDn="+DoubleToString(frDn,Digits)+", priceMin="+DoubleToString(priceMin,Digits));
            }
         }
      }
   Alert("Из верхних максимальная цена (priceMax): "+DoubleToString(priceMax,Digits)+" на баре "+IntegerToString(barMaxFr)+", время бара: "+TimeToString(Time[barMaxFr])+"\n"+
         "Из нижних минимальная цена (priceMin): "+DoubleToString(priceMin,Digits)+" на баре "+IntegerToString(barMinFr)+", время бара: "+TimeToString(Time[barMinFr]));
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Такой скриптик поглядите:

Спасибо, за помощь Artyom Trishkin !!! :)
 

Aleksandr Glebov:

 

Цикл считывает не фрактылы, а бары. То есть, пытается найти за 25 баров все сформированные фракталы. Какой есть выход из ситуации?

Выход простой: понять суть ошибки и написать правильно.

double max = 0.0, min = 0.0;

for(int n = 0;  n < 25; n ++)
{
   if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) 
      max = MathMax(iHigh(NULL, 0, n));

   if(iFractals(NULL, 0, MODE_LOWER, n) != NULL)
      if (min == 0.0 || iLow(NULL, 0, n) < min)
          min = iLow(NULL, 0, n);

} 

Comment("max: ", max, ", min: ", min); 
Причина обращения: