[MT4指标]单线AKF指标
单线AKF指标-mt4指标-附图显示
//+------------------------------------------------------------------+
//| AKF.mq4 |
//+------------------------------------------------------------------+
#property copyright \"Привалов\"
#property link \"Skype privalov-sv\"
#property indicator_separate_window // Индик. рисуется в основном окне
#property indicator_minimum -1.0 // Границы окна
#property indicator_maximum 1.0
#property indicator_level1 0.0 // линия нуля
#property indicator_buffers 1 // Количество буферов
#property indicator_color1 Red // Цвет линии
extern int History = 1440;
extern bool WriteToFile = true;
double AKF; // Открытие индикаторных массивов
double X,Y,Mu;
int CountedBar = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
ArrayResize(AKF,History);
ArrayResize( X,History);
ArrayResize( Y,History);
ArrayResize( Mu,History);
//--------------------------------------------------------------------
IndicatorDigits(8);
SetIndexBuffer(0,AKF); // Назначение массива буферу
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);// Стиль линии
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//----
if ( Time[0] <= CountedBar ) { return(0);}
CountedBar = Time[0];
if (Bars < History)
{
Alert(\": Недостаточно баров на графике\");
return(0);
}
// необходимо расчитать массив мю - содержит значения лин. регресии
// формируем массивы X и Y
for ( int i = 0; i <= History; i ++ )
{
X=Time-Time[History];
Y=Close;
}
double A = 0, B = 0; // обнуляю коэффициенты лин. регресcии
double SKO = 0.0, AKF_norm = 0.0;
LinearRegr(X, Y, History, A, B);
for ( i = 0; i <= History; i ++ )
{
Mu=A*X+B;
SKO += MathPow( Y - Mu, 2 );
}
SKO /= History;
Print(\" A =\", DoubleToStr( A, 8 ), \" B =\", DoubleToStr( B, 8 ));
//-------------------------------------------------------------------------------------------
// Расчёт АКФ
for ( int m = 0; m <= History; m ++ )
{
double summ = 0.0;
for ( i = 0; i <= History; i ++ )
{
if ( i+m > History ) continue;
summ += ( Y - Mu ) * ( Y[i+m] - Mu[i+m] );
}
AKF[m] = 1/SKO*summ;
}
// 5. Нормировка
// Полученный массив AKFm просто делим на значение, которое находиться в 0 ячейке
for ( m = History; m >= 0; m -- ) AKF[m] /= AKF[0];
return(0);
}
//+------------------------------------------------------------------+
//| Рассчет коэффициентов A и B в уравнении |
//| y(x)=A*x+B |
//| используються формулы http://forum.mql4.com/ru/10780/page5 |
//+------------------------------------------------------------------+
void LinearRegr(double X, double Y, int N, double& A, double& B)
{
double mo_X = 0.0, mo_Y = 0.0, var_0 = 0.0, var_1 = 0.0;
for ( int i = 0; i < N; i ++ )
{
mo_X +=X;
mo_Y +=Y;
}
mo_X /=N;
mo_Y /=N;
for ( i = 0; i < N; i ++ )
{
var_0 +=(X-mo_X)*(Y-mo_Y);
var_1 +=(X-mo_X)*(X-mo_X);
}
A = var_0 / var_1;
B = mo_Y - A * mo_X;
}