﻿<?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">Тип свечи 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-05-03T07:16:44Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=7018" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/37710/</id>
    <title type="text">RangeUS.png Пока изучаю систему, буду писать полезные статьи, вроде этой. Если мешают, то напишите в...</title>
    <published>2016-12-27T16:08:39Z</published>
    <updated>2016-12-27T16:08:39Z</updated>
    <author>
      <name>gem81</name>
      <uri>https://stocksharp.ru/users/62541/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;a href='https://stocksharp.ru/file/104043/RangeUS.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/104043/RangeUS.png?size=800x800" alt="RangeUS.png" title="RangeUS.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Пока изучаю систему, буду писать полезные статьи, вроде этой.&lt;br /&gt;Если мешают, то напишите в коммент, Перестану))))&lt;br /&gt;Что требуется: S#.API + понимание платформы.&lt;br /&gt;&lt;br /&gt;И так. В основе классический рендж бар, но с дополнительным параметром ReverseSize (разворотный размер).&lt;br /&gt;Размеры указываются в шагах цены. На картинке сбербанк с параметрами 10/30 шагов(PriceStep)&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;

....
                _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);
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Сам код свечи и билдера&lt;br /&gt;Создайте новый класс в проекте, назовите его RangeUSCandle.cs например&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;

using Ecng.Collections;
using Ecng.Common;
using Ecng.ComponentModel;

using System;
using System.Collections.Generic;
using System.Linq;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Localization;

namespace НазваниеВашегоПроекта
{
    public class RangeUSArgs
    {
        public decimal RangeSize;
        public decimal ReverseSize;
    }
    public enum RangeUSTrend
    {
         None = 0,
         UpTrend = 1,
         DownTrend = 2
    }

    /// &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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>