Gamestudio Links
Zorro Links
Newest Posts
Trading Journey
by howardR. 04/28/24 09:55
basik85278
by basik85278. 04/28/24 08:56
Zorro Trader GPT
by TipmyPip. 04/27/24 13:50
Help with plotting multiple ZigZag
by M_D. 04/26/24 20:03
Data from CSV not parsed correctly
by jcl. 04/26/24 11:18
M1 Oversampling
by jcl. 04/26/24 11:12
Why Zorro supports up to 72 cores?
by jcl. 04/26/24 11:09
Eigenwerbung
by jcl. 04/26/24 11:08
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (AndrewAMD, Quad), 755 guests, and 5 spiders.
Key: Admin, Global Mod, Mod
Newest Members
wandaluciaia, Mega_Rod, EternallyCurious, howardR, 11honza11
19049 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
LowPass filter formula #409411
10/16/12 18:22
10/16/12 18:22
Joined: Oct 2012
Posts: 10
Mexico
S
sabgto Offline OP
Newbie
sabgto  Offline OP
Newbie
S

Joined: Oct 2012
Posts: 10
Mexico
In the help manual I read that LowPass filter is better than EMA and it seems to be that it is true.
What is the LowPass() formula ?. Can I see the source code of this function ?. I've been searching with google and only found eletronics related topics.

Re: LowPass filter formula [Re: sabgto] #409423
10/16/12 22:45
10/16/12 22:45
Joined: Feb 2012
Posts: 37
S
stevegee58 Offline
Newbie
stevegee58  Offline
Newbie
S

Joined: Feb 2012
Posts: 37
Code:
var smoothF(int period) { return 2./(period+1); }

var LowPass(var *Data,int Period)
{
	var* LP = series(*Data,3);
	var a = smoothF(Period);
	var a2 = a*a;
	return LP[0] = (a-0.25*a2)*Data[0]
		+ 0.5*a2*Data[1]
		- (a-0.75*a2)*Data[2]
		+ 2*(1.-a)*LP[1]
		- (1.-a)*(1.-a)*LP[2];
}


Re: LowPass filter formula [Re: stevegee58] #409425
10/17/12 03:47
10/17/12 03:47
Joined: Oct 2012
Posts: 13
CO
G
gfx Offline
Newbie
gfx  Offline
Newbie
G

Joined: Oct 2012
Posts: 13
CO
I understand just enough about digital filters to be dangerous laugh but not enough to understand the derivation. But no worries, don't need to know the derivation to use it.

What's smoothF(), Steve?

Re: LowPass filter formula [Re: gfx] #409430
10/17/12 09:09
10/17/12 09:09
Joined: Jan 2012
Posts: 39
B
BySharDe Offline
Newbie
BySharDe  Offline
Newbie
B

Joined: Jan 2012
Posts: 39
LowPass, is it the well-known concept in Image Processing?
BTW, what is EMA?

Re: LowPass filter formula [Re: BySharDe] #409441
10/17/12 16:49
10/17/12 16:49
Joined: Oct 2012
Posts: 10
Mexico
S
sabgto Offline OP
Newbie
sabgto  Offline OP
Newbie
S

Joined: Oct 2012
Posts: 10
Mexico
Thanks stevegee58.
EMA = Exponential Moving Average

Re: LowPass filter formula [Re: sabgto] #409518
10/18/12 16:23
10/18/12 16:23
Joined: Oct 2012
Posts: 10
Mexico
S
sabgto Offline OP
Newbie
sabgto  Offline OP
Newbie
S

Joined: Oct 2012
Posts: 10
Mexico
I'd like to write this function (LowPass) in Mql4 in order to plot on MT4 but I found that I don't understand the "series" function.

var smoothF(int period) { return 2./(period+1); }

var LowPass(var *Data,int Period)
{
var* LP = series(*Data,3);
var a = smoothF(Period);
var a2 = a*a;
return LP[0] = (a-0.25*a2)*Data[0]
+ 0.5*a2*Data[1]
- (a-0.75*a2)*Data[2]
+ 2*(1.-a)*LP[1]
- (1.-a)*(1.-a)*LP[2];
}

What does exactly do this line ?
var* LP = series(*Data,3);
LP is a 3 element array filled with "what" of "*Data" ?
I thought that was filled with the first 3 elements of "*Data" but it seems to be that it's not true.

Could someone help me with this ?
Thanks.

Re: LowPass filter formula [Re: sabgto] #409548
10/19/12 07:29
10/19/12 07:29
Joined: Jul 2000
Posts: 27,986
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 27,986
Frankfurt
A series is a special version of an array, used in commercial trade platforms. It's first element is filled with *Data and the array is shifted by 1 on every bar.

http://zorro-trader.com/manual/en/series.htm

Re: LowPass filter formula [Re: sabgto] #409598
10/19/12 17:34
10/19/12 17:34
Joined: Oct 2012
Posts: 10
Mexico
S
sabgto Offline OP
Newbie
sabgto  Offline OP
Newbie
S

Joined: Oct 2012
Posts: 10
Mexico
With the following code:
***********************************************************
var smoothF(int period) { return 2./(period+1); }

var LowPassX(var *Data,int Period)
{
char txt[80];
var* LP = series(*Data,3);
// just to get the "Data" and "LP" values in a file
sprintf(txt, "%.5f, %.5f, %.5f, %.5f, %.5f, %.5f, %.5f%c%c",
Data[0], Data[1], Data[2], Data[3], LP[0], LP[1], LP[2], 0x0D, 0x0A);
file_append("c:/t/output.txt", txt);

var a = smoothF(Period);
var a2 = a*a;

return LP[0] = (a-0.25*a2)*Data[0]
+ 0.5*a2*Data[1]
- (a-0.75*a2)*Data[2]
+ 2*(1.-a)*LP[1]
- (1.-a)*(1.-a)*LP[2];
}

function run(){

BarPeriod = 1440;
StartDate = 20120301;
NumDays = 10;
var Period;

var* pH = series(priceHigh());
Period = 5;
var LP0 = LowPassX(pH,3*Period);

plot("LP0", LP0, 0, BLUE);

}
***********************************************************
I got this data (only de first 10 records are shown):

Data[0] is the price from today, data[1] the price from yesterday, data[2] the price from day before yesterday, etc. “LP” is taken from “data”.
var* LP = series(*Data,3);
LP[0] = Data[0], LP[2] comes from the previous value of LP[1] but the question is respect LP[1], where does the value of LP[1] come from ?. The value 1.33375, resalted in the image, where was it taken from ?

What I’m trying to do is to replace “series(*Data,3)” with another kind of code.

Thanks a lot for your help and your patience.

P.D. I don't know how to put my code in a "code box", sorry.

Re: LowPass filter formula [Re: sabgto] #409627
10/20/12 07:01
10/20/12 07:01
Joined: Jul 2000
Posts: 27,986
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 27,986
Frankfurt
Look at your code: you're first printing the value and then calculate it. That's why your LP[1] is in fact LP[0].

Re: LowPass filter formula [Re: jcl] #410540
11/05/12 04:39
11/05/12 04:39
Joined: Nov 2012
Posts: 19
Texas, US
D
deweymcg Offline
Newbie
deweymcg  Offline
Newbie
D

Joined: Nov 2012
Posts: 19
Texas, US
I have been trying to find an equivalent indicator for use with metatrader but no luck so far. The one I found has the following (which seems different):

Code:
//---- indicator settings
#property indicator_chart_window 
#property indicator_buffers 3 
#property indicator_color1 Yellow 
#property indicator_color2 LightBlue 
#property indicator_color3 Tomato 
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2 
//---- indicator parameters
extern int     Price          = 0;  //Price mode : 0-Close,1-Open,2-High,3-Low,4-Median,5-Typical,6-Weighted
extern int     Order          = 3;  //Filter Order: 1-EMA,2-2nd Order,3-3rd Order
extern int     FilterPeriod   =14;  //Filter Period 
extern int     PreSmooth      = 1;  //Pre-smoothing period
extern int     PreSmoothMode  = 0;  //Pre-smoothing MA Mode: 0-SMA,1-EMA,2-SMMA,3-LWMA
extern double  PctFilter      = 0;  //Dynamic filter in decimal(multiplier for StdDev)
extern int     ColorMode      = 0;  //Color Mode: 0-off,1-on
extern int     ColorBarBack   = 1;  //Should be 0 or 1 
extern int     AlertMode      = 0;  //Sound Alert switch (0-off,1-on) 
extern int     WarningMode    = 0;  //Sound Warning switch(0-off,1-on) 
//---- indicator buffers
double     Filter[];
double     UpTrend[];
double     DnTrend[];
double     Smoother[];
double     trend[];
double     Del[];
double     AvgDel[];

int        draw_begin;
bool       UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- indicator buffers mapping
   IndicatorBuffers(7);
   SetIndexBuffer(0,Filter);
   SetIndexBuffer(1,UpTrend);
   SetIndexBuffer(2,DnTrend);
   SetIndexBuffer(3,Smoother);
   SetIndexBuffer(4,trend);  
   SetIndexBuffer(5,Del);
   SetIndexBuffer(6,AvgDel);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   draw_begin = FilterPeriod + PreSmooth;
   SetIndexDrawBegin(0,draw_begin);
   SetIndexDrawBegin(1,draw_begin);
   SetIndexDrawBegin(2,draw_begin);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("LowPassFilter("+Order+","+FilterPeriod+")");
   SetIndexLabel(0,"LowPassFilter");
   SetIndexLabel(1,"UpTrend");
   SetIndexLabel(2,"DnTrend");
//---- initialization done
   return(0);
}
//+------------------------------------------------------------------+
//| LowPassFilter_v1                                                 |
//+------------------------------------------------------------------+
int start()
{
   int limit, i, shift;
   int counted_bars=IndicatorCounted();
   double a, b, c, pi = 3.1415926535;
   
   if(counted_bars<1)
   for(i=1;i<=draw_begin;i++) 
   {
   Filter[Bars-i]=0; 
   UpTrend[Bars-i]=0; 
   DnTrend[Bars-i]=0;
   }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(shift=limit; shift>=0; shift--)
   Smoother[shift] = iMA(NULL,0,PreSmooth,0,PreSmoothMode,Price,shift);
   
   for(shift=limit; shift>=0; shift--)
   {
      if(Order == 1) Filter[shift] = iMAOnArray(Smoother,0,FilterPeriod,0,1,shift);
      else
		if(Order == 2) 
		{
		a = MathExp(-MathSqrt(2)*pi/FilterPeriod);
		b = 2*a*MathCos(MathSqrt(2)*pi/FilterPeriod);
    	Filter[shift] = b*Filter[shift+1] - a*a*Filter[shift+2] + (1 - b + a*a)*Smoother[shift];
		}
		else
		if(Order == 3) 
		{
		a = MathExp(-pi/FilterPeriod);
		b = 2*a*MathCos(MathSqrt(3)*pi/FilterPeriod);
    	c = MathExp(-2*pi/FilterPeriod); //a * a;
    	Filter[shift] = (b+c)*Filter[shift+1] - (c+b*c)*Filter[shift+2] + c*c*Filter[shift+3] + (1-b+c)*(1-c)*Smoother[shift];
		}
  
   int Length = FilterPeriod;
      
      if (PctFilter>0)
      {
      Del[shift] = MathAbs(Filter[shift] - Filter[shift+1]);
   
      double sumdel=0;
      for (int j=0;j<=Length-1;j++) sumdel = sumdel+Del[shift+j];
      AvgDel[shift] = sumdel/Length;
    
      double sumpow = 0;
      for (j=0;j<=Length-1;j++) sumpow+=MathPow(Del[j+shift]-AvgDel[j+shift],2);
      double StdDev = MathSqrt(sumpow/Length); 
     
      double filter = PctFilter * StdDev;
     
      if(MathAbs(Filter[shift]-Filter[shift+1]) < filter ) Filter[shift]=Filter[shift+1];
      }
      else
      filter=0;
   
      
      if (ColorMode>0)
      {
         trend[shift] = trend[shift+1];
         if (Filter[shift] - Filter[shift+1] > filter) trend[shift] = 1;
         if (Filter[shift+1] - Filter[shift] > filter) trend[shift] =-1;
    
         if (trend[shift]>0)
         {
            UpTrend[shift] = Filter[shift]; 
            if (trend[shift+ColorBarBack]<0) UpTrend[shift+ColorBarBack]=Filter[shift+ColorBarBack];
            DnTrend[i] = EMPTY_VALUE;
            if (WarningMode>0 && trend[shift+1]<0 && shift==0) PlaySound("alert2.wav");
         }
         else              
         if (trend[shift]<0)
         { 
            DnTrend[shift] = Filter[shift]; 
            if (trend[shift+ColorBarBack]>0) DnTrend[shift+ColorBarBack]=Filter[shift+ColorBarBack];
            UpTrend[shift] = EMPTY_VALUE;
            if (WarningMode>0 && trend[shift+1]>0 && shift==0) PlaySound("alert2.wav");
         }               
      }
   }         
//----------   
   string Message;
   
   if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
	{
	Message = " "+Symbol()+" M"+Period()+": HMA Signal for BUY";
	if ( AlertMode>0 ) Alert (Message); 
	UpTrendAlert=true; DownTrendAlert=false;
	} 
	 	  
	if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
	{
	Message = " "+Symbol()+" M"+Period()+": HMA Signal for SELL";
	if ( AlertMode>0 ) Alert (Message); 
	DownTrendAlert=true; UpTrendAlert=false;
	} 	         
//---- done
   return(0);
}


Last edited by JustSid; 11/05/12 04:41. Reason: Added code tags
Page 1 of 2 1 2

Moderated by  Petra 

Powered by UBB.threads™ PHP Forum Software 7.7.1