//+-----------------------------------------------------------------------------+ //| Gaus_MA.mq4 | //| Gregory A. Kakhiani | //| gkakhiani@gmail.com | //+-----------------------------------------------------------------------------+ //Усреднение (Сглаживание кривой цен) цен при помощи модифицированного алгоритма| //линейно-взвешенного скользящего среднего где коэффициенты сглаживания | //расчитываются при помощи радиально-базисной функци (функция гауса) | //+-----------------------------------------------------------------------------+ #property copyright "Gregory A. Kakhiani" #property link "gkakhiani@gmail.com" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- input parameters extern int period=10; //Период усреднения extern double N=2; //Степень экспоненты extern double A=-0.001; //Коэфициент степени е extern bool Vol=false; //Умножить на объем extern int applied_price=0;//Используемая ценовая константа - используются стандартные ценовые константы extern int ma_shift=0; //Сдвиг индикатора относительно ценового графика extern int koef_shift=0; //Сдвиг индекса масива коеффициентов //---- buffers double GaussAverage[]; //Глобальные переменные int MaxBars=10000; //Количество анализируемых баров double Coefs[50]; //Массив для хранения коэффициентов //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,GaussAverage); SetIndexLabel(0,"GaussAverage"); if(applied_price>6) applied_price=0; //оформляем индикатор string applied_priceText=""; switch(applied_price) { case PRICE_CLOSE:// 0 Цена закрытия {applied_priceText="Close";}break; case PRICE_OPEN://1 Цена открытия {applied_priceText="Open";}break; case PRICE_HIGH://2 Максимальная цена {applied_priceText="High";}break; case PRICE_LOW://3 Минимальная цена {applied_priceText="Low";}break; case PRICE_MEDIAN://4 Средняя цена, (high+low)/2 {applied_priceText="Median price";}break; case PRICE_TYPICAL://5 Типичная цена, (high+low+close)/3 {applied_priceText="Typical price";}break; case PRICE_WEIGHTED:// 6 Взвешенная цена закрытия, (high+low+close+close)/4 {applied_priceText="Weighted price";}break; } IndicatorShortName("GaussAverage("+A+","+N+","+period+","+applied_priceText+",koef_shift="+koef_shift+", Shift="+ma_shift+")"); //Заполнение массива коэфициентов CalcCoefs(A,N,period); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { 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+period; //Собственно сглаживание for(int i=limit;i>=0;i--) { GaussAverage[i+ma_shift]=GetGausAverage(period,applied_price,Vol,koef_shift,i); } //---- return(0); } //+------------------------------------------------------------------+ //Возвращает цену в зависимости от PriceType со сдвигом Index | //+------------------------------------------------------------------+ double GetPrice(int Index,int PriceType) { switch(PriceType) { case PRICE_CLOSE:// 0 Цена закрытия {return(Close[Index]);} case PRICE_OPEN://1 Цена открытия {return(Open[Index]);} case PRICE_HIGH://2 Максимальная цена {return(High[Index]);} case PRICE_LOW://3 Минимальная цена {return(Low[Index]);} case PRICE_MEDIAN://4 Средняя цена, (high+low)/2 {return((High[Index]+Low[Index])/2);} case PRICE_TYPICAL://5 Типичная цена, (high+low+close)/3 {return((High[Index]+Low[Index]+Close[Index])/3);} case PRICE_WEIGHTED:// 6 Взвешенная цена закрытия, (high+low+close+close)/4 {return((High[Index]+Low[Index]+Close[Index]+Close[Index])/4);} default: {return(Close[Index]);} } return(0); } //+-----------------------------------------------------------------+ //Функция сглаживания | //Модифицированный алгоритм линейно-взвешенного скользящего среднего| //+-----------------------------------------------------------------+ //AvPeriod - период сглаживания | //applied_price - Используемая ценовая константа | //Vol - Умножить на объем | //Sh - Сдвиг | //+-----------------------------------------------------------------+ double GetGausAverage(double AvPeriod,int applied_price,bool Vol,int koef_shift,int Sh) { double sum=0; //Временные переменные для сумм double W=0; //участвующих в ислителе и знаменателе for(int j=AvPeriod;j>=0;j--) { if(Vol==true) { sum+=GetPrice(Sh+j,applied_price)*Volume[Sh]*Coefs[j+koef_shift]; W+=Coefs[j+koef_shift]*Volume[Sh]; } else { sum+=GetPrice(Sh+j,applied_price)*Coefs[j+koef_shift]; W+=Coefs[j+koef_shift]; } } return(sum/W); } // //+-----------------------------------------------------------------+ //Расчёт коэффициентов для радиально-базисной функции сглаживания | //+-----------------------------------------------------------------+ //AvPeriod - период сглаживания | //A - Коэфициент степени е | //N - Степень экспоненты | //+-----------------------------------------------------------------+ double CalcCoefs(double A,double N,double AvPeriod) { //Проверка параметров if(AvPeriod>=50) AvPeriod=49; if(MathAbs(N)>5) N=5; //Заполнение массива коеффициентов for(int i=0;i<=AvPeriod;i++) Coefs[i]=MathExp(A*MathPow(i,N)); return(0); } //+------------------------------------------------------------------+