как определить несколько максимальных цен и показать их?

 
имеем
// Получаем максимальную цену за последние 10 баров
double MaxPrice()
{

       double dHigh = 0, 
              dPrice;

       for(int i=1; i<=20; i++)
       {
       dPrice=iHigh(Symbol(),PERIOD_H4,i);
       if(dPrice > dHigh) 
          dHigh = dPrice;
       }
       
       return(dHigh);
}
нужно чтобы он искал не одну максимальную цену за последние 20 баров а например если есть 2 цены но одна близкая к максимальной.. как их показать ??
 
tehpp:
имеем


закиньте значение баров в матрицу, потом сортируйте матрицу

или так

 ArraySetAsSeries(High,true);
 CopyHigh(Symbol(),PERIOD_H4,0,20,High);

уже будет отсортирован в зависимости от флага, так 0,1,2,3,4,5....... или так 19,18,17,16.........

 
В любом случае придется определить, что такое близкие значения, либо(совсем коряво) задать сколько именно "максимальных" значений необходимо.
 
      int x=0, y=0;
      double BufferHigh[999];
      double BufferLow[999];
      datetime BufferHighTime[999];
      datetime BufferLowTime[999];
      for(int i=1; i<Bars; i++)
      {
      if (High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1])
         {
         BufferHigh    [x] = High[i];
         BufferHighTime[x] = Time[i];
         x++;
         }
      if (Low[i]<Low[i+1]   && Low[i]<Low[i+2]   && Low[i]<Low[i-1])
         {
         BufferLow    [y] = Low[i];
         BufferLowTime[y] = Time[i];
         y++;
         }
      }
 
elmucon:


тут прокладка может получиться
 
pako:

тут прокладка может получиться



РАБОТАЕТ

//+------------------------------------------------------------------+
   for(i=0; i<limit; i++)
      {
      BufferStoh[i]    = iStochastic(_Symbol,PERIOD_CURRENT,KPeriod,DPeriod,Slowing,StohMethod,int(StohMode),MODE_MAIN,i);
      }
//+------------------------------------------------------------------+
   x=0; y=0;
   for(i=0; i<250; i++)
      {
      BufferTrogUp  [i] = EMPTY_VALUE; BufferPeakDn  [i] = EMPTY_VALUE;
      BufferTrogTime[i] = EMPTY_VALUE; BufferPeakTime[i] = EMPTY_VALUE;
      }
   for(i=1; i<limit-10; i++)
      {
      if (BufferStoh[i]<BufferStoh[i+1] && BufferStoh[i]<BufferStoh[i+2] && BufferStoh[i]<BufferStoh[i-1])
         {
         BufferTrogUp  [x] = BufferStoh[i];
         BufferTrogTime[x] = Time[i];
         x++;
         }
      if (BufferStoh[i]>BufferStoh[i+1] && BufferStoh[i]>BufferStoh[i+2] && BufferStoh[i]>BufferStoh[i-1])
         {
         BufferPeakDn  [y] = BufferStoh[i];
         BufferPeakTime[y] = Time[i];
         y++;
         }
      }
 
elmucon:



РАБОТАЕТ


я не спорю работает, но прокладка может получиться, если значений соответствующих условию

High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1]

будет больше одного

 
pako:


я не спорю работает, но прокладка может получиться, если значений соответствующих условию

будет больше одного



при точности В 0,00001 очень редкое явление
 
elmucon:


при точности В 0,00001 очень редкое явление


на 20и барах 4 значения, какое из них верное?

 

Мне так проще осозновать

66666666655

//+------------------------------------------------------------------+
//|                       EMC.SYS.DIVER                              |
//|                     ELMUCON ™" © 2014                            |
//|             (Electronic Multi Configurators ™")                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014 by ELMUCON ™"
#property link      "" 
#property version   "1.02"   ""
#property description "Демо! Пол Индикатора дивергенции между стохастиком и ценой"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1  clrGray
#property indicator_color2  clrLime
#property indicator_color3  clrRed
#property indicator_width1  2
#property indicator_width2  0
#property indicator_width3  0
//+------------------------------------------------------------------+
enum Stoh_Mode
  {
  LH=0,     // Low/High
  CC=1,     // Close/Close
  };
enum YesNo
  {
  ys=0,     // Да
  no=1,     // Нет
  };
//+------------------------------------------------------------------+
input string __0__ = " <<< EMC.SYS.DIVER >>>";        // Индикатор дивергенции стохастика и цены
input int            CountBars    = 1000;             // Количество считаемых баров
input string __1__ = "<<< Настройки Stochastic >>>";  // Настройки индикатора Stochastic
input int            KPeriod      = 5;                // K% периуд стохастика
input int            DPeriod      = 3;                // D% периуд стохастика
input int            Slowing      = 5;                // Замедление стохастика
input ENUM_MA_METHOD StohMethod   = MODE_LWMA;        // Метод усреднения стохастика
input Stoh_Mode      StohMode     = LH;               // Тип цены стохастика
input YesNo          ReversDiver  = ys;               // Показывать обратную дивергенцию
//+------------------------------------------------------------------+
double   BufferStoh[];
double   ArrowUp[];
double   ArrowDn[];
double   BufferTrogUp  [250];
datetime BufferTrogTime[250];
double   BufferPeakDn  [250];
datetime BufferPeakTime[250];
int      i,x,y,limit;
string   short_name;

//+------------------------------------------------------------------+
int OnInit(void)
  {
   short_name="EMC.SYS.DIVER ("+string(KPeriod)+","+string(DPeriod)+","+string(Slowing)+")";
   IndicatorShortName (short_name);
   IndicatorDigits    (0);
   IndicatorBuffers   (3);
   SetIndexBuffer     (0,BufferStoh);
   SetIndexStyle      (0,DRAW_LINE);
   SetIndexLabel      (0,short_name);
   SetIndexBuffer     (1,ArrowUp);
   SetIndexStyle      (1,DRAW_ARROW);
   SetIndexArrow      (1,233);
   SetIndexBuffer     (2,ArrowDn);
   SetIndexStyle      (2,DRAW_ARROW);
   SetIndexArrow      (2,234);
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetDouble (INDICATOR_LEVELVALUE,0,80);
   IndicatorSetDouble (INDICATOR_LEVELVALUE,1,20);
   IndicatorSetDouble (INDICATOR_MINIMUM,0);
   IndicatorSetDouble (INDICATOR_MAXIMUM,100);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
int OnCalculate(const int      rates_total,
                const int      prev_calculated,
                const datetime &time[],
                const double   &open[],
                const double   &high[],
                const double   &low[],
                const double   &close[],
                const long     &tick_volume[],
                const long     &volume[],
                const int      &spread[])
  {
//+------------------------------------------------------------------+
   limit=CountBars+MathMax(KPeriod,DPeriod);
//+------------------------------------------------------------------+
   for(i=0; i<limit; i++)
      {
      BufferStoh[i]    = iStochastic(_Symbol,PERIOD_CURRENT,KPeriod,DPeriod,Slowing,StohMethod,int(StohMode),MODE_MAIN,i);
      }
//+------------------------------------------------------------------+
   x=0; y=0;
   for(i=0; i<250; i++)
      {
      BufferTrogUp  [i] = EMPTY_VALUE; BufferPeakDn  [i] = EMPTY_VALUE;
      BufferTrogTime[i] = EMPTY_VALUE; BufferPeakTime[i] = EMPTY_VALUE;
      }
   for(i=1; i<limit-10; i++)
      {
      if (BufferStoh[i]<BufferStoh[i+1] && BufferStoh[i]<BufferStoh[i+2] && BufferStoh[i]<BufferStoh[i-1])
         {
         BufferTrogUp  [x] = BufferStoh[i];
         BufferTrogTime[x] = Time[i];
         x++;
         }
      if (BufferStoh[i]>BufferStoh[i+1] && BufferStoh[i]>BufferStoh[i+2] && BufferStoh[i]>BufferStoh[i-1])
         {
         BufferPeakDn  [y] = BufferStoh[i];
         BufferPeakTime[y] = Time[i];
         y++;
         }
      }
   for(i=0; i<100; i++)
      {
      if (BufferTrogUp[i] != 0 && BufferTrogUp[i]>BufferTrogUp[i+1])
         {
         ArrowUp[iBarShift(Symbol(),0,BufferTrogTime[i],false)] = BufferTrogUp[i];
         }
      if (BufferTrogUp[i] != 0 && BufferTrogUp[i]<BufferTrogUp[i+1] && ReversDiver == 0)
         {
         ArrowUp[iBarShift(Symbol(),0,BufferTrogTime[i],false)] = BufferTrogUp[i];
         }
      if (BufferPeakDn[i] != 0 && BufferPeakDn[i]<BufferPeakDn[i+1])
         {
         ArrowDn[iBarShift(Symbol(),0,BufferPeakTime[i],false)] = BufferPeakDn[i];
         }
      if (BufferPeakDn[i] != 0 && BufferPeakDn[i]>BufferPeakDn[i+1] && ReversDiver == 0)
         {
         ArrowDn[iBarShift(Symbol(),0,BufferPeakTime[i],false)] = BufferPeakDn[i];
         }
      }
//+------------------------------------------------------------------+
   return(rates_total);
  }

 
#property description "Демо! Пол Индикатоа дивергенции между стохастиком и ценой"

не привык я к полумерам:))