// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//| Digital Low Pass (FATL/SATL, KGLP) Filter |
//| Copyright (c) Sergey Iljukhin, Novosibirsk. |
//| email sergey[at]tibet.ru http://fx.qrz.ru/ |
//| Óêðàøàòåëüñòâî faa1947: |
//| äîáàâëåíû ïîëîñû Áîëëèíäæåðà |
//| ðàñêðàñêà |
//| ñãëàæèâàíèå |
//| Âåðñèÿ îò 24.02.2010 |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
#property copyright "Copyright (c) 2005, Sergey Iljukhin, Novosibirsk"
#property link "http://fx.qrz.ru/"
// ---------------- Èìïîðòèðóåìûå áèáëèîòåêè ----------------------------------
#import "DF.dll"
int DigitalFilter(int FType,
int P1,
int D1,
int A1,
int P2,
int D2,
int A2,
double Ripple,
int Delay,
double &arr[]);
#import
// -------------- Èíäèêàòîð â îñíîâíîì îêíå ----------------------------------
#property indicator_chart_window
// ---------------- Êîë-âî âèäèìûõ áóôåðîâ èíäèêàòîðà -------------------------
#property indicator_buffers 4
// ---------------- Óñòàíîâêà öâåòà èíäèêàòîðà --------------------------------
#property indicator_color1 Gold
#property indicator_color2 Red
#property indicator_color3 LightSeaGreen
#property indicator_color4 LightSeaGreen
// ---------------- Óñòàíîâêà øèðèíû ëèíèè -----------------------------------
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1
//----------------- Âíåøíèå íàñòðîéêè èíäèêàòîðà ==========--------------------
extern double BandsDeviations = 0.7; // Âåëè÷èíà ñòàíäàðòíîãî îòêëîíåíèÿ
extern int BadsPeriod = 14; // Ïåðèîä äëÿ ðàñ÷åòà êàíàëà Áîëëèíäæåðà
int BandsShift = 0; // Ñäâèã îòíîñèòåëüíî ãðàôèêà
// ------------------- Âíåøíèå íàñòðîéêè ôèëüòðà ------------------------------
int FType=0;
// Òèï ôèëüòðà:
// 0 - ÔÍ× (FATL/SATL/KGLP),
// 1 - ÔÂ× (KGHP),
// 2 - ïîëîñîâîé (RBCI/KGBP),
// 3 - ðåæåêòîðíûé (KGBS)
extern int P1 = 40; // Ïåðèîä îòñå÷êè
extern int D1 = 31; // Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà, áàð
extern int A1 = 50; // Çàòóõàíèå â ïîëîñå çàäåðæêè , äá
int P2 = 0; // Ïåðèîä îòñå÷êè, áàð
int D2 = 0; // Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà ,áàð
int A2 = 0; // Çàòóõàíèå â ïîëîñå çàäåðæêè, äá
double Ripple=0.0864; // Áèåíèÿ â ïîëîñå ïðîïóñêàíèÿ, äá
extern int Delay = 0; // Çàäåðæêà â áàðàõ
int BarShift = 0; // Ñäâèã ãðàôèêà, áàð. Ìèíóñ - íàçàä, ïëþñ - âïåðåä
extern int Deviation = 0; // Ñãëàæèâàåò ãðàôèê - ôëýò â èíäèêàòîðå
string _pr = "Öåíà 0-cl,1-op,2-hi,3-lo,4-med,5-typ,6-wtd";
extern int _price = 0;
// --------------- Ïðèâÿçêà áóôåðîâ -------------------------------------------
double FilterBuffer[];
double long1[];
double short1[];
double UpperBuffer[];
double LowerBuffer[];
double trend[];
// --------------- Ðàáî÷èå ïåðåìåííûå -----------------------------------------
int FilterOrder;
double F[1000];
int tf;
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//| Digital filter indicator initialization function |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
int init()
{
// ------------------------ Âû÷èñëÿåì íàáîð êîýôôèöèåíòîâ öèôðîâîãî ôèëüòðà ---
FilterOrder=DigitalFilter(FType,
P1,
D1,
A1,
P2,
D2,
A2,
Ripple,
Delay,
F);
// --------------- Êîë-âî áóôåðîâ èíäèêàòîðà ----------------------------------
IndicatorBuffers(6);
//---------- Óñòàíîâêà ïàðàìåòðîâ ðèñîâàíèÿ -----------------------------------
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
SetIndexDrawBegin(0,FilterOrder);
SetIndexDrawBegin(1,FilterOrder);
SetIndexStyle(2,DRAW_LINE);
SetIndexDrawBegin(2,FilterOrder);
SetIndexStyle(3,DRAW_LINE);
SetIndexDrawBegin(3,FilterOrder+1);
// ----------------- Ïðèâÿçêà íîìåðà èíäèêàòîðà ê èìåíè -----------------------
SetIndexBuffer (0, long1); // Âèäèìûé áóôåð
SetIndexBuffer (1, short1); // Âèäèìûé áóôåð
SetIndexBuffer (2, UpperBuffer); // Âèäèìûé áóôåð
SetIndexBuffer (3, LowerBuffer); // Âèäèìûé áóôåð
SetIndexBuffer (4, FilterBuffer); // Ðàñ÷åòíûé áóôåð
SetIndexBuffer (5, trend); // Ðàñ÷åòíûé áóôåð
SetIndexEmptyValue (0, 0.0);
SetIndexEmptyValue (1, 0.0);
SetIndexEmptyValue (2, 0.0);
SetIndexEmptyValue (3, 0.0);
IndicatorShortName("FilterBands");
//------------------ Ìåòêà äëÿ ëèíèè èíäèêàòîðà ---------------------
SetIndexLabel(0,"SATL-long");
SetIndexLabel(1,"SATL_short");
SetIndexLabel(2,"long");
SetIndexLabel(3,"short");
//----
tf=Period();
return(0);
}
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
//| Digital filter main function |
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
int start()
{
static int prevTF=0;
int i,j,k;
double res = 0;
double deviation;
double sum,
oldval,
newres;
//----
if(Bars<=FilterOrder) return(0);
//----
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
int limit = Bars - counted_bars;
if(counted_bars==0) limit-=1+FilterOrder+1;
// --- Æäàòü òàéìôðåéì ãðàôèêà - ïðèíöèïèàëüíî óñêîðÿåò ðàáîòó èíäèêàòîðà -----
i=limit;
if(iTime(NULL,tf,1)!=prevTF)
{
prevTF=iTime(NULL,tf,1);
while(i>=0)
{
res=0;
for(j=0; j<FilterOrder; j++)
res+=F[j] *price(i+j);
// ---------------- Ñãëàæèâàíèå, íî ëó÷øå Deviation ---------------------------
// FilterBuffer[i] = (1.5 * response +
// 1.0 * FilterBuffer[i+1] +
// 0.5 * FilterBuffer[i+2]) / 3;
// --------------------- êîíåö ñãëàæèâàíèÿ ------------------------------------
FilterBuffer[i]=NormalizeDouble(res,Digits);
if(MathAbs(FilterBuffer[i]-FilterBuffer[i+1])<
Deviation *Point)
FilterBuffer[i]=FilterBuffer[i+1];
/*
// ------------------- Ðàñêðàñêà ----------------------------------------------
if(FilterBuffer[i] <= FilterBuffer[i+1])
{
long[i] = 0.0;
short[i] = response;
}
else
{
long[i] = response;
short[i] = 0.0;
}
-------------------- Êîíåö ðàñêðàñêè ---------------------------------------*/
sum = 0.0;
k = i + BadsPeriod - 1;
oldval = FilterBuffer[i];
while(k>=i)
{
newres=price(k)-oldval;
sum+=newres *newres;
k--;
}
deviation = BandsDeviations * MathSqrt(sum / BadsPeriod);
UpperBuffer[i] = oldval + deviation;
LowerBuffer[i] = oldval - deviation;
i--;
}
// <-- ðàñêðàøèâàåì
for(int x=limit; x>=0; x--)
{
trend[x]=trend[x+1];
if(FilterBuffer[x]>FilterBuffer[x+1])
trend[x]=1;
if(FilterBuffer[x]<FilterBuffer[x+1])
trend[x]=-1;
if(trend[x]>0)
{
long1[x]=FilterBuffer[x];
if(trend[x+1]<0)
long1[x+1] = FilterBuffer[x+1];
short1[x] = 0.0;
}
else
if(trend[x]<0)
{
short1[x]=FilterBuffer[x];
if(trend[x+1]>0)
short1[x+1] = FilterBuffer[x+1];
long1[x] = 0.0;
}
}
// ðàñêðàøèâàåì -->
//-------------------------------------------------------------------------
}
return(0);
}
// ------------- Ôóíêöèÿ ïîëó÷åíèÿ öåíû ïî åå òèïó ----------------------------
double price(int i=0)
{
double rrr;
if(_price==0)
return(iClose(Symbol(),tf,i));
if(_price==1)
return(iOpen(Symbol(),tf,i));
if(_price==2)
return(iHigh(Symbol(),tf,i));
if(_price==3)
return(iLow(Symbol(),tf,i));
if(_price==4)
{
rrr=(iLow(Symbol(),tf,i)+
iHigh(Symbol(),tf,i))/2;
return(rrr);
}
if(_price==5)
{
rrr=(iLow(Symbol(),tf,i)+
iClose(Symbol(),tf,i)+
iHigh(Symbol(),tf,i))/3; // Òèïè÷íàÿ
return(rrr);
}
if(_price==6)
{
rrr=(iLow(Symbol(),tf,i)+
iClose(Symbol(),tf,i)+
iClose(Symbol(),tf,i)+
iHigh(Symbol(),tf,i))/4; // Âçâåøåííàÿ
return(rrr);
}
return(iClose(Symbol(),tf,i));
}
// ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ
/*
Öèôðîâûå ôèëüòðû äëÿ MetaTrader 4.
Âíèìàíèå! Äëÿ ðàáîòû òðåáóåòñÿ òðè äîïîëíèòåëüíûõ DLL
ñîäåðæàùèõ áëîê ìàòåìàòè÷åñêîé îáðàáîòêè - bdsp.dll, lapack.dll, mkl_sport.dll,
êîòîðûå äîëæíû áûòü óñòàíîâëåíû â C:\Windows\System32\
èëè ðÿäîì ñ DF.dll â \experts\libraries\
Ïåðåä èñïîëüçîâàíèåì óáåäèòåñü:
1. ÷òî óñòàíîâëåíû ïóíêòû "Allow DLL import" è "Confirm DLL function's call" â íàñòðîéêàõ Options->Expert Advisors
2. ×òî â äèðåêòîðèè C:\Windows\System32\ èìåþòñÿ Bdsp.dll, lapack.dll, mkl_support.dll - âñïîìîãàòåëüíûå ìàòåìàòè÷åñêèå áèáëèîòåêè.
Îïèñàíèå âõîäíûõ ïàðàìåòðîâ:
Ftype - Òèï ôèëüòðà: 0 - ÔÍ× (FATL/SATL/KGLP), 1 - ÔÂ× (KGHP),
2 - ïîëîñîâîé (RBCI/KGBP), 3 - ðåæåêòîðíûé (KGBS)
P1 - Ïåðèîä îòñå÷êè P1, áàð
D1 - Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà D1, áàð
A1 - Çàòóõàíèå â ïîëîñå çàäåðæêè À1, äÁ
P2 - Ïåðèîä îòñå÷êè P2, áàð
D2 - Ïåðèîä îòñå÷êè ïåðåõîäíîãî ïðîöåññà D2, áàð
A2 - Çàòóõàíèå â ïîëîñå çàäåðæêè À2, äÁ
Ripple - Áèåíèÿ â ïîëîñå ïðîïóñêàíèÿ, äÁ
Delay - Çàäåðæêà, áàð
Äëÿ ÔÍ× è ÔÂ× çíà÷åíèÿ ïàðàìåòðîé P2,D2,A2 èãíîðèðóþòñÿ
Óñëîâèÿ ðàáîòû:
ÔÍ×: P1>D1
ÔÂ×: P1<D1
Ïîëîñîâîé è ðåæåêòîðíûé: D2>P2>P1>D1
*/
//+------------------------------------------------------------------+
Comments