1 registered members (AndrewAMD),
1,248
guests, and 6
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 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
|
|
|
|