﻿<?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">Урок 5. Алготрейдинг и программирование</title>
  <id>~/topic/3718/urok-5_-algotreiding-i-programmirovanie/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-13T16:57:38Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3718" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/26061/</id>
    <title type="text">Видео-урок Программируем стратегию BollingerBands [vk]http://vk.com/video_ext.php?oid=-66650972&amp;amp;id=1...</title>
    <published>2013-05-25T02:33:09Z</published>
    <updated>2016-08-16T00:13:33Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.com/users/26984/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:24pt"&gt;Видео-урок&lt;/span&gt;&lt;/strong&gt;
&lt;strong&gt;Программируем стратегию BollingerBands&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[vk]http://vk.com/video_ext.php?oid=-66650972&amp;amp;id=167470173&amp;amp;hash=62ad29fe5712f0aa&amp;amp;hd=3[/vk]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:24pt"&gt;Темы занятия:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Стратегия проверенная на истор. данных&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Определяем алгоритм торговли&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Реализация стратегии&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:24pt"&gt;Полезные ссылки:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://stocksharp.com/forum/337/Torghovaia-sistiema-na-osnovie-linii-bollindzhiera/"&gt;Алгоритм стратегии&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Индикатор &amp;quot;Rate Of Change&amp;quot; (ROC) в &lt;a href="http://stocksharp.com/doc/html/T_StockSharp_Algo_Indicators_Oscillator_RateOfChange.htm"&gt;S# документации&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BC%D0%B5%D0%BD%D1%82%D1%83%D0%BC" rel="nofollow" target="_blank"&gt;википедия&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Индикатор &amp;quot;Экспоненциальная скользящая средняя&amp;quot; в &lt;a href="http://stocksharp.com/doc/html/T_StockSharp_Algo_Indicators_Trend_ExponentialMovingAverage.htm"&gt;S# документации&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%BE%D0%BB%D1%8C%D0%B7%D1%8F%D1%89%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D1%8F%D1%8F" rel="nofollow" target="_blank"&gt;википедия&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:24pt"&gt;Вложения:&lt;/span&gt;&lt;/strong&gt;
&lt;a href="http://vk.com/docs?oid=-66650972" rel="nofollow" target="_blank"&gt;Скачать проекты&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:24pt"&gt;Изменения в проектах:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Проект BollingerBandsRobot
Файл MainWindow.cs&lt;/summary&gt;
&lt;p&gt;Начиная с версии S# 4.1.19.1 статус подключения коннектора вынесен в специальное свойство ConnectionState, которое может принимать следующие значения:
Disconnected - Не активно,
Disconnecting - В процессе отключения,
Connected - В процессе подключения,
Connecting - Подключение активно,
Failed - Ошибка подключения&lt;/p&gt;
&lt;p&gt;Таким образом, теперь нет свойства IsConnected, а наличие статуса подключения мы можем получать от свойства ConnectionState.&lt;/p&gt;
&lt;p&gt;Было:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
        /// &amp;lt;summary&amp;gt;
        /// Обработчик события закрытия окна
        /// &amp;lt;/summary&amp;gt;
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (Connection.SafeConnection.Trader != null &amp;amp;&amp;amp; Connection.SafeConnection.Trader.IsConnected)
            {
                Connection.SafeConnection.Trader.Dispose();
            }
            Thread.CurrentThread.Abort();
            base.OnClosing(e);
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Стало:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
        /// &amp;lt;summary&amp;gt;
        /// Обработчик события закрытия окна
        /// &amp;lt;/summary&amp;gt;
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (Connection.SafeConnection.Trader != null &amp;amp;&amp;amp; Connection.SafeConnection.Trader.ConnectionState == 

ConnectionStates.Connected)
            {
                Connection.SafeConnection.Trader.Dispose();
            }
            Thread.CurrentThread.Abort();
            base.OnClosing(e);
        }

&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/26603/</id>
    <title type="text">pft_man: Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за иск...</title>
    <published>2013-07-05T12:18:54Z</published>
    <updated>2013-07-05T12:18:54Z</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(26394)" rel="nofollow" target="_blank"&gt;pft_man&lt;/a&gt;:&lt;/strong&gt;
Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за исключением того, что расчёты происходят не по событию окончания свечки, а по событию изменения свечки. Как только цена достигает определённого уровня, регистрируется и отправляется ордер. С тестовым квиком всё работает, но с боевым квиком как только исполняется ордер (заключается сделка), сразу всё падает, появляется новое окно No Source Available и появляется вот такая ошибка. Причём ни на какую-то конкретную строку в коде она не указывает. Никак не могу разобраться, с чем это связано?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В Вашей стратегии встречается код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
this.AddInfoLog(&amp;quot;trailing-stop = {0}, current step = {1}, level = {3}&amp;quot;,
                                 trailingStop.ToString(), currentStep.ToString(), level.ToString());

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ошибка, о которой Вы пишите возникает из за того, что не найдено значение {3} для строки форматирования. Т.е. у Вас три аргумента передается:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
trailingStop.ToString(), currentStep.ToString(), level.ToString()

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;а в строке форматирования требуется и четвертый элемент (индекс 3).&lt;/p&gt;
&lt;p&gt;Чтобы код работал, нужно исправить строку форматирования (видимо, по ошибке вклинился индекс 3 в место 2), правильно так:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
this.AddInfoLog(&amp;quot;trailing-stop = {0}, current step = {1}, level = {2}&amp;quot;,
                                 trailingStop.ToString(), currentStep.ToString(), level.ToString());

&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/26394/</id>
    <title type="text">Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за исключением ...</title>
    <published>2013-06-20T17:33:41Z</published>
    <updated>2013-06-20T17:33:41Z</updated>
    <author>
      <name>pft_man</name>
      <uri>https://stocksharp.com/users/28735/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Добрый день. У меня такой вопрос. Немного изменил эту стратегию, логика работы таже, за исключением того, что расчёты происходят не по событию окончания свечки, а по событию изменения свечки. Как только цена достигает определённого уровня, регистрируется и отправляется ордер. С тестовым квиком всё работает, но с боевым квиком как только исполняется ордер (заключается сделка), сразу всё падает, появляется новое окно No Source Available и появляется вот такая ошибка. Причём ни на какую-то конкретную строку в коде она не указывает. Никак не могу разобраться, с чем это связано?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/26137/</id>
    <title type="text">UsilaDobry: IvanB: в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами...</title>
    <published>2013-05-29T05:51:51Z</published>
    <updated>2013-05-29T05:51:51Z</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(26129)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(26081)" rel="nofollow" target="_blank"&gt;IvanB&lt;/a&gt;:&lt;/strong&gt;
в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.
А так можно сделать для анализа в стратегии свечей разного таймфрейма?
Да, можно.
&lt;strong&gt;&lt;a href="@message(26129)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Хорошо создал две серии, передал их в стратегию.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;                  :::spoiler
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
                      var timeFrame1 = TimeSpan.FromMinutes(1);
                      var timeFrame2 = TimeSpan.FromMinutes(30);
                      
                      _candleManager1 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                      _candleManager2 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                      
                      var security = ConnectionInterface.SelectedSecurity;

                      var series1 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame1);
                      var series2 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame2);
                      
                      _candleManager1.Start(series1);
                      _candleManager2.Start(series2);

                      _breakdownLevelStrategy = new BreakdownLevelStrategy(series1, series2)
                      {
                          Volume = int.Parse(VolumeTextBox3.Text)
                      };
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;Но в стратегии мы обрабатываем одну серию в реальном времени
:::spoiler&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_candleSeries1.ProcessCandle += candle =&amp;gt;
                   {
                      
                      var timeFrame = (TimeSpan) candle.Arg; 
                      var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                      
                       if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; candle.State == CandleStates.Finished)
                       {
                           ....какой-то код алгоритма...
                       }
                   };
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Или можем подписаться также на обработку свечей второй серии
:::spoiler&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;_candleSeries2.ProcessCandle += candle =&amp;gt;
                   {
                      
                      var timeFrame = (TimeSpan) candle.Arg; 
                      var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                      
                       if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; candle.State == CandleStates.Finished)
                       {
                           ....какой-то код алгоритма...
                       }
                   };
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;А алгоритмы связать через переменные, объявленные на уровне класса стратегии...???
Да, так лучше всего, думаю.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/26129/</id>
    <title type="text">IvanB: в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами. А так можн...</title>
    <published>2013-05-28T15:02:18Z</published>
    <updated>2013-05-28T15:02:18Z</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(26081)" rel="nofollow" target="_blank"&gt;IvanB&lt;/a&gt;:&lt;/strong&gt;
