Пользовательские индикаторы > RangeChart - усредненное движение цены с учетом волатильности

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

RangeChart - усредненное движение цены с учетом волатильности

Непрочитанное сообщение evge » 31 авг 2017, 13:48

RangeChart - усредненное движение цены с учетом волатильности

Параметры

Period - период для расчета средних

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

RangeChart-01.png
RangeChart-01.png (40.92 КБ) 4767 просмотров

RangeChart-02.png
RangeChart-02.png (43.18 КБ) 4767 просмотров


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

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

function Initialize()
{
  IndicatorName = "RangeChart";
  PriceStudy = false;
  AddInput("I", Inputs.Candle);         
  AddParameter("Period", 13);                   
  AddGlobalVariable("SUM", Types.Double, 0.0);         
  AddGlobalVariable("SUMR", Types.Double, 0.0);         
  AddSeries("Med", DrawAs.Line, Color.Red, false);   
  AddSeries("Range", DrawAs.Line, Color.Black, false);   
 
  AddSeries("ROpen", DrawAs.Custom, Color.Green);   
  AddSeries("RHigh", DrawAs.Custom, Color.Black);   
  AddSeries("RLow", DrawAs.Custom, Color.Black);   
  AddSeries("RClose", DrawAs.Custom, Color.Red);   
  AddSeries("Zero", DrawAs.Line, Color.Black);   
}

function Evaluate()
{

// evge 31.08.2017 http://alfadirect4.ru

Zero = 0.0;

double LRange = 0.0;

if (CurrentIndex > 0)
   Range = Math.Max( I.Close[0] - I.Close[1], I.High[0] - I.Low[0] );
else
   Range = 0;

if ( CurrentIndex < Period )
{
   SUM += (I.High[0] + I.Low[0]) * 0.5;     
   Med = SUM / (CurrentIndex + 1);     
   SUMR += Range;
   LRange = SUMR / (CurrentIndex + 1) / Period;
}
else
{
   SUM += (I.High[0] + I.Low[0]) * 0.5 - (I.High[Period] + I.Low[Period]) * 0.5;     
   Med = SUM / Period;   
    SUMR += Range[0] - Range[Period];
   LRange = SUMR / Period / Period;
}

if (LRange != 0.0) {
   ROpen = ( I.Open[0] - Med[0] ) / LRange;
   RHigh = ( I.High[0] - Med[0] ) / LRange;
   RLow = ( I.Low[0] - Med[0] ) / LRange;
   RClose = ( I.Close[0] - Med[0] ) / LRange;
}

if (RClose > ROpen)
{
   ROpen.DrawHistogram(RClose);
   RHigh.DrawVertical(RClose);
   RLow.DrawVertical(ROpen);
}
else
{
   if (RClose[0] == ROpen[0]) RClose.DrawDash(Colors["RHigh"], LineStyles.Solid, 1,0);
   else RClose.DrawHistogram(ROpen);
   RHigh.DrawVertical(ROpen);
   RLow.DrawVertical(RClose);
}
 
}


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

RangeChart.zip
(118.65 КБ) 385 скачиваний
никогда такого не было и вот опять

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

Re: RangeChart - усредненное движение цены с учетом волатильности

Непрочитанное сообщение evge » 31 авг 2017, 18:06

Ради спортивного интереса дорисовал индикатор до свечек, похожих на настоящие :)
Заодно будет примером на будущее как нарисовать программно свечки.

RangeChart-03.png
RangeChart-03.png (41.32 КБ) 4746 просмотров


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

function Initialize()
{
  IndicatorName = "RangeChart";
  PriceStudy = false;
  AddInput("I", Inputs.Candle);         
  AddParameter("Period", 13);                   
  AddGlobalVariable("SUM", Types.Double, 0.0);         
  AddGlobalVariable("SUMR", Types.Double, 0.0);         
  AddSeries("Med", DrawAs.Line, Color.Red, false);   
  AddSeries("Range", DrawAs.Line, Color.Black, false);   
 
  AddSeries("ROpen", DrawAs.Custom, Color.Green);   
  AddSeries("RHigh", DrawAs.Custom, Color.Black);   
  AddSeries("RLow", DrawAs.Custom, Color.Black);   
  AddSeries("RClose", DrawAs.Custom, Color.Red);   
  AddSeries("Zero", DrawAs.Line, Color.Black);   
}

function Evaluate()
{

// evge 31.08.2017 http://alfadirect4.ru

Zero = 0.0;

double LRange = 0.0;

if (CurrentIndex > 0)
   Range = Math.Max( I.Close[0] - I.Close[1], I.High[0] - I.Low[0] );
else
   Range = 0;

if ( CurrentIndex < Period )
{
   SUM += (I.High[0] + I.Low[0]) * 0.5;     
   Med = SUM / (CurrentIndex + 1);     
   SUMR += Range;
   LRange = SUMR / (CurrentIndex + 1) / Period;
}
else
{
   SUM += (I.High[0] + I.Low[0]) * 0.5 - (I.High[Period] + I.Low[Period]) * 0.5;     
   Med = SUM / Period;   
    SUMR += Range[0] - Range[Period];
   LRange = SUMR / Period / Period;
}

if (LRange != 0.0) {
   ROpen = ( I.Open[0] - Med[0] ) / LRange;
   RHigh = ( I.High[0] - Med[0] ) / LRange;
   RLow = ( I.Low[0] - Med[0] ) / LRange;
   RClose = ( I.Close[0] - Med[0] ) / LRange;
}

if (RClose > ROpen)
{
   ROpen.DrawHistogram(RClose);
   RHigh.DrawVertical(RClose);
   RLow.DrawVertical(ROpen);
}
else
{
   if (RClose[0] == ROpen[0]) RClose.DrawDash(Colors["RHigh"], LineStyles.Solid, 1,0);
   else RClose.DrawHistogram(ROpen);
   RHigh.DrawVertical(ROpen);
   RLow.DrawVertical(RClose);
}
 
}
никогда такого не было и вот опять

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

Re: RangeChart - усредненное движение цены с учетом волатильности

Непрочитанное сообщение evge » 01 сен 2017, 09:00

Код индикатора в первом сообщении заменен.
никогда такого не было и вот опять


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

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

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