Поиск значения RSI.

 

Задача следующего характера: нужно найти цену при которой индикатор RSI будет равен некоему исуомому значению.

Например, индикатор RSI(7) равен 52,1761 при цене1,2041 нужно найти ЦЕНУ при которой он будет равен 37.3518 НО НА ЭТОМ ЖЕ БАРЕ!!!

Делаю следующее:

int start()
{
int i;
for(i=0;i<Bars;i++)ExtBuffer4[i]=Close[i];
for(i=0;i<Bars;i++)
{
ExtBuffer4[0]=ExtBuffer4[0]-Point;
if(iRSIOnArray(ExtBuffer4,0,7,0)<20)return(0);
Alert(iRSIOnArray(ExtBuffer4,0,7,0));
}
return(0);
}

показывает все время одну цену.Складывается такое ощущение что iRSIonArray при первом вызове делает пересчет а потом не хочет.

Кто может помочь решить задачу отзовитесь. Можно на мыло Artem777@obninsk. com

 
Странный лобовой подход к решению. Необходимо просто сначала решить задачу в аналитическом виде, а потом по найденной формуле безо всяких переборов находить цену, при которой индикатор достигнет нужного значения. Почитайте Один эксперт у одного брокера на разных терминалах и счетах, результат разный , также посмотрите Вычисление значений цены для значения индикатора .
 

артем, я уже отвечал тебе в предыдущей теме - 'КТО ПОДСКАЖЕТ'

во первых нужно указать массив ArraySetAsSeries(ExtBuffer4,true);

во 2х правильно организовать цикл перебора.

где-то так:

int findRSIprice(double rsiLevel, int rsiPeriod)  {
   if (rsiLevel<0 || rsiLevel>100) return(-1);
   int dir;  double rsi;
   ArraySetAsSeries(ExtBuffer4,true);
   ArrayCopySeries(ExtBuffer4,MODE_CLOSE,Symbol(),Period());
   rsi=iRSIOnArray(ExtBuffer4,0,rsiPeriod,0);
   if (rsi>rsiLevel) {
       while (rsi>rsiLevel) {
           ExtBuffer4[0]=ExtBuffer4[0]-Point;
           rsi=iRSIOnArray(ExtBuffer4,0,rsiPeriod,0);
       }
       return(ExtBuffer4[0]);
   }
   else if (rsi<rsiLevel) {
       while (rsi<rsiLevel) {
           ExtBuffer4[0]=ExtBuffer4[0]+Point;
           rsi=iRSIOnArray(ExtBuffer4,0,rsiPeriod,0);
       }
       return(ExtBuffer4[0]);
   }
   else return(ExtBuffer4[0]);
}
 
nickbilak использую твой код все равно все виснит и ничего не делает #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Green double ExtBuffer0[]; int init() {IndicatorBuffers(1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtBuffer0); return(0);} extern double A=1; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int i; for(i=0;iA) { while(rsi>A) { ExtBuffer0[0]=ExtBuffer0[0]-Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]);} else if (rsiA) { while(rsiA) { ExtBuffer0[0]=ExtBuffer0[0]+Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]); } else return(ExtBuffer0[0]);}
Файлы:
zeddez111.mq4  2 kb
 
artem:
nickbilak использую твой код все равно все виснит и ничего не делает #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Green double ExtBuffer0[]; int init() {IndicatorBuffers(1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtBuffer0); return(0);} extern double A=1; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int i; for(i=0;iA) { while(rsi>A) { ExtBuffer0[0]=ExtBuffer0[0]-Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]);} else if (rsiA) { while(rsiA) { ExtBuffer0[0]=ExtBuffer0[0]+Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]); } else return(ExtBuffer0[0]);}

Похоже вы друг друга не понимаете. Например я тоже не понимаю такой формулировки "Например, индикатор RSI(7) равен 52,1761 при цене1, 2041 нужно найти ЦЕНУ при которой он будет равен 37. 3518 НО НА ЭТОМ ЖЕ БАРЕ!!!". В данном случае речь может идти тольк о нулевом баре. Искать нечего. Пока он не сформировался значения могут ( и будут) меняться. Но эти изменения находятсяво вполен определнных пределах. Может оказаться, что требуемое условие не выполнится никогда в обозримом будущем. Может нужно сменить вопрос, тогда сменится и ответ.
 
artem:

Задача следующего характера: нужно найти цену при которой индикатор RSI будет равен некоему исуомому значению.

