Страница 1 из 1

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

Добавлено: 31 авг 2017, 13:48
evge
RangeChart - усредненное движение цены с учетом волатильности

Параметры

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

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

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

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


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

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

function Initialize()
{
  IndicatorName = "RangeChart";
  PriceStudy = false;
  AddInput("Input", 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

var I = Input;

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-2021-03-24.zip
скорректированная версия для работы в последних версиях терминала
(118.66 КБ) 995 скачиваний


RangeChart.zip
(118.65 КБ) 1420 скачиваний

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

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

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


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

function Initialize()
{
  IndicatorName = "RangeChart";
  PriceStudy = false;
  AddInput("Input", 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

var I = Input;

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);
}
 
}

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

Добавлено: 01 сен 2017, 09:00
evge
Код индикатора в первом сообщении заменен.

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

Добавлено: 24 мар 2021, 18:59
Dubrovskiy1971
приветствую. но получается скомпилировать. пишет Название ряда индикатора должно быть input в строке 0

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

Добавлено: 24 мар 2021, 21:30
evge
В более ранних версиях АД4 это работало, поменял заменил выше код, который будет работать и в старых и текущих версиях АД4

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

Добавлено: 06 ноя 2021, 22:24
Ilia
Если смотреть усредненное движение по модулю, то поинформативнее было бы.

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

Добавлено: 10 окт 2023, 00:37
Mandarin84
в интернете про него ничего нет
объясните пожалуйста как им пользоваться?
мне кажется в нем большой потенциал