Download MetaTrader 5

How to compute WPR value of an indicator buffer?

To add comments, please log in or register
Move from theory to practice. Code Base will help you!
Saji
162
Saji 2013.12.22 11:27 

Hi, all:

I want to calculate the WPR value of a detrended price series.

First, I use an indicator buffer to store the detrended price series. But to simplify the question, I directly transfer the raw prices to the buffer.

Export the so called "detrended price series" into the chart, we can see it's exactly the same as the raw prices.(see below)

checking the "detrended value buffer"

Now, the question is how can I use an effective way to calculate the WPR value of the detrended price series.

Because there is no "OnArray" function to use, I guess the only way is to write "for" code to directly calculate the value.

Below is the code I use:

//---- Oscillator of Detrended Signal Computing

   for(i=0; i<limit; i++)
   {
      DtdValueMin[i] = 999999;
      DtdValueMax[i] = -999999;
      for(int k=0; k<=Osc_Period; k++)
      {
         if(DtdValue[k] > DtdValueMax[i])
            DtdValueMax[i] = DtdValue[k];
         if(DtdValue[k] < DtdValueMin[i])
            DtdValueMin[i] = DtdValue[k];
      }
      DtdOsc[i] = 0.02*((DtdValue[i]-DtdValueMin[i])/(DtdValueMax[i]-DtdValueMin[i])*100-50);
      if(DtdOsc[i]>0.9999)
         DtdOsc[i]=0.9999;
      if(DtdOsc[i]<-0.9999)
         DtdOsc[i]=-0.9999;
   }
   return(0);
}

You can see that there is a "for" circle in another "for" circle, which is not a fast algorithm I think.

And the result is odd.......

Theoretically, the calculated result should be exactly the same as iWPR in the MT4.

But the result is not the same, so there must be errors.

And I can't find it, so if anyone had think about this question before, pls HELP!

saji

Saji
162
Saji 2013.12.22 11:31  

Below is the wrong result I got:

wrong results

the first indicator is the value I got, the second indicator is the iWPR value calculate by MT4 function.

Regards.

Simon Gniadkowski
Moderator
17999
Simon Gniadkowski 2013.12.22 11:37  
saji:

Hi, all:

I want to calculate the WPR value of a detrended price series.

First, I use an indicator buffer to store the detrended price series. But to simplify the question, I directly transfer the raw prices to the buffer.

Export the so called "detrended price series" into the chart, we can see it's exactly the same as the raw prices.(see below)


You need to show your code . . . where does the value for DtdValue[] come from ?
Saji
162
Saji 2013.12.22 12:14  
RaptorUK:
You need to show your code . . . where does the value for DtdValue[] come from ?


the code:

int start()
{
//----
   int limit,i;
   int counted_bars=IndicatorCounted();

//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- Detrended Signal Computing
   switch(LM_Mode)
   {
      case 0:     //-------Basic Signal (No Local Mean)
         for(i=0; i<limit; i++)
         {
            LM[i]=0;
            DtdValue[i]=Close[i] - LM[i];
         }
         break;
   }

"LM_Mode" is the variable I use to choose the algorithm of Local Mean computing, as I said before here i used 0 value which stand for no local mean.

thank you for the attention

Saji
162
Saji 2013.12.22 12:27  

the rest of it

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

//----
extern int LM_Mode = 0;
extern int Smooth_Period = 14;
extern int Osc_Period = 18;
extern int Shift_Period = 11;

//---- buffers
double LM[];
double DtdValue[];
double DtdOsc[];
double DtdValueMin[];
double DtdValueMax[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(5);
//---- indicator line
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, DtdOsc);
   SetIndexBuffer(1, DtdValue);
   SetIndexBuffer(2, LM);
   SetIndexBuffer(3, DtdValueMax);
   SetIndexBuffer(4, DtdValueMin);
//----
   SetIndexDrawBegin(0, Smooth_Period+Shift_Period);
//----
   return(0);
  }
Simon Gniadkowski
Moderator
17999
Simon Gniadkowski 2013.12.22 14:23  
saji:

Hi, all:

I want to calculate the WPR value of a detrended price series.

First, I use an indicator buffer to store the detrended price series. But to simplify the question, I directly transfer the raw prices to the buffer.

Export the so called "detrended price series" into the chart, we can see it's exactly the same as the raw prices.(see below)

Shouldn't this . . .

DtdOsc[i] = 0.02*((DtdValue[i]-DtdValueMin[i])/(DtdValueMax[i]-DtdValueMin[i])*100-50);

. . . be this . . .

DtdOsc[i] = 0.02*( (   DtdValueMax[i]   - DtdValueMin[i] ) / ( DtdValueMax[i] - DtdValueMin[i] ) * 100 - 50);

. . ?

From here: http://www.metatrader5.com/en/terminal/help/indicators/oscillators/wpr

%R = (HIGH(i-n)-CLOSE)/(HIGH(i-n)-LOW(i-n))*100
Carl Schreiber
6588
Carl Schreiber 2013.12.22 15:21  
RaptorUK:

Shouldn't this . . .

. . . be this . . .

. . ?

From here: http://www.metatrader5.com/en/terminal/help/indicators/oscillators/wpr


Please check as this will be always 1.0:

  DtdValueMax[i]   - DtdValueMin[i] ) / ( DtdValueMax[i] - DtdValueMin[i] )

may be you meant

  DtdValueMax[i]   - DtdValue[i] ) / ( DtdValueMax[i] - DtdValueMin[i] )

?

Gooly

Simon Gniadkowski
Moderator
17999
Simon Gniadkowski 2013.12.22 15:31  
gooly:

Please check as this will be always 1.0:

may be you meant

?

Ah yes, well spotted
Saji
162
Saji 2013.12.23 01:11  
RaptorUK:

Shouldn't this . . .

. . . be this . . .

. . ?

From here: http://www.metatrader5.com/en/terminal/help/indicators/oscillators/wpr

I really doubt about it. I think no matter it is (high-price)or(price-low),the result should be within [-1,1]. and from the chart you can see the results are always beyond the field. so i think there is other reason. Cause I haven't got a PC on hand, so I can't check what you said right now. but i will check as soon as possible, pls keep in touch! And thank you for the help again.
Saji
162
Saji 2013.12.23 04:26  
RaptorUK:
Ah yes, well spotted

Hi,RaptorUK:

the exact WPR formula is : -1*(DtdValueMax[i] - DtdValue[i] ) / ( DtdValueMax[i] - DtdValueMin[i] )

so I use the code below:

DtdOsc[i] = 0.02*(-1*(DtdValueMax[i]-DtdValue[i])/(DtdValueMax[i]-DtdValueMin[i])*100-50);
Saji
162
Saji 2013.12.23 04:28  

the reslut in the chart: the first signal

you can see that there are a lot of values out of the [-1,1] field.

123
To add comments, please log in or register