Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 978

 
Vadim_2015:

 Алгоритм понятен, разобрался. Сделал на примере, все работает. 

Спасибо огромное!

А, с первым вопросом(про максимумы), не объясните по-подробнее, как его реализовать?  Если можно с небольшим алгоритмом. Уж больно хорошо у Вас получается:)

Я рад что меня понимает ещё кто-то кроме меня самого.

Vadim_2015:
Здравствуйте уважаемые форумчане!

Начал изучать язык MQL4 и при написании простого индикатора столкнулся с проблемой, которую никак не могу решить. Суть проблемы:

1_как найти High оставшейся части дня, есть простой цикл Close[i]-Open[i+1], необходимо найти High[i - до конца дня]. Например, от[i],[1],[2] и до конца дня (PERIOD_H1) . Ума не приложу как это сделать. Есть функция      'iHigh' , но это немного не то.


Это как раз то что надо. High текущего дня независимо от того, сколько времени осталось до конца дня.

double  iHigh( 
   string           symbol,          // _Symbol
   int              timeframe,       // PERIOD_D1
   int              shift            // 0
   );

Если я правильно понял суть вопроса.

 
AlexeyVik:

Я рад что меня понимает ещё кто-то кроме меня самого.

Это как раз то что надо. High текущего дня независимо от того, сколько времени осталось до конца дня.

Если я правильно понял суть вопроса.

Немного по другому, как понял я.    Как то так.
bar=iBarShift(NULL,0,t1,false);   //по времени, находим индекс бара
barH=iHighest(NULL,0,MODE_HIGH,bar+1,1);  //находим максимум, в этом промежутке    
 
r772ra:
Немного по другому, как понял я.    Как то так.

Ну так именно это и советовали до меня.
Но iHighest(NULL, MODE_HIGH, bar+1, 1) возвращает индекс бара High которого выше всех остальных на этом промежутке, а ты спрашивал про High текущего дня.

 
AlexeyVik:

Ну так именно это и советовали до меня.
Но iHighest(NULL, MODE_HIGH, bar+1, 1) возвращает индекс бара High которого выше всех остальных на этом промежутке, а ты спрашивал про High текущего дня.

Согласен, "iHighest(NULL, MODE_HIGH, bar+1, 1) возвращает индекс бара High которого выше всех остальных на этом промежутке" . А я имею ввиду High оставшегося текущего дня.

 Попробую пояснить точнее...

#property indicator_separate_window
#property indicator_buffers 1

#property indicator_label1  "longBars"

#property indicator_color1 clrBlue

#property indicator_width1 2

//---углубление в историю на...
extern int barsToProcess = 100;
//---indicators Buffers
double   longBarsBuffer[];        
                

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,longBarsBuffer);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   
   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 counted_bars=IndicatorCounted(), 
       limit;

   if (counted_bars<0) return(-1);
   if (counted_bars>0)       
       counted_bars--;       
      
   limit=Bars-counted_bars;
   if(limit>barsToProcess)                                  
      limit=barsToProcess;
  
   double  longValue;
      
                            
   for(int i=0;i<limit;i++)
      {
       longValue = Close[i+1]-Open[i+3];
       
//--- само условие
         
       if(longValue>0) 

//---собственно что необходимо получить: если на i-том баре выполнилось условие(i>0), то находим High от этого бара и 
//---до конца этого дня,я имею ввиду максимум всего этого промежутка. Примерно: Если условие выполнилось 
//---на i=12h,то High от 12 до 00:00,
//--- если i=01:00, то High от 01:00 до 00:00, если i=22:00, то High от 22:00 до 00:00. Как то так.  Возможно ли это реализовать?  
//---Может я не правильно сделал цикл? Как его правильно организовать?
                  
       longBarsBuffer[i]=High[от i - и до конца дня] - то что необходимо получить. 
       else 
          longBarsBuffer[i]=0.0; 
       

 Если можно сильно не ругайте:) ...объясните пожалуйста, как это сделать? 

 
Vadim_2015:

Согласен, "iHighest(NULL, MODE_HIGH, bar+1, 1) возвращает индекс бара High которого выше всех остальных на этом промежутке" . А я имею ввиду High оставшегося текущего дня.

 Попробую пояснить точнее...

 Если можно сильно не ругайте:) ...объясните пожалуйста, как это сделать? 

Сначала я подумал что это простая очепятка, но теперь уже нет сомнений, ты хочешь заглянуть в будущее??? Тогда тебе поможет только Док из фильма "Назад в будущее".
 
AlexeyVik:
Сначала я подумал что это простая очепятка, но теперь уже нет сомнений, ты хочешь заглянуть в будущее??? Тогда тебе поможет только Док из фильма "Назад в будущее".

Боюсь, Док мне не поможет...не тем занимается:)

Да этот вопрос, " High оставшегося текущего дня.",  ставит немного в тупик. До самого только дошло,  действительно можно подумать, что это попытка  заглянуть в будущее в этот день . Это немного не так.  Я хотел считать _High оставшегося текущего дня с начала ценового  массива и до предпоследнего дня(вчерашнего),  т.к. все данные есть. А последний(сегодняшний) день пересчитывать как только он завершиться. Иначе все будет выглядеть как Вы и сказали _ попытка заглянуть в будущее!  Если начинать с начала ценового массива, и продвигаясь до конца(вчерашнего дня), то, High на каждом последующем проверяемом баре будет меняться.  Поэтому и спрашивал как вычесть High оставшейся части дня. Недоговорил только что текущий день не берется, т.к. еще не завершен. Простите, сразу и не сообразил:) . Подскажите, как организовать такой расчет? Вообще он возможен?     

 
Vadim_2015:

Боюсь, Док мне не поможет...не тем занимается:)

Да этот вопрос, " High оставшегося текущего дня.",  ставит немного в тупик. До самого только дошло,  действительно можно подумать, что это попытка  заглянуть в будущее в этот день . Это немного не так.  Я хотел считать _High оставшегося текущего дня с начала ценового  массива и до предпоследнего дня(вчерашнего),  т.к. все данные есть. А последний(сегодняшний) день пересчитывать как только он завершиться. Иначе все будет выглядеть как Вы и сказали _ попытка заглянуть в будущее!  Если начинать с начала ценового массива, и продвигаясь до конца(вчерашнего дня), то, High на каждом последующем проверяемом баре будет меняться.  Поэтому и спрашивал как вычесть High оставшейся части дня. Недоговорил только что текущий день не берется, т.к. еще не завершен. Простите, сразу и не сообразил:) . Подскажите, как организовать такой расчет? Вообще он возможен?

Попробую понять ваш вопрос. Вам надо найти High среди баров 1) предыдущий день и то что есть на сегодня, или 2) только то что есть на сегодня? Может iHighest() поможет?
 
paladin80:
Попробую понять ваш вопрос. Вам надо найти High среди баров 1) предыдущий день и то что есть на сегодня, или 2) только то что есть на сегодня? Может iHighest() поможет?

Уважаемые, попробую объяснить по-максимуму чего хочу добиться...    ..или получится у меня ..или совсем всех запутаю!

 Вот смотрите,   есть массив цен, допустим с _1.02.2015. по 15.12.2015(сегодняшний день) ,берем PERIOD_H1.

1_беру простую формулу   _val=Close[i]-Open[i] 

2_задаю простое условие if (val>0)   - проверку нужно начинать с _1.02.2015.

   -если условие выполнилось, допустим на каком то баре, то от этого бара и до конца этого дня находим _High.  Например:  Close[4]-Open[4]>0, т.е. допустим бар с  индексом[i=4]  принадлежит _1.02.2015  10:00,                   значит    от 10:00 -этого дня   и до 00:00 - конца этого дня, -  находим _High. Соответственно, если  условие сработало в другой день , то действуем по аналогичному принципу.   И так через весь массив цен.                       Расчет должен начинаться с _1.02.2015. до 14.12.2015 (предпоследнего дня), почему до предпоследнего дня, - т.к. последний день еще не завершен и High всего дня  не известен . Как только завершится                           последний день, - проверяем  и   его на условие.  Так как данные с _1.02.2015. до 14.12.2015 (предпоследнего дня)       известны, то это не будет выглядеть как -попытка заглянуть в будущее:)

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

  Вот собственно вся "задумка". Как ее сделать, как определить через цикл, - ума не приложу!  

 
Vadim_2015:

Боюсь, Док мне не поможет...не тем занимается:)

Да этот вопрос, " High оставшегося текущего дня.",  ставит немного в тупик. До самого только дошло,  действительно можно подумать, что это попытка  заглянуть в будущее в этот день . Это немного не так.  Я хотел считать _High оставшегося текущего дня с начала ценового  массива и до предпоследнего дня(вчерашнего),  т.к. все данные есть. А последний(сегодняшний) день пересчитывать как только он завершиться. Иначе все будет выглядеть как Вы и сказали _ попытка заглянуть в будущее!  Если начинать с начала ценового массива, и продвигаясь до конца(вчерашнего дня), то, High на каждом последующем проверяемом баре будет меняться.  Поэтому и спрашивал как вычесть High оставшейся части дня. Недоговорил только что текущий день не берется, т.к. еще не завершен. Простите, сразу и не сообразил:) . Подскажите, как организовать такой расчет? Вообще он возможен?     

Ну если так, то опять возвращаемся к iHighest() но сколько баров считать и от которого начинать надо рассчитать с помощью iBarShift()
 
AlexeyVik:
Ну если так, то опять возвращаемся к iHighest() но сколько баров считать и от которого начинать надо рассчитать с помощью iBarShift()  

   Вы не могли бы показать, как это  сделать в цикле? Не могу сообразить как правильно его оформить. 

Причина обращения: