1 registered members (henrybane),
1,246
guests, and 8
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: LowPass filter formula
[Re: sabgto]
#409423
10/16/12 22:45
10/16/12 22:45
|
Joined: Feb 2012
Posts: 37
stevegee58
Newbie
|
Newbie
Joined: Feb 2012
Posts: 37
|
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
gfx
Newbie
|
Newbie
Joined: Oct 2012
Posts: 13
CO
|
I understand just enough about digital filters to be dangerous ![laugh laugh](/ubb7/images/graemlins/default_dark/laugh.gif) 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: sabgto]
#409598
10/19/12 17:34
10/19/12 17:34
|
Joined: Oct 2012
Posts: 10 Mexico
sabgto
OP
Newbie
|
OP
Newbie
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: jcl]
#410540
11/05/12 04:39
11/05/12 04:39
|
Joined: Nov 2012
Posts: 19 Texas, US
deweymcg
Newbie
|
Newbie
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):
//---- 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
|
|
|
|