в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.
А так можно сделать для анализа в стратегии свечей разного таймфрейма?
Хорошо создал две серии, передал их в стратегию.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;                    ```csharp

                    var timeFrame1 = TimeSpan.FromMinutes(1);
                    var timeFrame2 = TimeSpan.FromMinutes(30);
                    
                    _candleManager1 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                    _candleManager2 = new CandleManager(ConnectionInterface.SafeConnection.Trader);
                    
                    var security = ConnectionInterface.SelectedSecurity;

                    var series1 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame1);
                    var series2 = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame2);
                    
                    _candleManager1.Start(series1);
                    _candleManager2.Start(series2);

                    _breakdownLevelStrategy = new BreakdownLevelStrategy(series1, series2)
                    {
                        Volume = int.Parse(VolumeTextBox3.Text)
                    };
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Но в стратегии мы обрабатываем одну серию в реальном времени
                   ```csharp
 _candleSeries1.ProcessCandle += candle =&amp;gt;
                    {
                       
                       var timeFrame = (TimeSpan) candle.Arg; 
                       var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                       
                        if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; candle.State == CandleStates.Finished)
                        {
                            ....какой-то код алгоритма...
                        }
                    };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Или можем подписаться также на обработку свечей второй серии
```csharp
_candleSeries2.ProcessCandle += candle =&amp;gt;
{&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                   var timeFrame = (TimeSpan) candle.Arg; 
                   var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; 
                   
                    if (candle.OpenTime &amp;gt;= time &amp;amp;&amp;amp; candle.State == CandleStates.Finished)
                    {
                        ....какой-то код алгоритма...
                    }
                };
&lt;/code&gt;&lt;/pre&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/26081/</id>
    <title type="text">UsilaDobry: Доброго дня Иван. ... Так передать значение индикатора не получается var bollinger = new...</title>
    <published>2013-05-27T07:17:38Z</published>
    <updated>2013-05-27T07:17:38Z</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(26075)" rel="nofollow" target="_blank"&gt;UsilaDobry&lt;/a&gt;:&lt;/strong&gt;
Доброго дня Иван.
...
Так передать значение индикатора не получается&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p Length="20," Width="2"&gt;var bollinger = new BollingerBands;
series.ProcessCandle += candle =&amp;gt;
{
if (candle.State != CandleStates.Finished)
return;
var bollingerValue = bollinger.Process((DecimalIndicatorValue)candle.ClosePrice;
};
var bs = new BollingerStrategy(bollingerValue, _series)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; Что можно еще придумать?
Здравствуйте.
Единственная ошибка, которую вижу в Вашем коде, это то, что переменные bollinger и bs объявлены как локальные, их нужно объявить на уровне класса, и тогда этот код должен работать.

&amp;gt; **[UsilaDobry](@message(26075)):**
&amp;gt; Во всех примерах со стратегиями значения индикатора передаются в стратегию в виде графического значения
&amp;gt; ```csharp
var bs = new BollingerStrategy((BollingerBands) _bollingerElem.Indicator, _series)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;В таком случае стратегия зависит от графика, например запущу вывод на график 30-минутные свечи, а стратегию запущу на минутных свечах, в этом случае она работать не будет.
в таком случае надо создавать два экземпляра серии свечей, с разными таймфреймами.&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/26075/</id>
    <title type="text">Доброго дня Иван. Во всех примерах со стратегиями значения индикатора передаются в стратегию в виде ...</title>
    <published>2013-05-26T15:20:47Z</published>
    <updated>2013-05-26T15:21:20Z</updated>
    <author>
      <name>UsilaDobry</name>
      <uri>https://stocksharp.com/users/28825/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Доброго дня Иван.
Во всех примерах со стратегиями значения индикатора передаются в стратегию в виде графического значения&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;var bs = new BollingerStrategy((BollingerBands) _bollingerElem.Indicator, _series)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В таком случае стратегия зависит от графика, например запущу вывод на график 30-минутные свечи, а стратегию запущу на минутных свечах, в этом случае она работать не будет.
Так передать значение индикатора не получается&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;var bollinger = new BollingerBands{Length = 20, Width = 2};
series.ProcessCandle += candle =&amp;gt;
                            {
                                if (candle.State != CandleStates.Finished)
                                    return;
                                var bollingerValue = bollinger.Process((DecimalIndicatorValue)candle.ClosePrice;
                            };
var bs = new BollingerStrategy(bollingerValue, _series)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Что можно еще придумать?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>