Напишу индикатор бесплатно - страница 98

 
Aleksei Stepanenko:

Могу только немного помочь, absolutely free.

Внизу индикатора две функции. В комментарии выводит значение самого индикатора и значение текущей точки на последней трендовой линии.

Разбирайтесь.

Спасибо,Алексей. Всего доброго.
 
A-V-K:
Спасибо,Алексей. Всего доброго.

.

 

Доброго времени суток!

Написал такой индикатор


//+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers   2
#property indicator_width1    1
#property indicator_color1    clrTeal
#property indicator_type1     DRAW_LINE
#property indicator_width2    1
#property indicator_color2    clrCrimson
#property indicator_type2     DRAW_LINE
//---
input ENUM_TIMEFRAMES   period01 =  PERIOD_D1;
input ENUM_TIMEFRAMES   period02 =  PERIOD_M15;
input int               percount =  10;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int    index1=-1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);
   SetIndexBuffer(1, Buffer2, INDICATOR_DATA);
//---
   IndicatorDigits(Digits);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int i, limit, barcount;
   barcount=period01/Period()*percount;
   if(barcount != 0) limit = barcount; 
   else limit = rates_total - 2;
   
   for(i=limit;i>=0;i--)
   {
      if(TimeSeconds(time[i])==0)
      index1=iBarShift(Symbol(), period02, time[i], false);

      if(TimeHour(time[i])==0&&TimeMinute(time[i])<period02)
      {
      Buffer1[i]=iOpen(NULL,period02,index1);
      Buffer2[i]=iOpen(NULL,period02,index1);
      }
      else 
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      if(Buffer1[i]<Buffer1[i+1]){
      Buffer1[i]=Buffer1[i+1];}
      
      Buffer2[i]=iLow(NULL,period02,index1);
      if(Buffer2[i]>Buffer2[i+1]){
      Buffer2[i]=Buffer2[i+1];}
      }
   }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Помогите подправить индикатор или подскажите как.

1) не знаю как задать точку отсчета "period01", чтоб индикатор с началом нового периода начинал с "iOpen".

2) не могу понять как использовать "iHighest", чтоб не использовать такие "кастыли"

if(Buffer1[i]<Buffer1[i+1]){
   Buffer1[i]=Buffer1[i+1];}

Помогите пожалуйста.

 
MakarFX:

Доброго времени суток!

Написал такой индикатор


Помогите подправить индикатор или подскажите как.

1) не знаю как задать точку отсчета "period01", чтоб индикатор с началом нового периода начинал с "iOpen".

2) не могу понять как использовать "iHighest", чтоб не использовать такие "кастыли"

Помогите пожалуйста.

А зачем написал? 

 
Алексей Тарабанов:

А зачем написал? 

Ищу закономерности...

если перенести в подвал выглядит так


 
MakarFX:

Доброго времени суток!

Приветствую, Макар!

А для чего здесь цена открытия? Сразу брать экстремумы первого бара. Типа такого:

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))
   {
   Buffer1[i]=iHigh(NULL,period02,index1);
   Buffer2[i]=iLow(NULL,period02,index1);
   }
else
   {
   if(iHigh(NULL,period02,index1)-Buffer1[i+1]>0)
      {
      Buffer1[i]=iHigh(NULL,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+1];
      }
   if(Buffer2[i+1]-iLow(NULL,period02,index1)>0)
      {
      Buffer2[i]=iLow(NULL,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+1]; 
      }
   }
Или я не правильно понял идею?
 
Aleksei Stepanenko:

Приветствую, Макар!

А для чего здесь цена открытия? Сразу брать экстремумы первого бара. Типа такого:

Или я не правильно понял идею?

Я писал

1) не знаю как задать точку отсчета "period01", чтоб индикатор с началом нового периода начинал с "iOpen".

Сразу брать экстремумы первого бара это правильно и код Ваш после "else" я забираю. Спасибо.

А вот

if(i==limit || TimeDay(time[i])!=TimeDay(time[i+1]))

не подходит, т.к. привязан к началу дня, а мне надо выбор "period01" - Н1;Н4; и так далее

 

Как вариант можно текущую дату делить на количество секунд в таймфрейме, а затем сравнивать полученное значение с предыдущим:

int part=0;

int OnCalculate(......)
   {

   for(......)
      {
      if(time[i]/PeriodSeconds(period01)>part)
         {      
         part=time[i]/PeriodSeconds(period01);
      
         Buffer1[i]=iHigh(NULL,period02,index1);
         Buffer2[i]=iLow(NULL,period02,index1);
         }
      else
.......
      

Вероятно, начало не будет синхронизировано с графиком, но отрезки времени будет считать правильно. Можно подумать, как синхронизировать первое начало отсчёта,

типа:

if(time[i]%PeriodSeconds(period01)==0)
 
Aleksei Stepanenko:

Как вариант можно текущую дату делить на количество секунд в таймфрейме, а затем сравнивать полученное значение с предыдущим:

Вероятно, начало не будет синхронизировано с графиком, но отрезки времени будет считать правильно. Можно подумать, как синхронизировать первое начало отсчёта,

типа:

Спасибо большое, буду пробовать.
 

Не за что. Более короткая запись:

Buffer1[i]=MathMax(iHigh(NULL,period02,index1),Buffer1[i+1]);
Buffer2[i]=MathMin(iLow(NULL,period02,index1),Buffer2[i+1]);
Причина обращения: