﻿<?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">CandleSeries и WeightedIndexSecurity</title>
  <id>~/topic/3245/candleseries-i-weightedindexsecurity/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-30T05:15:39Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3245" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/23010/</id>
    <title type="text">Проверил. Новые данные поступают, но var _seriesCount = _series.GetCandleCount(); всё равно получает...</title>
    <published>2012-12-17T18:13:23Z</published>
    <updated>2012-12-17T18:13:40Z</updated>
    <author>
      <name>Algonavt</name>
      <uri>https://stocksharp.ru/users/639/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Проверил. Новые данные поступают, но &lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
var _seriesCount = _series.GetCandleCount();&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; всё равно получает 0.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22999/</id>
    <title type="text">Данные - накопленная в Квике информация по сделкам в текущей сессии, которые поступают сразу после с...</title>
    <published>2012-12-17T12:50:08Z</published>
    <updated>2012-12-17T12:50:08Z</updated>
    <author>
      <name>Algonavt</name>
      <uri>https://stocksharp.ru/users/639/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Данные - накопленная в Квике информация по сделкам в текущей сессии, которые поступают сразу после старта стратегии + все новые данные (по мере формирования свечей). Обрабатываются ли новые данные (т.е. по свечам, сфирмированным после старта стратегии) проверю сегодня вечером.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22990/</id>
    <title type="text">Проверяете, так понимаю, на исторических данных?</title>
    <published>2012-12-17T10:38:28Z</published>
    <updated>2012-12-17T10:38:28Z</updated>
    <author>
      <name>esper</name>
      <uri>https://stocksharp.ru/users/5990/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Проверяете, так понимаю, на исторических данных?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22978/</id>
    <title type="text">Умеет ли CandleSeries работать с BasketSecurity и его производными (например, WeightedIndexSecurity)...</title>
    <published>2012-12-16T20:19:45Z</published>
    <updated>2012-12-16T20:19:45Z</updated>
    <author>
      <name>Algonavt</name>
      <uri>https://stocksharp.ru/users/639/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Умеет ли CandleSeries работать с BasketSecurity и его производными (например, WeightedIndexSecurity)? Теста ради написал простой обработчик свечек (см. ниже). Если в этом коде в строке &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(TimeFrameCandle), Security, TimeFrame)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; в качестве Security использовать WeightedIndexSecurity, то _series всегда будет пустым. При этом новые свечки в обработчик приходят исправно, и строка _message заполняется данными, которые выводятся в лог. SMA также рассчиывается (под отладчиком видно некоторые осмысленные значения), однако корректность расчета пока не проверял - для начала хочется уяснить про CandleSeries.&lt;br /&gt;&lt;br /&gt;Если в качестве Security указать обыкновенный инструмент (т.е. StockSharp.BusinessEntities.Security) - _candles заполняется отлично.&lt;br /&gt;&lt;br /&gt;Вопрос: умеет ли CandleSeries работать с WeightedIndexSecurity? Для чего это надо - например, к арбитражной стратегии прикрутить скользящую среднюю. Удобнее всего это делать через свечки, да и унификации хочется с кодом, который работает с единичными инструментами.&lt;br /&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;
class WeightedSmaCandleStrategy : BasePortfolioStrategy
    {
        public TimeSpan TimeFrame { get; set; }
        public int Length;

        private CandleSeries _series;
        DateTime strategyStartTime;
        private SimpleMovingAverage Sma;

        protected override void OnStarted()
        {
            if (TimeFrame == null)
                throw new ApplicationException(&amp;quot;Не задан таймфрейм!&amp;quot;);
            if (Length &amp;lt;= 0)
                throw new ApplicationException(&amp;quot;Не задан период скользящей средней!&amp;quot;);

            strategyStartTime = DateTime.Now;

            base.OnStarted();

            Sma = new SimpleMovingAverage() { Length = Length };

            _series = new CandleSeries(typeof(TimeFrameCandle), Security, TimeFrame);  // Если Security - это WeightedIndexSecurity, то _series не заполняется
            _series.WorkingTime = WorkingTime;

            _series
                .WhenCandlesFinished()
                .Do(ProcessCandle)
                .Apply(this);

            TraderBuilder.CandleManager.Start(_series);
        }

        private void ProcessCandle(Candle candle)
        {
            // если наша стратегия в процессе остановки
            if (ProcessState == ProcessStates.Stopping)
            {
                // отменяем активные заявки
                CancelActiveOrders();

                return;
            }

            bool _canTrade = true;

            Sma.Process(candle);

            string _message;
            // Исторические свечки просто запоминаем
            if (candle.CloseTime &amp;lt; StartedTime)
            {
               _message = string.Format(&amp;quot;Историческая свечка: Time: {0} O:{1} H:{1} L:{2} C:{3}&amp;quot;, candle.OpenTime, candle.OpenPrice, candle.HighPrice, candle.LowPrice, candle.ClosePrice);
                _canTrade = false;
                //return;
            }
            else
                _message = string.Format(&amp;quot;Реальная свечка: Time: {0} O:{1} H:{1} L:{2} C:{3}&amp;quot;, candle.OpenTime, candle.OpenPrice, candle.HighPrice, candle.LowPrice, candle.ClosePrice);

            var _seriesCount = _series.GetCandleCount();  // В случае с WeightedIndexSecurity здесь всегда возвращается 0
            var _smaValue = Sma.GetCurrentValue();
            if (_seriesCount &amp;lt; Length)
            {
                //this.AddInfoLog(string.Format(&amp;quot;GetCandleCount &amp;lt; Length. GetCandleCount = {0} Length = {1}&amp;quot;, _seriesCount, Length));
                //return;
                _canTrade = false;
            }
            else
            {
                _message = string.Concat(_message, string.Format(&amp;quot; SMA={0}&amp;quot;, _smaValue));
            }

            this.AddInfoLog(_message);

            var _previousCandle = _series.GetCandle&amp;lt;TimeFrameCandle&amp;gt;(1);
            if (_previousCandle != null)
            {
                if (candle.ClosePrice &amp;gt; _smaValue &amp;amp;&amp;amp; _previousCandle.ClosePrice &amp;lt; _smaValue)
                {
                    this.AddInfoLog(&amp;quot;Пересечение снизу! CC={0} PC={1} SMA={2}&amp;quot;, candle.ClosePrice, _previousCandle.ClosePrice, _smaValue);
                    if (_canTrade)
                    {
                        var _buyOrder = new Order()
                        {
                            Type = OrderTypes.Market,
                            Direction = OrderDirections.Buy,
                            Volume = Position != 0 ? 2 : 1
                        };
                  
                        RegisterOrder(_buyOrder);
                    }
                }

                if (candle.ClosePrice &amp;lt; _smaValue &amp;amp;&amp;amp; _previousCandle.ClosePrice &amp;gt; _smaValue)
                {
                    this.AddInfoLog(&amp;quot;Пересечение сверху! CC={0} PC={1} SMA={2}&amp;quot;, candle.ClosePrice, _previousCandle.ClosePrice, _smaValue);
                    if (_canTrade)
                    {
                        var _sellOrder = new Order()
                        {
                            Type = OrderTypes.Market,
                            Direction = OrderDirections.Sell,
                            Volume = Position != 0 ? 2 : 1
                        };

                        RegisterOrder(_sellOrder);
                    }
                }
            }
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>