Библиотека польльских индикаторовзовате. БИБЛИОТЕКА ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ АЛЬФА-ДИРЕКТ4.0. Инструкция по созданию и импорту пользовательских индикаторов 4 библиотека пользовательских индикаторов 5
Скачать 1.9 Mb.
|
DEMA (DOUBLE EXPONENTIAL MOVING AVERAGE) – ДВОЙНАЯ ЭКСПОНЕНЦИАЛЬНАЯ СКОЛЬЗЯЩАЯ СРЕДНЯЯДвойная экспоненциальная скользящая средняя – индикатор, в котором осуществлена попытка минимизировать запаздывание приусреднении цен. Для этого считается ошибка (т.е. разница между входным рядом и EMA) Полученное значение еще раз сглаживается и добавляется к EMA. После преобразования получаем окончательную формулу Код Альфа-Директ function Initialize() { IndicatorName = "DEMA"; AddInput("Input", Inputs.Price); AddSeries("DEMA", DrawAs.Line, Color.Green); PriceStudy = true; AddParameter("Period", 20, 1); AddGlobalVariable("K", Types.Double, 0.0); AddGlobalVariable("EMAi", Types.Double, 0.0); AddGlobalVariable("EMAe", Types.Double, 0.0); } function Evaluate() { // AlfaDirect. 2015. OX // EMA - экспоненциальная скользящая средняя. if (CurrentIndex > 0) { EMAi = (1.0 - K)*EMAi + K*Input[0]; EMAe = (1.0 - K)*EMAe + K*EMAi; DEMA = 2.0*EMAi - EMAe; } else { EMAi = Input[0]; EMAe = Input[0]; DEMA = Input[0]; K = 2.0/(Period + 1.0); } } МОДЕЛИ РЯДОВLinReg (Linear Regression) – ЛИНЕЙНАЯ РЕГРЕССИЯЛинейная регрессия (LinReg) – это индикатор, который отображает в каждый момент последнюю точку текущей линейной модели ценового движения за указанный период, посчитанную на основании метода наименьших квадратов. Формула расчета следующая: где N – период линейной модели, Extr – период экстраполяции линейной модели (значение может быть положительным или отрицательным). Пример отображения индикатора LinReg с периодом 30 и экстраполяцией 5 Код Альфа-Директ function Initialize() { IndicatorName = "LinReg"; PriceStudy = true; AddInput("Input", Inputs.Price); AddSeries("LinReg", DrawAs.Line, Color.Red); AddParameter("Period", 20); AddParameter("Extr", 10); AddGlobalVariable("ZN", Types.Double, 0.0); AddGlobalVariable("t2", Types.Double, 0.0); AddGlobalVariable("t4", Types.Double, 0.0); } function Evaluate() { // AlfaDirect. 2015. OX // LinReg (Linear Regression) - Линейная регрессия if (CurrentIndex == 0 ) { // Расчет неизменных коэффициентов по времени for (int i = 0; i < Period; i++) { t2 = t2 + i; t4 = t4 + i * i; } ZN = ((double)Period * t4 - t2 * t2); } if (CurrentIndex < Period + Extr ) LinReg = Input[0]; else { // Вариант t = [0...N-1] double a1 = 0.0; double a3 = 0.0; for (int i = 0; i < Period; i++) { a1 = a1 + i * Input[-(int)Period + 1 + i]; a3 = a3 + Input[-i]; } var alfa = (Period * a1 - t2 * a3) / ZN; var beta = (a3 - alfa * t2) / Period; LinReg = alfa * ((double)Period-1.0 + Extr) + beta ; } } LinRegChannel (Linear Regression Channel) – КАНАЛ ЛИНЕЙНОЙ РЕГРЕССИИКанал линейной регрессии (LinRegChannel) – это канал с наклоном a, который вычислен для ценового ряда со смещением в прошлое на величину Delay. Смещение b вычисляется с учетом смещения Delay Отклонение Sigma1 и Sigma2 вычисляется как максимальная положительная и отрицательная разница между ценой и моделью линейной регрессии . Индикатор строит четыре линии где t – время построения модели (строится на интервале [-N-Delay, -Delay] от конца графика), Delay – параметр запаздывания построения модели, Пример отображения индикатора LinRegChannelс периодом 125 и задержкой 5 Код Альфа-Директ function Initialize() { IndicatorName = "LinRegChannel"; PriceStudy = true; AddInput("Input", Inputs.Price); AddSeries("LineUp", DrawAs.Line, Color.Red); AddSeries("LineDn", DrawAs.Line, Color.Red); AddSeries("LineU2", DrawAs.Line, Color.Gray); AddSeries("LineD2", DrawAs.Line, Color.Gray); AddParameter("Period", 100, 1); AddParameter("Delay", 5); } function Evaluate() { // AlfaDirect 2016. OX // Канал линейной регрессии за период (Period) с запаздыванием (Delay) // Отклоенение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия. if (CurrentIndex == MaxIndex) { double a1 = 0.0; double a2 = 0.0; double a3 = 0.0; double a4 = 0.0; if (CurrentIndex >= Period+Delay ) { double N = Period; for (var i = 0; i < N; i++) { a1 = a1 + i * Input[-(int)N + 1 + i -Delay]; a2 = a2 + i; a3 = a3 + Input[-i -Delay]; a4 = a4 + i * i; } var alfa = (Period * a1 - a2 * a3) / (N * a4 - a2 * a2); var beta = (a3 - alfa * a2) / N; double Sigma1 = 0.0; double Sigma2 = 0.0; for (var i = 0; i < N; i++) { // Расчет отклонения 1 double a = ((alfa * (i) + beta) - Input[-Period+i+1 -Delay]); if ( a > Sigma1 ) Sigma1 = a; // Расчет отклонения 2 a = -((alfa * (i) + beta) - Input[-Period+i+1 -Delay]); if ( a > Sigma2 ) Sigma2 = a; } for (var i = 0; i < N+Delay; i++) { LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1; LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma2; LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1; LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma2; } } } } |