﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">ADX, DiPlus, DiMinus</title>
  <id>~/topic/2774/adx-diplus-diminus/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-04T07:23:29Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=2774" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/19666/</id>
    <title type="text">Мне самому нужна была формула для ADX, когда искал - нашел кучу вариаций, после чего написал в тех п...</title>
    <published>2012-06-11T05:55:49Z</published>
    <updated>2012-06-11T05:59:52Z</updated>
    <author>
      <name>OvcharenkoVI</name>
      <uri>https://stocksharp.ru/users/390/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Мне самому нужна была формула для ADX, когда искал - нашел кучу вариаций, после чего написал в тех поддержку Альфы, они прислали мне код, правда он был не на C#, но смысл я понял.&lt;br /&gt;&lt;br /&gt;Прикладываю класс индюка DiPart. Реализован не через Length indicator, а просто как класс. Полностью совпадает с альфой.&lt;br /&gt;&lt;br /&gt;Получить Di+ можно свойством Dlpp, Di- свойством Dlmm.&lt;br /&gt;&lt;br /&gt;Методом Process Добавляем готовую свечку(не через CandleIndicatorValue, а просто candle),&lt;br /&gt;&lt;br /&gt;Также добавлен метод UpDate, чтобы индюк мог меняться внутри свечи(также добавляем туда candle). Также считает верно.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
[h]public class ADX
    {
        public decimal Length;

        private decimal dH;

        private decimal dL;

        private decimal DXp;

        private decimal DXm;

        private decimal TR;

        private decimal TRPpast;

        private decimal Dlp;

        private decimal Dlm;

        public decimal Dlpp;

        public decimal DLmm;

        private Candle _prevCandle;

        private List&amp;lt;decimal&amp;gt; list = new List&amp;lt;decimal&amp;gt;(); 

        public void Process(Candle candle)
        {
            if(_prevCandle == null)
            {
                _prevCandle = candle;

                return;
            }

            dH = candle.HighPrice - _prevCandle.HighPrice;

            dL = _prevCandle.LowPrice - candle.LowPrice;

            DXp = dH &amp;gt; 0 ? dH : 0;

            DXm = dL &amp;gt; 0 ? dL : 0;

            if(DXp == DXm)
            {
                DXm = 0;
                DXp = 0;
            }
            else
            {
                if (DXp &amp;gt; DXm)
                    DXm = 0;

                if (DXm &amp;gt; DXp)
                    DXp = 0;
            }

            list.Add(Math.Abs(candle.HighPrice - candle.LowPrice));
            list.Add(Math.Abs(candle.HighPrice - _prevCandle.ClosePrice));
            list.Add(Math.Abs(candle.LowPrice - _prevCandle.ClosePrice));

            _prevCandle = candle;

            TR = list.Max();

            list.Clear();

            TR = TRPpast - TRPpast/Length + TR/Length;

            TRPpast = TR;

            if(TR == 0)
            {
                DXp = 0;
                DXm = 0;
                Dlp = Dlp - Dlp/Length + DXp/Length;
                Dlm = Dlm - Dlm/Length + DXm/Length;
            }
            else
            {
                Dlp = Dlp - Dlp/Length + DXp/Length;
                Dlm = Dlm - Dlm/Length + DXm/Length;
                Dlpp = Dlp/TR*100;
                DLmm = Dlm/TR*100;
            }
        }

        public void UpDate(Candle candle)
        {
            dH = candle.HighPrice - _prevCandle.HighPrice;

            dL = _prevCandle.LowPrice - candle.LowPrice;

            DXp = dH &amp;gt; 0 ? dH : 0;

            DXm = dL &amp;gt; 0 ? dL : 0;

            if (DXp == DXm)
            {
                DXm = 0;
                DXp = 0;
            }
            else
            {
                if (DXp &amp;gt; DXm)
                    DXm = 0;

                if (DXm &amp;gt; DXp)
                    DXp = 0;
            }

            list.Add(Math.Abs(candle.HighPrice - candle.LowPrice));
            list.Add(Math.Abs(candle.HighPrice - _prevCandle.ClosePrice));
            list.Add(Math.Abs(candle.LowPrice - _prevCandle.ClosePrice));

            TR = list.Max();

            list.Clear();

            TR = TRPpast - TRPpast / Length + TR / Length;

            if (TR == 0)
            {
                DXp = 0;
                DXm = 0;
                var dlp = Dlp - Dlp / Length + DXp / Length;
                var dlm = Dlm - Dlm / Length + DXm / Length;
            }
            else
            {
                var dlp = Dlp - Dlp / Length + DXp / Length;
                var dlm = Dlm - Dlm / Length + DXm / Length;
                Dlpp = dlp / TR * 100;
                DLmm = dlm / TR * 100;
            }
        }
[/h]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;    }</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/19590/</id>
    <title type="text">Обнаружил, что способ расчета DiPlus, DiMinus и, как следствие, ADX, не совпадает с описываемым тут ...</title>
    <published>2012-06-07T22:12:58Z</published>
    <updated>2012-06-07T22:12:58Z</updated>
    <author>
      <name>Sergey Sokolov</name>
      <uri>https://stocksharp.ru/users/6014/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Обнаружил, что способ расчета DiPlus, DiMinus и, как следствие, ADX, не совпадает с описываемым &lt;a target="_blank" rel="nofollow" href="http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_" title="http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_directional_"&gt;тут&lt;/a&gt; а также со значениями из как минимум 2 программ теханализа (WLD, AlfaDirect). &lt;br /&gt;После моего фикса считает правильно. &lt;br /&gt;&lt;br /&gt;Единственным исправлением было использование параметров по умолчанию у AverageTrueRange при расчете DiPart. (+удаление неиспользуемого DmTrueRange)&lt;br /&gt;Было:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
protected DiPart()
{
    _averageTrueRange = new AverageTrueRange(new ExponentialMovingAverage(), new DmTrueRange());
    _movingAverage = new WilderMovingAverage();
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Стало:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
protected DiPart()
{
    _averageTrueRange = new AverageTrueRange();
    _movingAverage = new WilderMovingAverage();
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;в связи с чем у меня вопрос:&lt;br /&gt;Это вообще баг или расчет +-DI/ADX намеренно выполняется с использованием нестандартных параметров?&lt;br /&gt;Если это не баг, то каким образом коммитить фикс? Как отдельный индикатор?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>