Кто знает как, помогите с RSI (для понымающих в MQL4).

 
Привет всем,

во второй раз уже обращаюсь к вам, уважаемые программисты mql, может у кого то уже есть или кому то будет не трудно переделать(доделать) стандартный RSI так чтоб он работал как показано на рисунке, то есть что бы он фиксировал после закрытия бара не только свое стандартное значение а еще и свои максимальные и минимальные значения во время этого бара, как канал или как ёлочка.

Буду благодарен за любого рода помощь!!




 

а что он делает, если что подправь, на выходе получится три линии РСА,

1 вверхняя как бы - по цене - HIGH

2 средняя по цене - CLOSE или (можно поробывать HIGH+LOW / 2)

3 нижняя - LOW

если что можно попробывать изменить индикатор, он назывался, RSI -"который показывыал с разных таймфреймов", т.е. он рисовал линии RSI на одном графике однако с разных таймфреймов.

Я думаю можно поковырять в коде и зделать что надо вам.

------------------------------------------

п.с. только дома, через пару часов

 

короче до дома не дотягул...

сделал

//+------------------------------------------------------------------+
//|                                                     #RSI-3TF.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//|                                                                  |
//|                   29.10.2005 Модернизация Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|code change by Alex.Piech.FinGeR                                  |
//|https://www.forex-tsd.com                                          |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Yellow
#property indicator_color3 Red
#property indicator_level1 70
#property indicator_level2 30
#property indicator_level3 50
//------- Внешние параметры индикатора -------------------------------
extern int TF_1       =60;
extern int RSI_Period_1=14;
extern int TF_2        =60;
extern int RSI_Period_2=14;
extern int TF_3        =60;
extern int RSI_Period_3=14;
extern int NumberOfBars=1000;  // Количество баров обсчёта (0-все)
//------- Буферы индикатора ------------------------------------------
double RSIBuffer1[];
double RSIBuffer2[];
double RSIBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  void init() 
  {
   string short_name;
//---- indicator line
   SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(0, RSIBuffer1);
   SetIndexStyle (1, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(1, RSIBuffer2);
   SetIndexStyle (2, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(2, RSIBuffer3);
//---- name for DataWindow and indicator subwindow label
   short_name="RSI("+RSI_Period_1+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   short_name="RSI("+RSI_Period_2+")";
   SetIndexLabel(1,short_name);
   short_name="RSI("+RSI_Period_3+")";
   SetIndexLabel(2,short_name);
   SetIndexDrawBegin(0,RSI_Period_1);
   SetIndexDrawBegin(1,RSI_Period_2);
   SetIndexDrawBegin(2,RSI_Period_3);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
  void start() 
  {
   int LoopBegin, sh, nsb,nsb2,nsb3;
   if (NumberOfBars==0) LoopBegin=Bars-1;
   else LoopBegin=NumberOfBars-1;
//----
     for(sh=LoopBegin; sh>=0; sh--) 
     {
      nsb3=iBarShift(NULL, TF_1, Time[sh], False);
      nsb=iBarShift(NULL, TF_2, Time[sh], False);
      nsb2=iBarShift(NULL, TF_3, Time[sh], False);
      RSIBuffer1[sh]=iRSI(NULL, TF_1, RSI_Period_1, PRICE_HIGH, nsb3);
      RSIBuffer2[sh]=iRSI(NULL, TF_2, RSI_Period_2, PRICE_CLOSE, nsb);
      RSIBuffer3[sh]=iRSI(NULL, TF_3, RSI_Period_3, PRICE_LOW, nsb2);
     }
  }
//+------------------------------------------------------------------+

если есть ошибки профи можете подправить?!

индикатор прикрепляю...

Файлы:
 

Топикстартера интересуют пиковые значения индикатора - это не одно и то же, что посчитать его отдельно по high и low. Для примера, так считается MA с пиковыми значениями:

пусть будет трех-барная простая МА

ее значение по закрытиям = (Close[i-2] + Close[i-1] + Close[i]) / 3;

с пиковым значением по High: MA = (Close[i-2] + Close[i-1] + High[i]) / 3;

с пиковым значением по Low: MA = (Close[i-2] + Close[i-1] + Low[i]) / 3;


Т.е. надо глубинно переписывать сам код индикатора. Смысла в этом для себя не вижу. Как делать - надеюсь, объяснил.

 

Суть уловил, просто вопрос,

а индикатор iRSI(NULL, TF_3, RSI_Period_3, PRICE_LOW, nsb2); в значении PRICE_LOW показывет не самое низкое значение?

 
asisdes >>:

Суть уловил, просто вопрос,

а индикатор iRSI(NULL, TF_3, RSI_Period_3, PRICE_LOW, nsb2); в значении PRICE_LOW показывет не самое низкое значение?

Для ряда Low[] он показывает СВОЕ значение. Вам же нужно ряд Сlose[], где последний (нулевой) элемент ряда равен High или Low. Понятно теперь?

 
Svinozavr >>:

Для ряда Low[] он показывает СВОЕ значение. Вам же нужно ряд Сlose[], где последний (нулевой) элемент ряда равен High или Low. Понятно теперь?

Вот это взгляд в суть вопроса! +2!

И тогда получится должна точно именно ёлочка.

И нужно 5 буферов: 1й буфер на RSI,

2,3й буфера- рисуют елочку на чётных барах, 4,5й на нечетных.

 
jartmailru >>:

Вот это взгляд в суть вопроса! +2!

И тогда получится должна точно именно ёлочка.

И нужно 5 буферов: 1й буфер на RSI,

2,3й буфера- рисуют елочку на чётных барах, 4,5й на нечетных.

Нет. Все проще решается. Нужно три раза считать RSI по трем ценовым рядам. Один ряд - обычный Close[], два других - как я написал выше. Т.е. в каждый текущий момент [i] элемент этих индексных массивов будет High для одного и Low для другого. Остальные элементы от [i+1] до [Bars-1] должны быть равны Close.

Блин... Ну неохота мне перелопачивать RSI! Вам нужно взять код RSI и менять там. Через встроенный iRSI этого НЕ СДЕЛАТЬ!

 
Svinozavr >>:

Нет. Все проще решается. Нужно три раза считать RSI по трем ценовым рядам. Один ряд - обычный Close[], два других - как я написал выше. Т.е. в каждый текущий момент [i] элемент этих индексных массивов будет High для одного и Low для другого. Остальные элементы от [i+1] до [Bars-1] должны быть равны Close.

Блин... Ну неохота мне перелопачивать RSI! Вам нужно взять код RSI и менять там. Через встроенный iRSI этого НЕ СДЕЛАТЬ!

ДА ВСЕ ПОНЯТНО.

Да. нужна функция, кторая берет значение для последнего бара фиксированное.

Либо Low, либо Close, либо High.

Ну что за люди пошли?! 

Ему говоришь комплимент - спасибо мол, хорошо объяснил- а он тебе по второму разу.

ПОВТОРЯЮ: ВЫ ПРАВЫ.

.

А человеку надо действительно ЁЛОЧКУ.

Я просто уже рисовал ёлочки. 

Если на каждом баре две веточки- то это пять буферов!

Svinozavr, С НОВЫМ ГОДОМ!!! :-)

 

))) И вас также! Да понял я. Просто елочку я бы графикой решил, а не буферами.

Топикстартеру елочка нужна как или пиковые значения, а не исключительно и только. А вот пиковые значения я бы решил не линиями, а DRAW_ARROW или опять же через гр. объекты. Очень наглядно.

 

Вот, писал когда-то пример для графики именно на MA с пиковыми значениями. Код прилагаю на всякий случай - там каменты подробные. МА экспоненциальная и для простоты примера я не стал пересчитывать ее коэфф. из периода - просто сразу задаю коэфф-т: 0.5, к примеру, это EMA(3).

Здесь синие отрезки EMA по Close, красные - пик EMA по High, зеленые - пик по Low для каждого бара. Т.е. это как если бы цена закрытия для конкретного бара была равна High и Low.


============================

Только учтите, что результатом вы скорее всего будете разочарованы, т.к. пиковые значения для RSI(14) будет практически неотличимы от закрытий. Более-менее их можно будет увидеть от периода 7 и ниже.

В случае бОльших периодов нужно подменять хаем или лоем не только [i] элемент, а больше. Иначе ничего не разглядите.

Кароч, это (ИМХО) ни нафиг не нужно. Тестер эти значения сэмулирует, а желание видеть это на экране постоянно... ну, можно. Хотя есть режим визуализации - там видно.

Файлы:
Причина обращения: