Пользовательские индикаторы > MAngle - отношение соседних точек MA

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

MAngle - отношение соседних точек MA

Непрочитанное сообщение evge » 21 авг 2016, 20:05

Индикатор MAngle отображает отношение текущей и предыдущей точки Moving Average (SMA, EMA или WMA) в виде гистограммы. MAngle, в некоторых случаях, позволяет чуть раньше определить смену направления MA.

Параметры:

Period - период MA
PeriodAngle - период усреднения отношений соседних точек MA
MAType - 0 - SMA, 1 - EMA, 2 - WMA

Примеры работы:

MAngle-01.png
MAngle-01.png (41.85 КБ) 18928 просмотров


Исходный текст индикатора:

Код: Выделить всё

function Initialize()
{
IndicatorName = "MAngle";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("A", DrawAs.Histogram, Color.Blue, AxisType.ZeroBased, true, Axes.New);
AddSeries("MA", DrawAs.Line, Color.Red, true, Axes.Parent);

AddParameter("Period", 10);
AddParameter("PeriodAngle", 3);
AddParameter("MAType", 0); // 0 - SMA, 1 - EMA, 2 - WMA

}

function Evaluate()
{

// evge 21.08.2016 http://alfadirect4.ru

if (CurrentIndex > Period)
{
var S = SMA(Input.Close, 1);
if (MAType == 2) S = WMA(Input.Close, Period);
else
if (MAType == 1) S = EMA(Input.Close, Period);
else
S = SMA(Input.Close, Period);

var sum = 0.0;

for (var x = 0; x < PeriodAngle; x++)
   {
   sum += S[x] / S[x+1] - 1;
   }

A = sum / PeriodAngle;
MA = S[0];
}
else
{
   A = 0;
   MA = Input.Close[0];
}

}


Скачать исходный текст:

MAngle.zip
(902 байт) 1032 скачивания
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: MAngle - отношение соседних точек MA

Непрочитанное сообщение evge » 07 фев 2017, 08:30

Вариант с индикацией падения \ роста разным цветом значения осциллятора MAngle

MAngle-02.png
MAngle-02.png (42.96 КБ) 18617 просмотров


Код: Выделить всё

function Initialize()
{
IndicatorName = "MAngle";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("AB", DrawAs.Custom, Color.Black, AxisType.ZeroBased, false, Axes.New);
AddSeries("A", DrawAs.Custom, Color.Green, AxisType.ZeroBased, true, Axes.New);
AddSeries("B", DrawAs.Custom, Color.Red, AxisType.ZeroBased, true, Axes.New);
AddSeries("MA", DrawAs.Line, Color.Red, true, Axes.Parent);

AddParameter("Period", 10);
AddParameter("PeriodAngle", 5);
AddParameter("MAType", 0); // 0 - SMA, 1 - EMA, 2 - WMA

}

function Evaluate()
{

// evge 25.08.2016 http://alfadirect4.ru

if (CurrentIndex > Period)
{
var S = SMA(Input.Close, 1);
if (MAType == 2) S = WMA(Input.Close, Period);
else
if (MAType == 1) S = EMA(Input.Close, Period);
else
S = SMA(Input.Close, Period);

var sum = 0.0;

for (var x = 0; x < PeriodAngle; x++)
   {
   sum += S[x] / S[x+1] - 1;
   }

AB[0] = sum / PeriodAngle;
MA = S[0];
}
else
{
   AB[0] = 0;
   MA = Input.Close[0];
}

A[0] = 0; B[0] = 0;

if (AB[0] > AB[1])
{ A[0] = AB[0]; A.DrawHistogram(); }
else
{ B[0] = AB[0]; B.DrawHistogram(); }

}


Скачать исходный текст

MAngleColor.zip
(970 байт) 1061 скачивание
никогда такого не было и вот опять

StanislavAV
Сообщения: 1
Зарегистрирован: 15 май 2020, 15:13
Благодарил (а): 1 раз

MAngle - отношение соседних точек MA

Непрочитанное сообщение StanislavAV » 15 май 2020, 15:23

Добрый день.
Хотел проконсультироваться со специалистами.
Есть график MAngle. При росте каждый последующий бар красится в зеленый цвет. Как прописать зависимость
Если три зеленых бара подряд и после красного бар каждый зеленый бар короче предыдущего пока поднимается до нуля открывается сделка.

2020-05-15_15-04-32.png
2020-05-15_15-04-32.png (5.03 КБ) 16069 просмотров


Код: Выделить всё

   if ( (MY.MAngle(Input1, PSslow, 50, 0).GetValue("AB[0]", 0) < (MY.MAngle(Input1, PSslow, 50, 0).GetValue("AB[1]", 0)< (MY.MAngle(Input1, PSslow, 50, 0).GetValue("AB[2]", 0)  )   
   {
      EnterLong();
   }


АВ это параметр в индикаторе MAngle
Спасибо.

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: MAngle - отношение соседних точек MA

Непрочитанное сообщение evge » 15 май 2020, 16:37

Приветствую!

Код: Выделить всё

var MA = MY.MAngle(Input1, PSslow, 50, 0)["AB"];

if (MA[0] > MA[1] && MA[1] > MA[2] && MA[2] < MA[3] && MA[0] < 0)
{
EnterLong();
}
никогда такого не было и вот опять

Stanislav
Сообщения: 5
Зарегистрирован: 16 янв 2021, 18:00

Re: MAngle - отношение соседних точек MA

Непрочитанное сообщение Stanislav » 02 мар 2021, 16:07

сделал простую стратегию на этом индикаторе:

Код: Выделить всё

function Initialize()
{
   StrategyName = "BABIKOFF_MAngle";
   AddParameter("P1", 0, "Period SMA", 1);
   AddParameter("P2", 0, "Period Angle", 1);
   AddInput("Input1", Inputs.Candle, 15, false, "SBER=МБ ЦК");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("MY.MAngle", new Dictionary <string, string>{{"Period", "P1"},{"PeriodAngle", "P2"},{"MAType", "0"}});
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.MAngle(Input1, P1, P2, 0).GetValue("A", 0) > 0) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (MY.MAngle(Input1, 10, 3, 0).GetValue("A", 0) < 0) )
   {
      EnterShort();
   }

}


но видимо что то неправильно. при пересечении ценой МА вниз начинает открывать сделку на каждом баре:
Снимок экрана (5).png

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: MAngle - отношение соседних точек MA

Непрочитанное сообщение evge » 02 мар 2021, 20:28

Добрый вечер!

Используйте серию AB, вместо A

и во втором правиле у вас не заданы параметры у индикатора, а берутся явно заданные значения

10, 3, 0

Код: Выделить всё

if ( (MY.MAngle(Input1, 10, 3, 0).GetValue("A", 0) < 0) )


заменить на

Код: Выделить всё

if ( (MY.MAngle(Input1, P1, P2, 0).GetValue("AB", 0) < 0) )


весь исправленный код

Код: Выделить всё

function Initialize()
{
   StrategyName = "BABIKOFF_MAngle";
   AddParameter("P1", 0, "Period SMA", 1);
   AddParameter("P2", 0, "Period Angle", 1);
   AddInput("Input1", Inputs.Candle, 15, false, "SBER=МБ ЦК");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("MY.MAngle", new Dictionary <string, string>{{"Period", "P1"},{"PeriodAngle", "P2"},{"MAType", "0"}});
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.MAngle(Input1, P1, P2, 0).GetValue("AB", 0) > 0) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (MY.MAngle(Input1, P1, P2, 0).GetValue("AB", 0) < 0) )
   {
      EnterShort();
   }

}


тот же результат, но код проще, понятнее:

Код: Выделить всё

function Initialize()
{
   StrategyName = "BABIKOFF_MAngle";
   AddParameter("P1", 0, "Period SMA", 1);
   AddParameter("P2", 0, "Period Angle", 1);
   AddInput("Input1", Inputs.Candle, 15, false, "SBER=МБ ЦК");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("MY.MAngle", new Dictionary <string, string>{{"Period", "P1"},{"PeriodAngle", "P2"},{"MAType", "0"}});
}

function OnUpdate()
{
   var M = MY.MAngle(Input1, P1, P2, 0)["AB"];

   if ( M[0] > 0 )
   {
      EnterLong();
   }

   if ( M[0] < 0 )
   {
      EnterShort();
   }

}


вариант без открытия сделок на каждом баре, а только на пересечении

Код: Выделить всё

function Initialize()
{
   StrategyName = "BABIKOFF_MAngle";
   AddParameter("P1", 0, "Period SMA", 1);
   AddParameter("P2", 0, "Period Angle", 1);
   AddInput("Input1", Inputs.Candle, 15, false, "SBER=МБ ЦК");
   LongLimit = 0;
   ShortLimit = 0;
   AddChartIndicator("MY.MAngle", new Dictionary <string, string>{{"Period", "P1"},{"PeriodAngle", "P2"},{"MAType", "0"}});
}

function OnUpdate()
{
   var M = MY.MAngle(Input1, P1, P2, 0)["AB"];

   if ( M[0] > 0 && M[1] < 0)
   {
      EnterLong();
   }

   if ( M[0] < 0 && M[1] > 0)
   {
      EnterShort();
   }

}
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей