﻿<?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">Вопросы по уроку. Определение времени предпоследней свечи</title>
  <id>~/topic/3648/voprosy-po-uroku_-opredelenie-vremeni-predposlednei-svechi/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-21T08:40:55Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3648" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/25670/</id>
    <title type="text">В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привязки стратеги...</title>
    <published>2013-04-29T14:54:24Z</published>
    <updated>2013-06-23T15:40:13Z</updated>
    <author>
      <name>UsilaDobry</name>
      <uri>https://stocksharp.com/users/28825/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привязки стратегии к реальному времени?
Поясните мне смысл этой строки&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Получается временной период как-то зависит от инструмента? У каждого инструмента свой временной период? Тогда бы реальное время было разное... Я вот не пойму какая связь между временным периодом и инструментом...&lt;/p&gt;
&lt;p&gt;Прошу пояснить первое условие в этой строке&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; _parabolic.IsFormed &amp;amp;&amp;amp; candle.State == CandleStates.Finished)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;если время открытия полученной свечи больше или равно времени предпоследней свечи... Разве может быть время открытия последней меньше предпоследней? Они поступаю в стратегию на обработку по очереди...&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/25718/</id>
    <title type="text">UsilaDobry: Т.е. если в OnStarted() написать _candleSeries.WhenCandlesFinished() .Do(()=&amp;gt;{ _candleSe...</title>
    <published>2013-05-01T17:21:58Z</published>
    <updated>2013-05-01T17:21:58Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25713)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Т.е. если в OnStarted() написать&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;_candleSeries.WhenCandlesFinished()
.Do(()=&amp;gt;{
_candleSeries.GetCandle(1);
MainAlgorithm();
}).Apply(this)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; то в основном алгоритме можно не вызывать метод  _candleSeries.GetCandle(1);?
&amp;gt; или в этом правиле даже не надо указывать метод _candleSeries.GetCandle(1);?, т.е.
&amp;gt; 
&amp;gt; ```csharp
_candleSeries.WhenCandlesFinished()
             .Do(MainAlgorithm) 
             .Apply(this)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Так конечно не заработает.
Вариантов много, программирование это творческая работа, например можно так:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;protected override void OnStarted()
        {
            //подписываемся на событие изменения индикатора
           // _sma.Changed += MainAlgorithm;

            _candleSeries.WhenCandlesFinished()
                         .Do(candle =&amp;gt;
                             {
                                 // Обработать завершенную свечу candle
                             })
                         .Apply();

            base.OnStarted();
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;если надо получать предпоследнюю свечу, то нужно будет делать как-то специально, например даже так _candleSeries.GetCandle(1)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25713)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Я думаю проверка candle.OpenTime &amp;gt;= time необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой.
А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна.
Согласен, если пользователь робота будет дожидаться когда пройдут исторические данные, и только тогда запустит торговый алгоритм.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/25713/</id>
    <title type="text">IvanB: UsilaDobry: Зачем городить для этого этот код... Более того, можно использовать правило _cand...</title>
    <published>2013-05-01T16:27:16Z</published>
    <updated>2013-05-01T16:27:49Z</updated>
    <author>
      <name>UsilaDobry</name>
      <uri>https://stocksharp.com/users/28825/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25701)" rel="nofollow" target="_blank"&gt;IvanB&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25698)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Зачем городить для этого этот код...
Более того, можно использовать  правило _candleSeries.WhenCandlesFinished() и он же передает завершенную свечу, т.е. не надо специально получать свечи.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;Т.е. если в OnStarted() написать&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_candleSeries.WhenCandlesFinished()
             .Do(()=&amp;gt;{
                      _candleSeries.GetCandle(1);
                      MainAlgorithm(); 
           }).Apply(this)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;то в основном алгоритме можно не вызывать метод  _candleSeries.GetCandle(1);?
или в этом правиле даже не надо указывать метод _candleSeries.GetCandle(1);?, т.е.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_candleSeries.WhenCandlesFinished()
             .Do(MainAlgorithm) 
             .Apply(this)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;НО, без проверки:
candle.OpenTime &amp;gt;= time
никак не обойтись, иначе при запуске стратегии, наш алгоритм отработается на старых свечах и такое наторгует.....&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Я думаю проверка candle.OpenTime &amp;gt;= time необходима в случае, если мы одновременно запускаем вывод на график и стратегию, например одной кнопкой.
А если мы сначала одной кнопкой запускаем график, а потом второй кнопкой стартует наша стратегия, то такая проверка не нужна.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/25701/</id>
    <title type="text">UsilaDobry: Зачем городить для этого этот код... Более того, можно использовать правило _candleSerie...</title>
    <published>2013-05-01T05:16:26Z</published>
    <updated>2013-05-01T05:18:08Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25698)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Зачем городить для этого этот код...
Более того, можно использовать  правило _candleSeries.WhenCandlesFinished() и он же передает завершенную свечу, т.е. не надо специально получать свечи. НО, без проверки:
candle.OpenTime &amp;gt;= time
никак не обойтись, иначе при запуске стратегии, наш алгоритм отработается на старых свечах и такое наторгует.....&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/25698/</id>
    <title type="text">IvanB: Дело в том, что мы должны пропускать только последние свечи чтобы наша стратегия работала, ис...</title>
    <published>2013-05-01T04:42:41Z</published>
    <updated>2013-05-01T04:45:46Z</updated>
    <author>
      <name>UsilaDobry</name>
      <uri>https://stocksharp.com/users/28825/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25689)" rel="nofollow" target="_blank"&gt;IvanB&lt;/a&gt;:&lt;/strong&gt;
Дело в том, что мы должны пропускать только последние свечи чтобы наша стратегия работала, исторические свечи, например, которые были час назад нас (например при таймфрейме 1 мин.) не устраивают, ведь, при запуске получения свечей мы начинаем получать все свечи, котрые доступны системе, в том числе и историчсески, т.е. те, которые прошли например час назад (если говорим о таймфрейме, например, в 1 минуту.).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Зачем городить для этого этот код:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        ```csharp

        var candle = _candleSeries.GetCurrentCandle&amp;lt;TimeFrameCandle&amp;gt;();

        var timeFrame = (TimeSpan) candle.Arg;
        
        var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;
        
        if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; _parabolic.IsFormed &amp;amp;&amp;amp; candle.State == CandleStates.Finished)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
