Индикатор Choppy Market Index (CMI) для определения тренда.
Значения индикатора находятся в диапазоне 0-100.
Чем больше значение индикатора, тем больше стабильность рынка, тем вероятнее, что это тренд. Чем меньше значение — тем тренд менее вероятен.
Описание и реализация кода для Metatrader подсмотрены здесь:
https://www.mql5.com/ru/market/product/3260# и здесь
https://www.mql5.com/ru/code/942.
Индикатор CMI представляет собой двойную систему для совершения сделок как по тренду, так и против него. Впервые эта система была представлена Даниэлем Фернандесом в статье, опубликованной в журнале Currency Trading Magazine (август 2011). Это простой, но эффективный индикатор, который определяет, является ли рынок направленным (на рынке тренд) или ненаправленным (бестрендовый рынок). CMI рассчитывает разницу между ценой закрытия последнего бара и ценой закрытия n баров назад, а затем делит это значение на разницу между самым высоким максимумом и самым низким минимумом этих n баров.
Система состоит из двух отдельных наборов правил для бестрендового и трендового рынка (по умолчанию индикатор CMI настроен на работу по этим двум правилам):
Правила бестрендовой стратегии- Открывать длинную позицию, когда скользящее среднее (синяя линия) индикатора CMI ниже 40, а линия CMI красная.
- Открывать короткую позицию, когда скользящее среднее (синяя линия) индикатора CMI ниже 40, а линия CMI зеленая.
- Закрывать, когда CMI поднимается выше 50.
Правила трендовой стратегии- Открывать длинную позицию, когда скользящее среднее (синяя линия) выше 60, а линия CMI зеленая.
- Открывать короткую позицию, когда скользящее среднее (синяя линия) выше 60, а линия CMI красная.
- Закрывать, когда CMI опускается ниже 50.
Входные параметры:Period - период индикатора CMI (значение по умолчанию для таймфрейма D1 = 60)
MA_Period - период линии скользящей средней SMA (значение по умолчанию = 10)
Предупреждение:В коде индикатора использован недокументированный оператор
switch, возможно код не будет работать в новых версиях АД.
Скриншот индикатора:Код индикатора:► Показать
Код: Выделить всё
function Initialize()
{
//SRR_CMI_INDICATOR_V1.01
//Idea (c) Daniel Fernandez
//Coded for AD 4.0 by SRR (aka Indigo-On), 2017-2018
//Индикатор Choppy Market Index - CMI
//Значения индикатора находятся в диапазоне 0-100.
//Чем больше значение индикатора, тем больше стабильность рынка, тем
//вероятнее, что это тренд.
//Чем меньше значение — тем тренд менее вероятен.
//Формула расчета:
//CMI = ((ABS(Close[0]-Close[n]))/(MaxHigh[n]-MinLow[n]))*100
//Где:
//ABS - абсолютное значение;
//Close[0] - последнее закрытие;
//Close[n] - закрытие N баров назад;
//MaxHigh[n] - максимальное значение High за период N баров;
//MinLow[n] - минимальное значение Low за период N баров.
//Описание здесь: https://www.mql5.com/ru/market/product/3260#
//и здесь: https://www.mql5.com/ru/code/942
//
//С 2 рядами данных
//
//v1.01 - версия подготовленная для публикации.
//v1.00 - первая тестовая версия.
//Параметры основного индикатора #1
//Обязательные параметры:
IndicatorName = "SRR_CMI_V1"; //название индикатора
PriceStudy = false; //рисовать в отдельной области
//Дополнительные параметры:
AddParameter("Period", 60, 2); //период CMI (значение по умолчанию для ТФ D1 = 60)
AddParameter("MA_Period", 10); //период SMA (значение по умолчанию = 10)
AddGlobalVariable("dSum", Types.Double, 0.0); //переменная для хранения суммы значений для SMA
AddGlobalVariable("iColorIndex", Types.Int, 0); //переменная для хранения индекса цвета линии CMI
//Входной ряд типа Candle
AddInput("Input1", Inputs.Candle);
//Инициализация линии #1 индикатора - формируем ряд данных CMI
AddSeries("CMI", DrawAs.Custom, Color.Silver, true);
//Инициализация линии #2 индикатора - формируем ряд данных SMA
AddSeries("MySMA", DrawAs.Line, Color.Blue, true);
//Рисуем линии уровня индикатора
AddLevel(40.0, Color.Silver, LineStyles.DashSmall, 1, "CMI");
AddLevel(50.0, Color.Silver, LineStyles.DashSmall, 1, "CMI");
AddLevel(60.0, Color.Silver, LineStyles.DashSmall, 1, "CMI");
}
function Evaluate()
{
///////////////////////////////////////////////////////////
/// Расчет значений индикатора
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
/// Индикатор CMI
/// Расчет значений ряда данных CMI
///////////////////////////////////////////////////////////
//Инициализация переменных
double dMin = 0.0; //локальный мининмум за период
double dMax = 0.0; //локальный максимум за период
double dDeltaClose; //направление
//Вычислить CMI, если данных достаточно для расчетов
if (CurrentIndex > Period)
{
//вычислить локальный минимум за период
var eMin = 1000000000.0;
for(int i = 0; i < Period; i++)
if (Input.Low[-i] < eMin)
eMin = Input.Low[-i];
dMin = eMin;
//вычислить локальный максимум за период
var eMax = 0.0;
for(int i = 0; i < Period; i++)
if (Input.High[-i] > eMax)
eMax = Input.High[-i];
dMax = eMax;
//вычислить CMI
CMI = ((Math.Abs(Input1.Close[0] - Input1.Close[-Period]))/(dMax - dMin)) * 100.0;
}
else
CMI = 50.0;
///////////////////////////////////////////////////////////
/// Вывод значений индикатора CMI на экран
///////////////////////////////////////////////////////////
dDeltaClose = Input1.Close[0] - Input1.Close[-Period];
if (dDeltaClose > 0.0)
{
if (iColorIndex < 2)
iColorIndex++;
}
else
{
if (dDeltaClose < 0.0)
{
if (iColorIndex > 0)
iColorIndex--;
}
else
iColorIndex = 1;
}
//раскрашиваем линию CMI в разные цвета в зависимости
//от значения iColorIndex
switch (iColorIndex)
{
case 0:
//цвет линии красный
CMI.DrawLine(Color.Red, Line.Solid, 1);
break;
case 1:
//цвет линии желтый
CMI.DrawLine(Color.Yellow, Line.Solid, 1);
break;
case 2:
//цвет линии зеленый
CMI.DrawLine(Color.Green, Line.Solid, 1);
break;
}
///////////////////////////////////////////////////////////
/// Индикатор SMA
/// Расчет значений ряда данных MySMA
///////////////////////////////////////////////////////////
if (CurrentIndex < MA_Period)
{
dSum = dSum + CMI[0];
MySMA = dSum / (CurrentIndex + 1);
}
else
{
dSum = dSum + CMI[0] - CMI[(int)(-MA_Period)];
MySMA = dSum / MA_Period;
}
///////////////////////////////////////////////////////////
/// Вывод значений индикатора SMA на экран
///////////////////////////////////////////////////////////
}
Скачать архив с кодом индикатора:Выкладываю как есть.
Прошу Вас не просить доделать, переделать, написать новый, выслать подробное описание и такое прочее.