<function>
 <description>Направленное движение</description>
 <description_en>Directional Movement</description_en>
 <code>function MathAbs(x)
{
  if(x&lt;0) 
    return -x;
  else
    return +x;
}

function DirMovement(
        PriceValueH /*серия*/,
        PriceValueL /*серия*/,
        PriceValueC /*серия*/,
        Len  /*число*/,
        o /*числа*/
/*
        DMIPlus число
        DMIMinus число
        DMI число
        ADX число или серия
         число
        Volty число серия
*/
        )

{
    var var4 = 0;
    var var5 = 0;
    var var6 = 0;

    if (o.TRC   == undefined) { o.TRC   = new Series(ctx); }
    if (o.var7  == undefined) { o.var7  = new Series(ctx); }
    if (o.var8  == undefined) { o.var8  = new Series(ctx); }
    if (o.Volty == undefined) { o.Volty = new Series(ctx); }
    if (o.ADX   == undefined) { o.ADX   = new Series(ctx); }
    if (o.ADXR  == undefined) { o.ADXR  = new Series(ctx); }
    if (o.Cum   == undefined) { o.Cum   = new Series(ctx); }
    
    var cur=CurrentBar-Len;

    TrueRange(o.TRC, PriceValueH, PriceValueL, PriceValueC);

    if(cur &lt; 0)
    {
        o.Volty[0]=0;
        return;
    }
    else if(cur == 0)
    {
        for(Value1 = 0; Value1&lt;Len; Value1++)
        {
            var var0 = 0 ;
            var var1 = 0 ;
            var var2 = PriceValueH.at(Value1)     - PriceValueH.at(Value1 + 1);
            var var3 = PriceValueL.at(Value1 + 1) - PriceValueL.at(Value1);
            if(var2 > var3 &amp;&amp; var2 > 0)
                var0 = var2;
            else  if(var3 > var2 &amp;&amp; var3 > 0)
                    var1 = var3 ;
            var4 += var0 ;
            var5 += var1 ;
            var6 += o.TRC.at(Value1);
        }
        o.var7.setAt(0, var4 / Len);
        o.var8.setAt(0, var5 / Len);
        o.Volty.setAt(0, var6 / Len);
    }
    else
    {
        var var0 = 0;
        var var1 = 0;
        var var2 = PriceValueH.at(0) - PriceValueH.at(1);
        var var3 = PriceValueL.at(1) - PriceValueL.at(0);
        if(var2 > var3 &amp;&amp; var2 > 0)
            var0 = var2;
        else if(var3 > var2 &amp;&amp; var3 > 0)
                var1 = var3;        
        o.var7.setAt(0, o.var7.at(1)  + (var0 - o.var7.at(1))/Len);
        o.var8.setAt(0, o.var8.at(1)  + (var1 - o.var8.at(1))/Len);
        o.Volty.setAt(0, o.Volty.at(1) + (o.TRC.at(0) - o.Volty.at(1))/Len);
    }

    if(o.Volty.at(0) > 0)
    {
        o.DMIPlus  = 100 * o.var7.at(0) / o.Volty.at(0);
        o.DMIMinus = 100 * o.var8.at(0) / o.Volty.at(0);
    }
    else
    {
        o.DMIPlus  = 0;
        o.DMIMinus = 0;
    }


    if(o.DMIPlus + o.DMIMinus > 0)
    {
        o.DMI = 100 * MathAbs(o.DMIPlus - o.DMIMinus) / (o.DMIPlus + o.DMIMinus);
    }
    else
    {
        o.DMI = 0;
    }

    if(cur &lt; Len)
    {
        if(cur==0)
        {
            o.Cum.setAt(0, o.DMI);
        }
        else
        {
            o.Cum.setAt(0, o.Cum.at(1)+o.DMI);
        }
        
        o.ADX.setAt(0, o.Cum.at(0) / (cur+1));
        o.ADXR.setAt(0, ( o.ADX.at(0) + o.ADX.at(cur+1) ) * 0.5);
    }
    else
    {
        o.ADX.setAt(0, o.ADX.at(1) + (o.DMI - o.ADX.at(1))/Len);
        o.ADXR.setAt(0, (o.ADX.at(0) + o.ADX.at(Len - 1) ) * 0.5); 
    }
}
</code>
</function>