Можно просто указать в основном алгоритме

            ```csharp
var candle = _candleSeries.GetCandle&amp;lt;TimeFrameCandle&amp;gt;(1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А основной алгоритм запускать по правилу&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        ```csharp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;_candleSeries.WhenCandlesStarted()
.Do(MainAlgorithm)
.Apply(this);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/25689/</id>
    <title type="text">UsilaDobry: В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привя...</title>
    <published>2013-04-30T16:16:50Z</published>
    <updated>2013-04-30T16:16:50Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25670)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
В алгоритме SMAStrategy мы определяем время предпоследней свечи. Зачем? Только для привязки стратегии к реальному времени?
Поясните мне смысл этой строки&lt;/p&gt;
&lt;p&gt;var time = timeFrame.GetCandleBounds(Security).Min - timeFrame;
Здесь мы получаем левую границу времени текущей свечи:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;timeFrame.GetCandleBounds(Security).Min
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;и затем из нее вычитаем таймфрейм свечи. чтобы получить левую временную границу предыдущей свечи.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25670)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Получается временной период как-то зависит от инструмента? У каждого инструмента свой временной период? Тогда бы реальное время было разное... Я вот не пойму какая связь между временным периодом и инструментом...
Если взглянуть на реализацию этого метода (&lt;a href="http://stocksharp.codeplex.com/SourceControl/changeset/view/23281#362188" rel="nofollow" target="_blank"&gt;GetCandleBounds&lt;/a&gt;):&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;public static Range&amp;lt;DateTime&amp;gt; GetCandleBounds(this TimeSpan timeFrame, Security security)
		{
			if (security == null)
				throw new ArgumentNullException(&amp;quot;security&amp;quot;);

			return timeFrame.GetCandleBounds(security.GetMarketTime(), security.ExchangeBoard);
		}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;то дело прояснится, видно, что торговый инструмент используется для получения времени торговой площадки.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(25670)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Прошу пояснить первое условие в этой строке&lt;/p&gt;
&lt;p&gt;if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; _parabolic.IsFormed &amp;amp;&amp;amp; candle.State == CandleStates.Finished)&lt;/p&gt;
&lt;p&gt;если время открытия полученной свечи больше или равно времени предпоследней свечи... Разве может быть время открытия последней меньше предпоследней? Они поступаю в стратегию на обработку по очереди...
Дело в том, что мы должны пропускать только последние свечи чтобы наша стратегия работала, исторические свечи, например, которые были час назад нас (например при таймфрейме 1 мин.) не устраивают, ведь, при запуске получения свечей мы начинаем получать все свечи, котрые доступны системе, в том числе и историчсески, т.е. те, которые прошли например час назад (если говорим о таймфрейме, например, в 1 минуту.).&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>