﻿<?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">Ошибка при использование CandleBuilder.Contaimer</title>
  <id>~/topic/3131/oshibka-pri-ispolzovanie-candlebuilder_contaimer/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-14T21:07:51Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3131" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/22521/</id>
    <title type="text">на 4.1.6 воспроизводится. public class RangeHLCandleBuilder : CandleBuilder { private decimal prevCl...</title>
    <published>2012-11-14T16:02:14Z</published>
    <updated>2012-11-14T16:02:14Z</updated>
    <author>
      <name>Tauler</name>
      <uri>https://stocksharp.com/users/26822/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">на 4.1.6 воспроизводится.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
public class RangeHLCandleBuilder : CandleBuilder&amp;lt;RangeHLCandle&amp;gt;
    {
        private decimal prevClose = 0;
        public RangeHLCandleBuilder()
        {
            this.Container.ValuesKeepTime = new TimeSpan(1,0,0,0);
        }

        public RangeHLCandleBuilder(ICandleBuilderContainer container) : base(container)
        {}

        protected override RangeHLCandle CreateCandle(StockSharp.Algo.Candles.CandleSeries series, ICandleBuilderSourceValue value)
        {
            RangeHLCandle candle = new RangeHLCandle
                                       {
                                           Range = (decimal) series.Arg
                                       };
            FirstInitCandle(series, candle, value);
            

            candle.OpenTime = value.Time;
            candle.CloseTime = value.Time;
            candle.LowTime = value.Time;

            if (prevClose == 0)
                return candle;

            candle.OpenPrice = prevClose;

            this.AddInfoLog(String.Format(&amp;quot;Created, Open = {0}&amp;quot;, candle.OpenPrice));
            return candle;
        }

        public override IEnumerable&amp;lt;Range&amp;lt;DateTime&amp;gt;&amp;gt; GetSupportedRanges(CandleSeries series)
        {
            IEnumerable&amp;lt;Range&amp;lt;DateTime&amp;gt;&amp;gt; supportedRanges = base.GetSupportedRanges(series);

            if (!supportedRanges.IsEmpty())
            {
                if (!(series.Arg is decimal))
                {
                    throw new ArgumentException();
                }
                if (((decimal)series.Arg) &amp;lt;= 0)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }
            return supportedRanges;
        }

        protected override bool IsCandleFinishedBeforeChange(CandleSeries series, RangeHLCandle candle, ICandleBuilderSourceValue value)
        {
            int i = this.Container.GetValues(series, candle).Count();
            if (i == 0)
            {
                int k = 2/i; //проверка на дефект
            }

            bool firstCandle = ((candle.HighPrice - candle.LowPrice) &amp;gt; (decimal) candle.Arg) &amp;amp;&amp;amp;
                               (series.GetCandles&amp;lt;RangeHLCandle&amp;gt;().Count() == 1);
            bool nextCandle = (Math.Abs(candle.OpenPrice - candle.ClosePrice) &amp;gt;= (decimal) candle.Arg) &amp;amp;&amp;amp;
                               (series.GetCandles&amp;lt;RangeHLCandle&amp;gt;().Count() &amp;gt; 1);

            bool byDate = candle.LowTime.Date != candle.CloseTime.Date;

            if ( firstCandle || nextCandle || byDate)
                {
                    prevClose = candle.ClosePrice;
                    return true;
                }
            

            return false;
        }

        protected override void UpdateCandle(CandleSeries series, RangeHLCandle candle, ICandleBuilderSourceValue value)
        {
            base.UpdateCandle(series, candle, value);

            candle.LowTime = candle.CloseTime;
            candle.CloseTime = value.Time;

        }

    }&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;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
 public static List&amp;lt;Trade&amp;gt; MakeDealsFromHistory(string file)
        {
            List&amp;lt;Trade&amp;gt; trades = new List&amp;lt;Trade&amp;gt;();
            using (StreamReader sr = new StreamReader(file))
            {
                String line;
                int i = 0;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line == &amp;quot;&amp;lt;TICKER&amp;gt;;&amp;lt;PER&amp;gt;;&amp;lt;DATE&amp;gt;;&amp;lt;TIME&amp;gt;;&amp;lt;CLOSE&amp;gt;;&amp;lt;VOL&amp;gt;&amp;quot;)
                        continue;
                    i++;
                    string[] lines = line.Split(&amp;#39;;&amp;#39;);
                    Trade trade = new Trade
                    {
                        Id = i,
                        Price = Convert.ToDecimal(lines[4]),
                        Volume = Convert.ToInt32(lines[5])
                    };
                    trade.Time = new DateTime(Convert.ToInt32(lines[2].Substring(0, 4)),
                                              Convert.ToInt32(lines[2].Substring(4, 2)),
                                              Convert.ToInt32(lines[2].Substring(6, 2)),
                                              Convert.ToInt32(lines[3].Substring(0, 2)),
                                              Convert.ToInt32(lines[3].Substring(2, 2)),
                                              Convert.ToInt32(lines[3].Substring(4, 2))
                                              );

                    trades.Add(trade);
                }
            }
            return trades;
        }&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;файл со сделками прикреплю к посту.&lt;br /&gt;Заметил, что с Container.ValuesKeepTime равным дню свечи очень долго строятся. Чем меньше Container.ValuesKeepTime, тем быстрее строятся. на Container.ValuesKeepTime = 1 минута баг возникает очень быстро.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22520/</id>
    <title type="text">Тогда проверьте на 4.1.6 с ValuesKeepTime = 1 дню Если тоже самое - кидайте код своего билдера свече...</title>
    <published>2012-11-14T15:21:29Z</published>
    <updated>2012-11-14T15:21:29Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Тогда проверьте на 4.1.6 с ValuesKeepTime = 1 дню&lt;br /&gt;Если тоже самое - кидайте код своего билдера свечек</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22519/</id>
    <title type="text">Это было на 4.1.4 ,свечи - кастомные.</title>
    <published>2012-11-14T15:10:40Z</published>
    <updated>2012-11-14T15:12:22Z</updated>
    <author>
      <name>Tauler</name>
      <uri>https://stocksharp.com/users/26822/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Это было на 4.1.4 ,свечи - кастомные.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22494/</id>
    <title type="text">Это на 4.1.6? Если нет - проверьте там. А какие свечи строите? И если ValuesKeepTime = 1 дню (или по...</title>
    <published>2012-11-13T20:08:37Z</published>
    <updated>2012-11-13T20:08:37Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Это на 4.1.6? Если нет - проверьте там.&lt;br /&gt;&lt;br /&gt;А какие свечи строите? И если ValuesKeepTime = 1 дню (или по крайней мере больше чем таймфрейм построения свечей).</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22491/</id>
    <title type="text">Возникает i=0 в процессе построения свечей в , используя в качестве источника RawConvertableCandleBu...</title>
    <published>2012-11-13T19:42:03Z</published>
    <updated>2012-11-13T19:43:47Z</updated>
    <author>
      <name>Tauler</name>
      <uri>https://stocksharp.com/users/26822/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Возникает i=0 в процессе построения свечей в , используя в качестве источника RawConvertableCandleBuilderSource&amp;lt;Trade&amp;gt;&lt;br /&gt;сделки в этом источнике созданы из текстового файла, их много (история за 5 дней, самих сделок больше полумиллиона)&lt;br /&gt;&lt;br /&gt;Используется стандартный CandleBuilderContaine, Container.ValuesKeepTime &amp;gt;0 (ставил и 10 секунд, и минуту)&lt;br /&gt;&lt;br /&gt;i=0 становится в середине процесса построения свечей.&lt;br /&gt;&lt;br /&gt;А какой лог Вы имеете ввиду?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22490/</id>
    <title type="text">Приведите лог когда i = 0, в каких ситуациях это возникает - тестирование на истории, торговля, .......</title>
    <published>2012-11-13T19:05:17Z</published>
    <updated>2012-11-13T19:05:17Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Приведите лог когда i = 0, в каких ситуациях это возникает - тестирование на истории, торговля, ....&lt;br /&gt;&lt;br /&gt;Используется стандартный CandleBuilderContainer? Container.ValuesKeepTime чему равен?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/22184/</id>
    <title type="text">Коллеги, в методе CandleBuilder.IsCandleFinishedBeforeChange(..) есть строки вида IList data = Conta...</title>
    <published>2012-10-31T21:15:10Z</published>
    <updated>2012-10-31T21:15:10Z</updated>
    <author>
      <name>Tauler</name>
      <uri>https://stocksharp.com/users/26822/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Коллеги,&lt;br /&gt;&lt;br /&gt;в методе CandleBuilder.IsCandleFinishedBeforeChange(..)&lt;br /&gt;есть строки вида&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
IList&amp;lt;ICandleBuilderSourceValue&amp;gt; data = Container.GetValues(series, candle).ToList();
int i = data.Count;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Непонятно по какой причине иногда (точно не скажу при каких условиях, сделок очень много строитель обрабатывает),&lt;br /&gt;i получается равным 0 , но это же неверно, так как если мы дошли до вызова метода IsCandleFinishedBeforeChange(..), значит был вызов CreateCandle, значит свечка из чего то же сформировалась (то есть была минимум одна сделка)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>