Библиотека польльских индикаторовзовате. БИБЛИОТЕКА ПОЛЬЗОВАТЕЛЬСКИХ ИНДИКАТОРОВ АЛЬФА-ДИРЕКТ4.0. Инструкция по созданию и импорту пользовательских индикаторов 4 библиотека пользовательских индикаторов 5
Скачать 1.9 Mb.
|
ИНДИКАТОРЫ ОБЪЕМАVBA (Volume of Bid / Ask) – Объем по БИД и АСКОбъем по Бид и Аск – это индикатор, показывающий активность покупателей или продавцов, т.е. кто был инициатором сделок. VBA имеет 3 выходных ряда: V – Объем (оборот) общий, отображается всегда Vbid – Объем (оборот) по Бид отображается Если Vbid > Vask Vask – Объем (оборот) по Аск отображается Если Vask > Vbid Код Альфа-Директ. function Initialize() { // Обязательные параметры: IndicatorName = "VBA"; PriceStudy = false; AddInput("Input", Inputs.Candle); AddSeries("V", DrawAs.Histogram, Color.Gray); // Задаем вид линии индикатора A AddSeries("Vbid", DrawAs.Histogram, Color.Red); // Задаем вид линии индикатора A AddSeries("Vask", DrawAs.Histogram, Color.Green); // Задаем вид линии индикатора A } function Evaluate() { // AlfaDirect. 2014. OX. // Volume - Bid - Ask (VBA) V = Input.Volume[0]; if (Input.VolumeAsk[0] > Input.VolumeBid[0]) { Vask = Input.VolumeAsk[0]; Vbid = 0.0; } else { Vask = 0.0; Vbid = Input.VolumeBid[0]; } } Delta – ДельтаИндикатор Дельта рассчитывается как разница объемов сделок, совершенных по Bid и Ask и показывает агрессивность покупателей или продавцов. В обычной ситуации при падении рынка больше агрессивных продавцов, а при росте – покупателей. Пример отображения индикатора Delta на акциях Сбербанка. Delta > 0 – больше агрессивных покупателей (зеленый цвет) Delta < 0 – больше агрессивных покупателей (красный цвет) Сигналы Индикатор является вспомогательным. Обращать внимание на свечки с большой дельтой, т.к. на боковом движении они будут разворотными, а на трендовом – импульсами к дальнейшему движению. Обращать внимание на маленькие свечки с большой дельтой, т.к. может говорить о наличии крупного лимитного ордера. Код Альфа-Директ. function Initialize() { // Обязательные параметры: IndicatorName = "Delta"; AddInput("Input", Inputs.Candle); PriceStudy = false; AddSeries("Delta", DrawAs.Custom, Color.Green, AxisType.ZeroBased); } function Evaluate() { // AlfaDirect. 2014. OX // Delat (Дельта) - разница между объемом сделок покупателей и продавцов Delta = Input.VolumeAsk[0] - Input.VolumeBid[0]; if (Delta > 0 ) Delta.DrawHistogram(Color.Green, Color.Green, 100); else Delta.DrawHistogram(Color.Red, Color.Red, 100); } DeltaDay – Кумулятивная Дельта за деньИндикатор кумулятивная Дельта рассчитывается как сумма разниц объемов сделок, совершенных по Bid и Ask и показывает агрессивность покупателей или продавцов. В обычной ситуации при падении рынка больше агрессивных продавцов, а при росте – покупателей. Пример отображения индикатора Delta на акциях Сбербанка. Delta > 0 – больше агрессивных покупателей (зеленый цвет) Delta < 0 – больше агрессивных покупателей (красный цвет) Сигналы Индикатор является вспомогательным. Обращать внимание на переходы через 0 и статистически большие значения при боковом движении. Код Альфа-Директ. function Initialize() { IndicatorName = "DeltaDay"; AddInput("Input", Inputs.Candle); PriceStudy = false; AddSeries("DeltaDay", DrawAs.Custom, Color.Gray); AddSeries("DeltaOpen", DrawAs.Custom, Color.Gray); AddLevel(0, Color.Gray, "DeltaDay"); } function Evaluate() { // AlfaDirect 2014 (Исправлено 2016). // Кумулятивная Дельта Дневная - интеграл разниц между объемами покупателей и продавцов за день if ( BarTime() == AsTime(10, 0, 0) || CurrentIndex < 1) { DeltaDay = Input.VolumeAsk[0] - Input.VolumeBid[0]; DeltaOpen = 0; } else { DeltaDay = DeltaDay[-1] + Input.VolumeAsk[0] - Input.VolumeBid[0]; DeltaOpen = DeltaDay[-1]; } if (DeltaDay > DeltaOpen ) DeltaDay.DrawHistogram( DeltaOpen, Color.Green, Line.Solid, 1, Color.Green, 100); else DeltaDay.DrawHistogram( DeltaOpen, Color.Red, Line.Solid, 1, Color.Red, 100); } ADL (Accumulation/Distribution Line) – накопление/распределениеНакопление / распределение – показывает силу движения, которая вычисляется как изменения цены относительно максимального размаха и объема торгов за бар. Приведем формулу: Сигналы Дивергенции пиков цены и соответствующего уровня ADL. Автор: Ларри Вильямс (Larry Williams). Первоисточник: Ноw I made a Million Dollars. 1972. // Совпадает с MQL4 // Совпадает с Акелис Код Альфа-Директ. function Initialize() { IndicatorName = "ADL"; PriceStudy = false; AddInput("Input", Inputs.Candle); AddSeries("ADL", DrawAs.Line, Color.Red); } function Evaluate() { // AlfaDirect. 2014. OX // Accumulation/Distribution Line (ADL) var CLV = ((Input.Close[0]-Input.Low[0]) - (Input.High[0]-Input.Close[0])) * Input.Volume[0]; var Delta = (Input.High[0]-Input.Low[0]); if (Delta <= 0) CLV = 0; else CLV = CLV / Delta; if (CurrentIndex < 1) ADL = CLV; else ADL = ADL[-1] + CLV; } OBV (On-Balance Volume) – Балансовый объемOBV – динамический индикатор, соотносящий объем торгов и изменение цены. Сигналы Пробой предыдущего экстремума Дивергенция пиков цены и значения OBV При боковом движении цены индикатор OBV показывает новые экстремумы Автор: Джозеф Грэнвиль (Joseph Granville). Первоисточник: New strategy of Daily Stock Market Trading. // В.Меладзе. Курс технического анализа. Код Альфа-Директ. function Initialize() { IndicatorName = "OBV"; AddInput("Input", Inputs.Candle); PriceStudy = false; AddSeries("OBV", DrawAs.Line, Color.Red); } function Evaluate() { // AlfaDirect. 2014. OX // OBV (On Balance Volume) – балансовый объем if (CurrentIndex < 1) OBV = Input.Volume[0]; else if (Input.Close[0] > Input.Close[-1]) OBV = OBV[-1] + Input.Volume[0]; else if (Input.Close[0] < Input.Close[-1]) OBV = OBV[-1] - Input.Volume[0]; else OBV = OBV[-1]; } OICandle (Open Interest Candle) – свечной открытый интересOICandle – индикатор, отображающий открытый интерес в виде свечки. Код Альфа-Директ. function Initialize() { // Обязательные параметры: IndicatorName = "OICandle"; AddInput("Input", Inputs.Candle); PriceStudy = false; AddSeries("Close", DrawAs.Custom, Color.Magenta); AddSeries("Open", DrawAs.Custom, Color.Blue); } function Evaluate() { // AlfaDirect. 2015. // Открытый интерес - изменение отображается свечкой. if ( CurrentIndex > 0 ) { Open = Input.OpenInterest[-1]; Close = Input.OpenInterest[0]; if ( Input.OpenInterest[0] > Input.OpenInterest[-1] ) Close.DrawHistogram(Open, Color.Lime, Line.Solid, 1, Color.Lime, 100); else Close.DrawHistogram(Open, Color.Red, Line.Solid, 1, Color.Red, 100); } } ADX (Average Directional Index) – ИНДЕКС СРЕДНЕГО НАПРАВЛЕНОГО ДВИЖЕНИЯИндекс среднего направленного движения – это индикатор, показывающий силу текущего движения на рынке или среднюю величину приращений новых экстремумов. Расчет индикатора достаточно громоздкий. Шаг 1. Рассчитывается положительное и отрицательное направленное движение +DM и –DM, на основании правил, которые показаны на рис.. Эти правила могут быть формализованы следующим образом. Если Ht > Ht-1, то +DMt = Ht – Ht-1, иначе +DMt = 0 Если Lt < Lt-1, то –DMt = Lt-1 – Lt, иначе –DMt = 0 Меньшее из +DMt и –DMt приравнивается к нулю. А если они равны друг другу, то к нулю приравниваются оба. Шаг 2. Вычисляется истинный диапазон TR (True Range) TRt = max( |Lt – Ct-1|, |Ht – Ct-1|, |Ht – Lt| ) Шаг 3. Вычисляем сглаженные индикаторы положительного направления +DI и отрицательного направления –DI. Если TRt = 0, то +SDIt = 0 и –SDIt = 0, Если TRt ≠ 0, то +SDIt = +DMt / TRt и –SDIt = –DMt / TRt. Сглаживая +SDI и -SDI экспоненциальным скользящим средним (EMA) с периодом Period, получаем +DIt = EMA( +SDI, Period), –DIt = EMA(–SDI, Period). Шаг 4. Вычисляем среднее направленное движение ADX. Для этого сначала находим направленное движение DX. DXt = (|+DIt – –DIt| / |+DIt + –DIt|) × 100. Затем, сглаживая ряд DX, получаем значение ADX: ADXt = EMA (DX, Period). Индикатор ADX показывает силу тенденции, которая определяется как частота и величина формирования новых экстремумов. При росте индикатора ADX, можно говорить о том, что рыночный тренд становится сильнее. Падающий индикатор ADX сигнализирует, что доминирующая тенденция на рынке ослабевает или меняется. Линии +DI и –DI показывают превалирование новых максимумов или минимумов в текущем движении цены. Типовые параметры. Для индикатора обычно используется следующее типовое значение параметра Period = 14 на дневном тайм-фрейме. Сигналы. ADX растет – показывает силу текущей тенденции. ADX начинает расти из области менее 15 – начало тенденции после консолидации. Пересечение +DIи -DI определяет направление сигнала. Автор. Уэллс Уайлдер (Welles Wilder). Первоисточник. Welles Wilder. New Concepts in Technical Trading Systems. 1978. Код Альфа-Директ. Экспоненциальное сглаживание // В первоисточнике сглаживание Wilder function Initialize() { IndicatorName = "ADX"; PriceStudy = false; AddInput("Input", Inputs.Candle); AddParameter("Period", 14); AddSeries("ADX", DrawAs.Line, Color.Blue); AddSeries("DIP", DrawAs.Line, Color.Green); AddSeries("DIN", DrawAs.Line, Color.Red); AddGlobalVariable("DIp", Types.Double, 0.0); AddGlobalVariable("DIn", Types.Double, 0.0); AddGlobalVariable("vATR", Types.Double, 0.0); } function Evaluate() { // AlfaDirect. 2015. OX // ADX (Average Directional Index) Сглаживание EMA. // Реализация MQL double KC = (double)2.0 / (Period + 1.0); double KE = 1.0 - KC; if (CurrentIndex == 0) { DIp = 0.0; DIn = 0.0; DIP = 0.0; DIN = 0.0; ADX = 0.0; vATR = Input.High[0] - Input.Low[0]; } else { // Расчет (DX+ DX-) -------------------------- double dH = Input.High[0] - Input.High[-1]; double dL = Input.Low[-1] - Input.Low[0]; double DXp = 0.0; double DXn = 0.0; if (dH > 0.0) DXp = dH; else DXp = 0.0; if (dL > 0) DXn = dL; else DXn = 0.0; if (DXp == DXn) { DXn = 0.0; DXp = 0.0; } if (DXp > DXn) DXn = 0.0; if (DXp < DXn) DXp = 0.0; // Расчет TR -------------------------------------------------- double TR = Math.Max(Math.Max(Math.Abs(Input.High[0] - Input.Low[0]), Math.Abs(Input.High[0] - Input.Close[-1])), Math.Abs(Input.Low[0] - Input.Close[-1])); vATR = KE*vATR + KC*TR; // Расчет (DI+ DI-) ---------------------------------------------- if (vATR < 0.00000000001) { DIp = KE*DIp; DIn = KE*DIn; DIP = DIP[-1]; DIN = DIN[-1]; } else { DIp = KE*DIp + KC*DXp; DIn = KE*DIn + KC*DXn; DIP = DIp / vATR * 100.0; DIN = DIn / vATR * 100.0; } // ADX -------------------------------- double div = ( DIP[0] + DIN[0] ); double Buffer = 0.0; if (div == 0.0) Buffer = 0.0; else Buffer = 100.0 * (Math.Abs(DIP[0]-DIN[0]) / div); ADX = KE*ADX[-1] + KC*Buffer; } } Учебный центр |