Например, индикатор RSI(7) равен 52,1761 при цене1,2041 нужно найти ЦЕНУ при которой он будет равен 37.3518 НО НА ЭТОМ ЖЕ БАРЕ!!!

На мой взгляд задача очень полезная и не только для RSI, но и для других индикаторов.
Сам все хочу реализовать, только руки пока не дошли. А делать, думаю надо так:
- копируем массив с нужными данными в свой массив A[7]
- сделать его "с правильным расположением элементов"(ArraySeries, сам с этим постоянно напрягаюсь)
- в нашем случае RSI(7) берм 7 последних значений
- подставляем в 0 ячейку 1,2041
- вычисляем:
rsi=iRSIOnArray(A,0,7,0);	
Может я чего-то упустил? Поправьте.
С уважением,
Владимир

P.S. Обнинску привет из Дмитрова
 
Vinin:
artem:
nickbilak использую твой код все равно все виснит и ничего не делает #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Green double ExtBuffer0[]; int init() {IndicatorBuffers(1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtBuffer0); return(0);} extern double A=1; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int i; for(i=0;iA) { while(rsi>A) { ExtBuffer0[0]=ExtBuffer0[0]-Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]);} else if (rsiA) { while(rsiA) { ExtBuffer0[0]=ExtBuffer0[0]+Point; rsi=iRSIOnArray(ExtBuffer0,0,3,0); } return(ExtBuffer0[0]); } else return(ExtBuffer0[0]);}

Похоже вы друг друга не понимаете. Например я тоже не понимаю такой формулировки "Например, индикатор RSI(7) равен 52,1761 при цене1, 2041 нужно найти ЦЕНУ при которой он будет равен 37. 3518 НО НА ЭТОМ ЖЕ БАРЕ!!!". В данном случае речь может идти тольк о нулевом баре. Искать нечего. Пока он не сформировался значения могут ( и будут) меняться. Но эти изменения находятсяво вполен определнных пределах. Может оказаться, что требуемое условие не выполнится никогда в обозримом будущем. Может нужно сменить вопрос, тогда сменится и ответ.

В общем да, на нулевом баре мне, например, нужно найти при какой цене RSI будет равен 50 если он выше него или ниже. Даже если он не сформировался то все перебором цен можно это вычислить.
 

держи рабочий код:

//+------------------------------------------------------------------+
//|                                                    price4rsi.mq4 |
//|                                     Copyright © 2007, Nick Bilak |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Nick Bilak"
#property link      "http://www.mql4.info/"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 OrangeRed
extern int period=20;
//---- buffers
double b1[],b2[];
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,b1);
   return(0);
}
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()  {
   //ArrayCopySeries(b2,MODE_CLOSE,NULL,0);
   ArrayResize(b2,period*2);
   ArraySetAsSeries(b2,true);
   for (int i=0; i<period*2; i++) b2[i]=Close[i];
   Comment("\n price for RSI("+period+")=50 - ",findRSIprice(50,period));
}
//+------------------------------------------------------------------+
 
double findRSIprice(double rsiLevel, int rsiPeriod)  {
   if (rsiLevel<0 || rsiLevel>100) return(-1);   
   int i,dir;  double rsi;   
   rsi=iRSIOnArray(b2,rsiPeriod,rsiPeriod,0); 
   Print("init. rsi=",rsi);  
   Print("init. b2[0]=",b2[0]);  
   if (rsi>rsiLevel) {
       while (rsi>rsiLevel) {
         b2[0]=b2[0]-1*Point;           
         rsi=iRSIOnArray(b2,0,rsiPeriod,0);       
         Print("rsi=",rsi);  
         Print("b2[0]=",b2[0]);  
         i++;
         if (i>500) break; //защита от зависания
       }       
       return(b2[0]);   
   } else if (rsi<rsiLevel) {      
      while (rsi<rsiLevel) {           
         b2[0]=b2[0]+1*Point;           
         rsi=iRSIOnArray(b2,0,rsiPeriod,0);       
         Print("rsi=",rsi);  
         Print("b2[0]=",b2[0]);  
         i++;
         if (i>500) break;  //защита от зависания
      }       
      return(b2[0]);   
   } else return(b2[0]);
}
 
nickbilak:

держи рабочий код:

Всегда от идеи до реализации большая пропасть, особенно если реализация пока прихрамывает.

Хоть я и не просил, но огромное спасибо.

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