iHigh, iLow

 
Здравствуйте. Нужна функция аналог iHigh и iLow из MQL4. То есть, нужен максимум или минимум за нужное количество свечей. 
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Тестируем 'CopyTicks'

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
 
Igor Knyazkov:
Здравствуйте. Нужна функция аналог iHigh и iLow из MQL4. То есть, нужен максимум или минимум за нужное количество свечей. 

   double hist_high[];
   double hist_low[];

   if(CopyLow(_Symbol,PERIOD_CURRENT,0,bars,hist_low)!=-1)
     {
      min=NormalizeDouble(hist_low[ArrayMinimum(hist_low)],_Digits);
     }
   if(CopyHigh(_Symbol,PERIOD_CURRENT,0,bars,hist_high)!=-1)
     {
      max=NormalizeDouble(hist_high[ArrayMaximum(hist_high)],_Digits);
     }
 
Igor Knyazkov:
Здравствуйте. Нужна функция аналог iHigh и iLow из MQL4. То есть, нужен максимум или минимум за нужное количество свечей. 

Функции и Ваш вопрос не согласуются между собой, но, думаю нужно это:

//+------------------------------------------------------------------+
//| Get the High for specified bar index                             |
//+------------------------------------------------------------------+
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+
//| Get Low for specified bar index                                  |
//+------------------------------------------------------------------+
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }

Получение цен открытия (iHigh) и закрытия (iLow) указанного бара на указанном символе и на указанном таймфрейме.

 
Vladimir Karputov:

Функции и Ваш вопрос не согласуются между собой, но, думаю нужно это:

//+------------------------------------------------------------------+
//| Get the High for specified bar index                             |
//+------------------------------------------------------------------+
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+
//| Get Low for specified bar index                                  |
//+------------------------------------------------------------------+
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }

Получение цен открытия (iHigh) и закрытия (iLow) указанного бара на указанном символе и на указанном таймфрейме.

Мне, как раз, нужен максимум или минимум за n количество баров. Не Хай или Лой на n баре. В МТ4 функции iLow() и iHigh() именно это возвращали.
 
Igor Knyazkov:
Мне, как раз, нужен максимум или минимум за n количество баров. Не Хай или Лой на n баре. В МТ4 функции iLow() и iHigh() именно это возвращали.

Да ну? А если проверить :) ?

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

Здесь параметр shift как раз отвечает за то, С КАКОГО БАРА получать значение. Ни о каком интервале не идёт речь.

 
Igor Knyazkov:
Мне, как раз, нужен максимум или минимум за n количество баров. Не Хай или Лой на n баре. В МТ4 функции iLow() и iHigh() именно это возвращали.

Может вы про эти функции имели ввиду

 

int  iHighest(
   string           symbol,          // символ
   int              timeframe,       // период
   int              type,            // идентификатор таймсерии
   int              count,           // число элементов
   int              start            // индекс
  );


int  iLowest(
   string           symbol,          // символ
   int              timeframe,       // период
   int              type,            // идентификатор таймсерии
   int              count,           // число элементов
   int              start            // индекс
  );

 
Sergey Gritsay:

Может вы про эти функции имели ввиду

 

int  iHighest(
   string           symbol,          // символ
   int              timeframe,       // период
   int              type,            // идентификатор таймсерии
   int              count,           // число элементов
   int              start            // индекс
  );


int  iLowest(
   string           symbol,          // символ
   int              timeframe,       // период
   int              type,            // идентификатор таймсерии
   int              count,           // число элементов
   int              start            // индекс
  );

Сергей, первый предложенный Вами вариант был именно тем, что надо. Спасибо.
 
Vladimir Karputov:

Да ну? А если проверить :) ?

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

Здесь параметр shift как раз отвечает за то, С КАКОГО БАРА получать значение. Ни о каком интервале не идёт речь.

Да. Я напутал :)
Причина обращения: