﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Тип свечи RangeUS, с дополнительным параметром для разворота</title>
  <id>~/topic/7018/tip-svechi-rangeus-s-dopolnitelnym-parametrom-dlya-razvorota/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-05T01:25:50Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=7018" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/37710/</id>
    <title type="text">[img=104043]RangeUS.png[/img] Пока изучаю систему, буду писать полезные статьи, вроде этой. Если меш...</title>
    <published>2016-12-27T16:08:39Z</published>
    <updated>2016-12-27T16:08:39Z</updated>
    <author>
      <name>gem81</name>
      <uri>https://stocksharp.com/users/62541/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;[img=104043]RangeUS.png[/img]&lt;/p&gt;
&lt;p&gt;Пока изучаю систему, буду писать полезные статьи, вроде этой.
Если мешают, то напишите в коммент, Перестану))))
Что требуется: S#.API + понимание платформы.&lt;/p&gt;
&lt;p&gt;И так. В основе классический рендж бар, но с дополнительным параметром ReverseSize (разворотный размер).
Размеры указываются в шагах цены. На картинке сбербанк с параметрами 10/30 шагов(PriceStep)&lt;/p&gt;
&lt;p&gt;Как добавить на график.
[code=cs]
....
_series = new CandleSeries(typeof(RangeUSCandle), sec, new RangeUSArgs { RangeSize = (decimal)sec.PriceStep * 10, ReverseSize= (decimal)sec.PriceStep * 30 });
....
_candleManager = new CandleManager(client);
_candleManager.Sources.Add(new RangeUSCandleBuilder { Sources = { new TradeCandleBuilderSource(client) } });
....
_candleManager.Start(_series);
[/code]&lt;/p&gt;
&lt;p&gt;Сам код свечи и билдера
Создайте новый класс в проекте, назовите его RangeUSCandle.cs например
[code=cs]
using Ecng.Collections;
using Ecng.Common;
using Ecng.ComponentModel;&lt;/p&gt;
&lt;p&gt;using System;
using System.Collections.Generic;
using System.Linq;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Localization;&lt;/p&gt;
&lt;p&gt;namespace НазваниеВашегоПроекта
{
public class RangeUSArgs
{
public decimal RangeSize;
public decimal ReverseSize;
}
public enum RangeUSTrend&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Описание свечи
/// &amp;lt;/summary&amp;gt;
public class RangeUSCandle : Candle
{
    public override object Arg
    {
        get
        {
            return this.PriceRange;
        }
        set
        {
            this.PriceRange = (RangeUSArgs)value;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Параметры свечи
    /// &amp;lt;/summary&amp;gt;
    public RangeUSArgs PriceRange { get; set; }
    /// &amp;lt;summary&amp;gt;
    /// Текущий тренд. Значения: 1 восходящий, 2 нисходящий, 0 при инициации.
    /// &amp;lt;/summary&amp;gt;
    public RangeUSTrend Trend;  
    public override Candle Clone()
    {
        return CopyTo(new RangeUSCandle());
    }
}

/// &amp;lt;summary&amp;gt;
/// Построитель RangeUS свечей
/// &amp;lt;/summary&amp;gt;
public class RangeUSCandleBuilder : CandleBuilder&amp;lt;RangeUSCandle&amp;gt;
{
    public RangeUSCandleBuilder()
    {
    }

    public RangeUSCandleBuilder(ICandleBuilderContainer container)
        : base(container)
    {
    }

    public override IEnumerable&amp;lt;Range&amp;lt;DateTimeOffset&amp;gt;&amp;gt; GetSupportedRanges(CandleSeries series)
    {
        var ranges = base.GetSupportedRanges(series).ToArray();

        if (!ranges.IsEmpty())
        {
            if (!(series.Arg is RangeUSArgs))
                throw new ArgumentException(LocalizedStrings.WrongCandleArg.Put(series.Arg), nameof(series));

            if (((RangeUSArgs)series.Arg).RangeSize &amp;lt;= 0)
                throw new ArgumentOutOfRangeException(nameof(series), series.Arg, LocalizedStrings.PriceRangeMustBeGreaterThanZero);
        }

        return ranges;
    }

    protected override RangeUSCandle CreateCandle(CandleSeries series, ICandleBuilderSourceValue value)
    {
        // требуется перенести в новую свечу, понимание текущего направления.
        RangeUSTrend trend_value;
        if (CandleManager.GetCandleCount(series) &amp;gt; 0)
        {
            trend_value = CandleManager.GetCurrentCandle&amp;lt;RangeUSCandle&amp;gt;(series).Trend;
        } else {
            trend_value = RangeUSTrend.None;
        }
        return FirstInitCandle(series, new RangeUSCandle
        {
            PriceRange = (RangeUSArgs)series.Arg,
            OpenTime = value.Time,
            CloseTime = value.Time,
            HighTime = value.Time,
            LowTime = value.Time,
            Trend = trend_value,
        }, value);
    }

    protected override bool IsCandleFinishedBeforeChange(CandleSeries series, RangeUSCandle candle, ICandleBuilderSourceValue value)
    {
        var cm = CandleManager;
        var prev_candle = CandleHelper.GetCandle&amp;lt;RangeUSCandle&amp;gt;(cm,series,cm.GetCandleCount(series)-1);
        if(cm.GetCandleCount(series) &amp;lt;= 1)
        {
            // первая свеча. пытаемся понять направление
            candle.Trend = (candle.OpenPrice &amp;gt; value.Price) ? RangeUSTrend.DownTrend : RangeUSTrend.UpTrend;
            return candle.LowPrice + candle.PriceRange.RangeSize &amp;lt;= candle.HighPrice; //
        }
        if (candle.Trend == RangeUSTrend.UpTrend &amp;amp;&amp;amp; value.Price &amp;gt; candle.OpenPrice)
        {
            return candle.OpenPrice + candle.PriceRange.RangeSize &amp;lt;= candle.HighPrice; //
        }
        if (candle.Trend == RangeUSTrend.DownTrend &amp;amp;&amp;amp; value.Price &amp;lt; candle.OpenPrice)
        {
            return candle.OpenPrice - candle.PriceRange.RangeSize &amp;gt;= candle.LowPrice; //
        }
        var needReverse = candle.GetBody() &amp;gt; candle.PriceRange.ReverseSize; // 
        if (needReverse)
        {
            candle.Trend = (candle.Trend != RangeUSTrend.None &amp;amp; candle.Trend == RangeUSTrend.UpTrend) ? candle.Trend = RangeUSTrend.DownTrend : candle.Trend = RangeUSTrend.UpTrend;
        }
        return needReverse;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}
[/code]&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>