﻿<?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">Сообщество. StockSharp</title>
  <id>https://stocksharp.ru/handlers/atom.ashx?category=community&amp;page=29</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-30T07:31:28Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=community&amp;page=29" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/topic/14760/</id>
    <title type="text">Писать коннекторы - может каждый!</title>
    <published>2020-12-01T14:07:58Z</published>
    <updated>2020-12-02T12:37:19Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Программирование роботов" />
    <category term="трейдинг" />
    <category term="коннектор" />
    <category term="форекс" />
    <category term="коннектор к бирже" />
    <category term="коннектор для трейдинга" />
    <category term="программы" />
    <content type="html">Друзья,&lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/117331/connectors-external-trading-systems.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/117331/connectors-external-trading-systems.jpg?size=800x800" alt="connectors-external-trading-systems.jpg" title="connectors-external-trading-systems.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;С нашей бесплатной библиотекой для начинающих и профессионалов алготрейдинга S#.API &lt;span style="color:red"&gt;&lt;span style="font-size:140%"&gt;вы можете писать свои собственные адаптеры – коннекторы, которые позволяют создавать подключения к любой внешней торговой системе!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Именно для этого мы обновили и расширили раздел &lt;a href="https://doc.stocksharp.ru/html/fb79e67d-945c-493d-bdac-85d0040af828.htm" title="https://doc.stocksharp.ru/html/fb79e67d-945c-493d-bdac-85d0040af828.htm"&gt;документации&lt;/a&gt;, посвящённый этому вопросу! &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Искренне надеемся, что среди нашего большого комьюнити найдутся программисты, заинтересованные в такой возможности!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;С уважением команда СтокШарп! &lt;br /&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/4908/</id>
    <title type="text">Не получается получить BestAsk и BestBid цены</title>
    <published>2015-02-24T15:49:19Z</published>
    <updated>2020-11-28T21:17:55Z</updated>
    <author>
      <name>Zabik</name>
      <uri>https://stocksharp.ru/users/72791/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Quik" />
    <content type="html">Написал небольшую программу, которая коннектится к Quik, подгружает мои портфели и два необходимых мне инструмента: VTBR и SBER, а так же позволяет купить/продать данные бумаги по рынку.&lt;br /&gt;&lt;br /&gt;Все было хорошо, пока мне не понадобились BestAsk.Price и BestBid.Price. Причем чтобы я не делал: пытался присвоить цену переменной или купить/продать по бестбид/аск цене - получаю ошибку:&lt;br /&gt;&lt;br /&gt;&lt;a href='http://s018.radikal.ru/i512/1502/06/2893e4ad3eb9.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="http://s018.radikal.ru/i512/1502/06/2893e4ad3eb9.jpg" style='max-width: 600px;' alt="Error" title="Error" /&gt;&lt;/a&gt;&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;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Security;

using MoreLinq;

using Ecng.Common;
using Ecng.Collections;
using Ecng.ComponentModel;
using Ecng.Serialization;
using Ecng.Xaml;

using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.BusinessEntities;
using StockSharp.Fix;
using StockSharp.Logging;
using StockSharp.Messages;
using StockSharp.Quik.Lua;


namespace Robot
{    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        
        private static Security _sber;
        private static Security _vtbr;                
        private QuikTrader CommonRobot1;
        
        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            CommonRobot1 = new QuikTrader
            {
                LuaFixServerAddress = &amp;quot;127.0.0.1:5001&amp;quot;.To&amp;lt;EndPoint&amp;gt;(),
                LuaLogin = &amp;quot;quik&amp;quot;,
                LuaPassword = &amp;quot;quik&amp;quot;.To&amp;lt;SecureString&amp;gt;()
            };            

            CommonRobot1.NewPortfolios += portfolios =&amp;gt; this.GuiAsync(() =&amp;gt;
                {
                    portf.ItemsSource = CommonRobot1.Portfolios;                    
                });
            
            CommonRobot1.NewSecurities += securities =&amp;gt; this.GuiAsync(() =&amp;gt;
            {                
                _sber = securities.FirstOrDefault(s =&amp;gt; s.Id == &amp;quot;SBER@TQBR&amp;quot;);
                _vtbr = securities.FirstOrDefault(s =&amp;gt; s.Id == &amp;quot;VTBR@TQBR&amp;quot;);                
                financial.Items.Add(_sber);
                financial.Items.Add(_vtbr);                
            });

            CommonRobot1.Connected += () =&amp;gt;
            {
                CommonRobot1.StartExport();
            };

            CommonRobot1.Connect();
        }

        private void Buy_Click(object sender, RoutedEventArgs e)
        {
            int vol;

            if (String.IsNullOrEmpty(volume.Text))
                vol = 1;
            else
                vol = int.Parse(volume.Text);

            var order = new Order
            {
                Portfolio = (Portfolio)portf.SelectedItem,
                Security = _vtbr, //(Security)financial.SelectedItem,
                Volume = vol,
                Price = _vtbr.BestBid.Price,
                //Type = OrderTypes.Market,
                Direction = Sides.Buy,
            };

            CommonRobot1.RegisterOrder(order);
        }

        private void Sell_Click(object sender, RoutedEventArgs e)
        {
            int vol;

            if (String.IsNullOrEmpty(volume.Text))
                vol = 1;
            else
                vol = int.Parse(volume.Text);

            var order = new Order
            {
                Portfolio = (Portfolio)portf.SelectedItem,
                Security = (Security)financial.SelectedItem,
                Volume = vol,
                Type = OrderTypes.Market,
                Direction = Sides.Sell,
            };

            CommonRobot1.RegisterOrder(order);
        }        
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14748/</id>
    <title type="text">Внимание! Технические работы на сайте!</title>
    <published>2020-11-27T10:07:25Z</published>
    <updated>2020-11-27T10:07:25Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Программирование роботов" />
    <category term="трейдинг" />
    <category term="Новости" />
    <category term="News" />
    <category term="ТехПоддержка" />
    <category term="трейдер" />
    <category term="роботы" />
    <category term="программы" />
    <category term="вебсайт" />
    <category term="maintenance" />
    <category term="техработы" />
    <content type="html">&lt;h2&gt;Уважаемые пользователи! &lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/117216/stocksharp-website-maintenance.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/117216/stocksharp-website-maintenance.jpg?size=800x800" alt="stocksharp-website-maintenance.jpg" title="stocksharp-website-maintenance.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&lt;span style="font-size:140%"&gt;&lt;u&gt;Наш сайт будет не доступен в эти выходные в связи с планируемыми техническими работами&lt;/u&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Мы благодарим вас за понимание и приносим свои извинение за доставленные неудобства.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;С уважением команда СтокШарп.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14743/</id>
    <title type="text">Баг в дизайнере</title>
    <published>2020-11-26T20:25:59Z</published>
    <updated>2020-11-26T20:25:59Z</updated>
    <author>
      <name>Greenn</name>
      <uri>https://stocksharp.ru/users/99877/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">При смене серии свечей (например с ТФ на tick) вылезает исключение и программа падает&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/117209/Screenshot_22.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/117209/Screenshot_22.png?size=800x800" alt="Screenshot_22.png" title="Screenshot_22.png" /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/8861/</id>
    <title type="text">StepPrice имеет значение Null</title>
    <published>2017-11-25T19:39:25Z</published>
    <updated>2020-11-26T07:41:01Z</updated>
    <author>
      <name>Георгий</name>
      <uri>https://stocksharp.ru/users/95046/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Hydra" />
    <content type="html">Здравствуйте.&lt;br /&gt;&lt;br /&gt;В api версии 4.3.28 не могу получить из quik данные по StepPrice. Приходит всегда Null. PriceStep определяется, множитель тоже, а вот stepprice почему-то нет. Значение получаю так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;Security.StepPrice.Value&lt;/div&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14740/</id>
    <title type="text">Дизайнер и темы</title>
    <published>2020-11-25T16:30:33Z</published>
    <updated>2020-11-25T16:30:33Z</updated>
    <author>
      <name>Greenn</name>
      <uri>https://stocksharp.ru/users/99877/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Здравствуйте. Подскажите пожалуйста, как поменять тему в дизайнере?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14737/</id>
    <title type="text">Важно! .NET FRAMEWORK поддерживаться не будет!</title>
    <published>2020-11-24T12:27:39Z</published>
    <updated>2020-11-24T12:27:39Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Новости" />
    <category term="Trading robots" />
    <category term="Trading systems" />
    <category term="News" />
    <category term="роботы" />
    <category term="coding" />
    <category term="кодирование" />
    <category term="обновления" />
    <category term="framework" />
    <content type="html">Друзья, важные новости по .NET FRAMEWORK 4.8! &lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/117186/algo-trading-fraemwork-news.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/117186/algo-trading-fraemwork-news.jpg?size=800x800" alt="algo-trading-fraemwork-news.jpg" title="algo-trading-fraemwork-news.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На данный момент мы поддерживаем платформы &lt;b&gt;.NET FRAMEWORK 4.8 и .NET CORE 3.1&lt;/b&gt;. Однако, к концу года мы полностью переходим на .NET 5 (продолжение .NET CORE)&lt;br /&gt;&lt;br /&gt;В будущем &lt;span style="color:red"&gt;&lt;span style="font-size:140%"&gt;мы не планируем поддерживать и развивать линейку .NET FW&lt;/span&gt;&lt;/span&gt;, поэтому что бы получать обновления, &lt;b&gt;переводите ваш код на .NET CORE&lt;/b&gt;! &lt;br /&gt;&lt;br /&gt;Приятного использования наших продуктов! &lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/10990/</id>
    <title type="text">Новости по курсу Designer!</title>
    <published>2019-09-09T15:59:28Z</published>
    <updated>2020-11-19T16:09:47Z</updated>
    <author>
      <name>Marat</name>
      <uri>https://stocksharp.ru/users/101940/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Алготрейдинг" />
    <category term="Торговые роботы" />
    <category term="Edu" />
    <category term="обучение торговым роботам" />
    <category term="обучение торговым стратегиям" />
    <category term="создать торгового робота" />
    <category term="обучение алготрейдингу" />
    <category term="торговый робот своими руками" />
    <content type="html">&lt;b&gt;&lt;h2&gt;Друзья!!!&lt;/h2&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Создание видео курса по программе &lt;a href="https://stocksharp.ru/products/designer/" title="https://stocksharp.ru/products/designer/"&gt;&lt;u&gt;Designer&lt;/u&gt;&lt;/a&gt; неумолимо идет к завершению. Выпуск видеокурса мы наметили в октябре. &lt;br /&gt;&lt;br /&gt;                                                                                                              &lt;a href='https://stocksharp.ru/file/109630/calendar.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/109630/calendar.png?size=800x800" alt="calendar.png" title="calendar.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Да! Нам пришлось сдвинуть сроки[smile]. Это мы сделали по следующим причинам:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- мы увеличили число уроков, а соответственно вы получите больше информации;&lt;br /&gt;- исправили ошибки которые могли бы возникать в процессе работы;&lt;br /&gt;- добавили новые возможности нашим кубикам и программе;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Мы уверены, что вы получите более совершенный и удобный продукт[lol], а дополнительные уроки сделают ваши знания более объемными[nerd].&lt;br /&gt;&lt;br /&gt;Уже скоро, вы сможете начать свое полномасштабное обучение и станете зарабатывать прямо во время учебы!!!&lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/109631/image.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/109631/image.jpg?size=800x800" alt="image.jpg" title="image.jpg" /&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14716/</id>
    <title type="text">НПР1</title>
    <published>2020-11-19T15:41:36Z</published>
    <updated>2020-11-19T15:41:36Z</updated>
    <author>
      <name>Balex</name>
      <uri>https://stocksharp.ru/users/97855/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="нпр" />
    <category term="маржинальная торговля" />
    <content type="html">Добрый день&lt;br /&gt;Я верно понимаю, что НПР1 (Норматив покрытия риска при исполнении поручений - объем средств доступных для новых поручений с учетом маржи по текущемупортфелю) недоступен через АПИ? А добавить сможете? Иначе непонятно как узнать сколько средств доступно для торговли с учетом маржи.&lt;br /&gt;&lt;br /&gt;Спасибо </content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14713/</id>
    <title type="text">Онлайн магазин StockSharp! </title>
    <published>2020-11-19T12:32:35Z</published>
    <updated>2020-11-19T12:32:35Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="трейдинг" />
    <category term="Новости" />
    <category term="Биржа" />
    <category term="Магазин торговых роботов" />
    <category term="трейдер" />
    <category term="коннектор для трейдинга" />
    <category term="роботы" />
    <category term="поддержка" />
    <content type="html">Друзья,&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color:red"&gt;И вновь у нас отличная новость!&lt;/span&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/116902/stocksharp-online-store-trading.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/116902/stocksharp-online-store-trading.jpg?size=800x800" alt="stocksharp-online-store-trading.jpg" title="stocksharp-online-store-trading.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Мы открыли свой собственный магазин, который находится в разделе &lt;a href="https://stocksharp.ru/robot/%20" title="https://stocksharp.ru/robot/%20"&gt;торговые роботы&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Теперь каждый из вас &lt;b&gt;&lt;h2&gt;по желанию может заказать любой из наших &lt;a href="https://stocksharp.ru/robot/" title="https://stocksharp.ru/robot/"&gt;продуктов&lt;/a&gt;, и более того, вы можете создавать что-то своё, размещать на сайте и продавать через нас!&lt;/h2&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пишите на нашу почту &lt;a href="mailto:info@stocksharp.com"&gt;info@stocksharp.com&lt;/a&gt; о своём продукте, мы будем рады ответить на ваши вопросы и оказать необходимую поддержку!&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14665/</id>
    <title type="text">Поддержка StockSharp работает! </title>
    <published>2020-11-05T14:25:05Z</published>
    <updated>2020-11-11T09:31:53Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Алготрейдинг" />
    <category term="трейдинг" />
    <category term="Новости" />
    <category term="Работа" />
    <category term="форекс" />
    <category term="трейдер" />
    <category term="роботы" />
    <category term="поддержка" />
    <category term="фриланс" />
    <content type="html">&lt;a href='https://stocksharp.ru/file/116718/customer-support-service.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/116718/customer-support-service.jpg?size=800x800" alt="http://" title="http://" /&gt;&lt;/a&gt;&lt;br /&gt;Дорогие друзья,&lt;br /&gt;&lt;br /&gt;На прошлой неделе мы анонсировали новый сервис &lt;a href="https://stocksharp.ru/freelance/" title="https://stocksharp.ru/freelance/"&gt;S#.Freelance&lt;/a&gt;. В связи с нашей ошибкой в размещении многие подумали, что он отменяет и заменяет поддержку.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Мы хотим вас заверить что это не так! Мы по-прежнему на связи и продолжаем оказывать помощь нашим клиентам!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Условия поддержки доступны по &lt;a href="https://stocksharp.ru/support/" title="https://stocksharp.ru/support/"&gt;ссылке&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Приятного использования&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14663/</id>
    <title type="text">Сборка примеров SampleConnectionWithStorage</title>
    <published>2020-11-05T05:12:30Z</published>
    <updated>2020-11-10T23:43:16Z</updated>
    <author>
      <name>andy_baka</name>
      <uri>https://stocksharp.ru/users/237/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Попытка собрать пример. Исключение на создании LogManager. &lt;br /&gt;Версия S#API 5_0 закачана сегодня через Installer. &lt;br /&gt;&lt;br /&gt;Чего делать?  </content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14685/</id>
    <title type="text">StockSharp QuikLua не видит заявки</title>
    <published>2020-11-10T15:32:08Z</published>
    <updated>2020-11-10T22:52:56Z</updated>
    <author>
      <name>Михаил</name>
      <uri>https://stocksharp.ru/users/99786/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="QuikLua" />
    <content type="html">Коллеги, добрый день.&lt;br /&gt;Смотрю Stocksharp 5.0.0.17, пример SampleConnection, терминал Quik 8.9&lt;br /&gt;Я вижу, что после подключения к коннектору,&lt;br /&gt;стокшарп прогружает все заявки и сделки, всё корректно.&lt;br /&gt;&lt;br /&gt;Но все последующие заявки,&lt;br /&gt;которые ставятся &amp;quot;другими приводами к квику, не руками&amp;quot;,&lt;br /&gt;программа уже не видит.&lt;br /&gt;Она получает только события onOrderChanged когда другой привод снимает заявку.&lt;br /&gt;Помогите пожалуйста, что нужно донастроить в коннекторе,&lt;br /&gt;чтобы он видел обновления заявок?&lt;br /&gt;&lt;br /&gt;-------&lt;br /&gt;Получается, ради того чтобы увидеть все новые ордера,&lt;br /&gt;мне нужно сделать Disconnect, а потом Connect.&lt;br /&gt;//&lt;br /&gt;Connector.Disconnect();&lt;br /&gt;Thread.Sleep(3000);&lt;br /&gt;Connector.Connect();&lt;br /&gt;&lt;br /&gt;это очень неэффективное решение</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/10126/</id>
    <title type="text">S#.UI – графический фреймворк StockSharp</title>
    <published>2018-11-13T09:49:46Z</published>
    <updated>2020-11-07T12:32:29Z</updated>
    <author>
      <name>Иван З.</name>
      <uri>https://stocksharp.ru/users/6502/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="S#Shell" />
    <category term="S#API" />
    <category term="S#UI" />
    <category term="Графические компоненты S#" />
    <content type="html">В данной статье я покажу как использовать графические компоненты, входящий в S#.API, с целью создания полноценного приложения уровня &lt;a href="https://stocksharp.ru/products/shell/" title="https://stocksharp.ru/products/shell/"&gt;S#.Shell&lt;/a&gt;:&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108007/image3979.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108007/image3979.png?size=800x800" alt="image3979.png" title="image3979.png" /&gt;&lt;/a&gt;&lt;br /&gt;Вы узнаете, как сделать профессионального уровня программу с настройкой подключений, выводом инструментов, цен и графиков (и чтобы это все еще сохранялось и загружалось при перезапуске). И сложность создания такого приложения не несколько месяцев, а буквально несколько часов (это не шутка! читайте до конца). В этом заключается основное преимущество графического фреймворка, который я назвал по аналогии S#.UI (данное название не официальное, я сам придумал).&lt;br /&gt;Я не буду использовать сложные конструкции и паттерны проектирования, понятные только профессиональным программистам. Наоборот, цель статьи показать, что порог вхождения в создание своих приложений торговли с помощью S#.API очень низкий.&lt;br /&gt;Если вы работаете в компании, и делаете свой уникальный софт (например, вы работает в проп или брокерской компании), вам так же будет интересно. В этой статье вы сможете узнать практику создания подобных систем (особенно, если вы только приступили к своим обязанностям).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Что понадобиться&lt;/h2&gt;&lt;br /&gt;1)	Visual Studio 2017 (Community, бесплатная версия), в ней мы будем программировать.&lt;br /&gt;2)	Бесплатное подключение к тестовым торгам на бирже, я буду использовать QUIK.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание проекта&lt;/h2&gt;&lt;br /&gt;Создадим новое WPF приложение в Visual Studio&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108008/image5545.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108008/image5545.png?size=800x800" alt="image5545.png" title="image5545.png" /&gt;&lt;/a&gt;&lt;br /&gt;После чего необходимо добавить S#.API библиотеки в как это сделать описано &lt;a href="http://doc.stocksharp.ru/html/b9f672db-e0c9-4208-9759-179e5de17fd8.htm" title="http://doc.stocksharp.ru/html/b9f672db-e0c9-4208-9759-179e5de17fd8.htm"&gt;здесь &lt;/a&gt; . Я предпочитаю установку при помощи Nuget.&lt;br /&gt;Так как все графические элементы S#.API созданы на базе DevExpress, а библиотеки DevExpress идут вместе с S#.API, глупо будет ими не воспользоваться. Всю информацию по графическим элементам DevExpress можно найти в Google.&lt;br /&gt;Перейдем в редактор окна MainWindow.xaml&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108009/image4259.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108009/image4259.png?size=800x800" alt="image4259.png" title="image4259.png" /&gt;&lt;/a&gt;&lt;br /&gt;Заменим Window на DXWindow, это нам понадобиться для использования разных цветовых схем &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108010/image4329.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108010/image4329.png?size=800x800" alt="image4329.png" title="image4329.png" /&gt;&lt;/a&gt;&lt;br /&gt;Visual Studio нам сама предложит вставить необходимые библиотеки.&lt;br /&gt;Разобьем окно на три части в верху будет полоса с кнопками настройки подключений и подключения. В низу окно с логами. В середине все остальные панели. Проще всего так разбить окно с помощью LayoutControl от DevExpress.&lt;br /&gt;В получившиеся три части мы и будем добавлять необходимые нам элементы.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108011/image2275.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108011/image2275.png?size=800x800" alt="image2275.png" title="image2275.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Настройка подключения к коннектору&lt;/h2&gt;&lt;br /&gt;Добавим две кнопки, одна кнопка настройки подключения, а вторая кнопка подключения. Для этого воспользуемся кнопкой SimpleButton от DevExpress. Кнопки будут расположены в верхней части приложения. В каждую кнопку поместим картинку привычные по Терминалу и Дизайнеру.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108012/image9977.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108012/image9977.png?size=800x800" alt="image9977.png" title="image9977.png" /&gt;&lt;/a&gt;&lt;br /&gt;В верхнем правом углу экранной экранной формы увидим такую картину &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108013/image1157.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108013/image1157.png?size=800x800" alt="image1157.png" title="image1157.png" /&gt;&lt;/a&gt;&lt;br /&gt;Двойным нажатием на каждую кнопку создадим обработчики событий нажатия на кнопку.&lt;br /&gt;В коде MainWindow необходимо объявить коннектор, а также место и имя файла в котором будут храниться настройки коннектора. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108014/image836.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108014/image836.png?size=800x800" alt="image836.png" title="image836.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события нажатия на кнопку настроек коннектора будем открывать окно конфигурации коннектора и сохранять его в файл.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108015/image1289.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108015/image1289.png?size=800x800" alt="image1289.png" title="image1289.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе будем проверять есть ли каталог и файл с настройками коннектора и если он есть будем его загружать в коннектор&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108016/image3497.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108016/image3497.png?size=800x800" alt="image3497.png" title="image3497.png" /&gt;&lt;/a&gt;&lt;br /&gt;Большинство объектов S#.API имеют методы Save и Load, с помощью которых можно сохранить и загрузить этот объект из XML файла.&lt;br /&gt;В методе обработчике нажатия на кнопку подключения подключаем коннектор.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108017/image6463.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108017/image6463.png?size=800x800" alt="image6463.png" title="image6463.png" /&gt;&lt;/a&gt;&lt;br /&gt;Теперь можно запустить программу и проверить ее.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Установка темной темы&lt;/h2&gt;&lt;br /&gt;Я предпочитаю темную тему. Поэтому сразу делаем чтобы тема программы была темной. Для этого в файле App.xaml &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108018/image1012.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108018/image1012.png?size=800x800" alt="image1012.png" title="image1012.png" /&gt;&lt;/a&gt;&lt;br /&gt;Заменяем Application на charting:ExtendedBaseApplication Visual Studio нам сама предложит вставить необходимые библиотеки. А в файле App.xaml.cs удалить &amp;#171;: Application&amp;#187;.  Получиться код следующего вида&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108019/image4777.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108019/image4777.png?size=800x800" alt="image4777.png" title="image4777.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108020/image9701.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108020/image9701.png?size=800x800" alt="image9701.png" title="image9701.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе MainWindow пишем ApplicationThemeHelper.ApplicationThemeName = Theme.VS2017DarkName;&lt;br /&gt;Полный код на текущий момент:&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108021/image8484.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108021/image8484.png?size=800x800" alt="image8484.png" title="image8484.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки темной темы.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108022/image1199.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108022/image1199.png?size=800x800" alt="image1199.png" title="image1199.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели инструментов&lt;/h2&gt;&lt;br /&gt;Добавим папку, где мы будем хранить все созданные нами контроллы и назовем ее XAML.&lt;br /&gt;Добавим в нее свой первый UserControll, дадим ему имя SecurityGridControl . &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108023/image5159.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108023/image5159.png?size=800x800" alt="image5159.png" title="image5159.png" /&gt;&lt;/a&gt;&lt;br /&gt;В него добавляем один элемент SecurityPicker. В котором будут отображаться имеющиеся инструменты. По аналогии с главным окном будем использовать LayoutControl от DevExpress.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108024/image2385.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108024/image2385.png?size=800x800" alt="image2385.png" title="image2385.png" /&gt;&lt;/a&gt;&lt;br /&gt;Перейдем в конструктор главного окна и изменим центральную часть в вид закладок. В одной из закладок расположим созданный нами контролл с SecurityPicker&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108025/image5375.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108025/image5375.png?size=800x800" alt="image5375.png" title="image5375.png" /&gt;&lt;/a&gt;&lt;br /&gt;Теперь, когда у нас есть панель инструментов надо задать ей источник данных, в нашем случае это коннектор. Можно было просто в конструкторе MainWindow написать &lt;br /&gt;SecurityPanel.SecPicker.SecurityProvider = Connector;&lt;br /&gt;Но не стоит засорять код MainWindow кодом, который к нему не относится. Поэтому я создам статическую переменную Instance а в конструкторе MainWindow присвою ему значение MainWindow.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108026/image1508.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108026/image1508.png?size=800x800" alt="image1508.png" title="image1508.png" /&gt;&lt;/a&gt;&lt;br /&gt;Теперь в любом месте нашей программы мы можем обращаться к свойствам MainWindow через код MainWindow.Instance.XXX. &lt;br /&gt;В конструкторе SecurityGridControl таким образом указываем Connector как источник данных&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108027/image6003.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108027/image6003.png?size=800x800" alt="image6003.png" title="image6003.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запустим для проверки.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108028/image8483.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108028/image8483.png?size=800x800" alt="image8483.png" title="image8483.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Добавление логирования&lt;/h2&gt;&lt;br /&gt;Работу программы, коннектора или робота необходимо контролировать. Для этого в S#.API есть специальный класс LogManager. Данный класс принимает сообщения от источников и передает их в слушатели. В нашем случае источниками будут Connector, стратегии и т.д., а слушателем будет файл и панель логов.&lt;br /&gt;В коде MainWindow объявляем объект LogManager и место, где он будет храниться&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108029/image3414.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108029/image3414.png?size=800x800" alt="image3414.png" title="image3414.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе MainWindow создаем LogManager, задаем ему источник Connector и задаем слушателя файл&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108030/image5931.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108030/image5931.png?size=800x800" alt="image5931.png" title="image5931.png" /&gt;&lt;/a&gt;&lt;br /&gt;По аналогии с панелью инструментов создадим, панель логов в папку XAML добавляем еще один UserControl. Дадим ему имя MonitorControl. В него добавим элемент Monitor.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108031/image4717.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108031/image4717.png?size=800x800" alt="image4717.png" title="image4717.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе MonitorControl зададим в LogManager еще и Monitor как слушателя &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108032/image8141.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108032/image8141.png?size=800x800" alt="image8141.png" title="image8141.png" /&gt;&lt;/a&gt;&lt;br /&gt;В нижнюю часть MainWindow добавляем созданный MonitorControl&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108033/image5572.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108033/image5572.png?size=800x800" alt="image5572.png" title="image5572.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108034/image6299.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108034/image6299.png?size=800x800" alt="image6299.png" title="image6299.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели портфелей&lt;/h2&gt;&lt;br /&gt;По аналогии с панелью инструментов создадим, панель логов в папку XAML добавляем еще один UserControl. Дадим ему имя PortfolioGridControl. В него добавим элемент PortfolioGrid.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108035/image68.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108035/image68.png?size=800x800" alt="image68.png" title="image68.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе PortfolioGridControl нам надо подписаться на события появления нового портфеля и событие появления новой позиции у Connector. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108036/image1333.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108036/image1333.png?size=800x800" alt="image1333.png" title="image1333.png" /&gt;&lt;/a&gt;&lt;br /&gt;Таким образом при появлении нового портфеля он появиться на панели портфелей портфель, а при появлении новой позиции на панели портфелей портфель обновит позицию. &lt;br /&gt;В центральную части MainWindow добавляем созданную панель PortfolioGridControl&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108037/image127.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108037/image127.png?size=800x800" alt="image127.png" title="image127.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108038/image3862.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108038/image3862.png?size=800x800" alt="image3862.png" title="image3862.png" /&gt;&lt;/a&gt;&lt;br /&gt;У нас появилась вкладка с портфелями.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели ордеров&lt;/h2&gt;&lt;br /&gt;Панель ордеров в S#.API имеет возможность выставления заявок, снятия заявок и перерегистрации.&lt;br /&gt;По аналогии с панелью инструментов создадим панель ордеров, в папку XAML добавляем еще один UserControl. Дадим ему имя OrderGridControl. В него добавим элемент OrderGrid.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108039/image4502.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108039/image4502.png?size=800x800" alt="image4502.png" title="image4502.png" /&gt;&lt;/a&gt;&lt;br /&gt;OrderGrid имеет событие регистрации заявки OrderRegistering, событие перерегистрации заявки OrderReRegistering и событие отмены заявки OrderCanceling.&lt;br /&gt;Создадим их обработчики&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108040/image6128.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108040/image6128.png?size=800x800" alt="image6128.png" title="image6128.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события регистрации заявки мы создаем окно OrderWindow, в котором необходимо указать источники данных для инструментов, портфелей, и рыночных данных. В нашем случае это все будет Connector.&lt;br /&gt;После чего мы вызываем OrderWindow методом ShowModal если в этом окне было нажата кнопка ОК то мы через коннектор методом RegisterOrder регистрируем заявку.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108041/image4848.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108041/image4848.png?size=800x800" alt="image4848.png" title="image4848.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события перерегистрации заявки мы все делаем тоже самое. Только в этом случае в событие нам приходит объект Order это заявка, которую надо перерегистрировать. Поэтому в OrderWindow мы указываем Order = order.ReRegisterClone(newVolume: order.Balance), чтобы заполнить поля окна OrderWindow.&lt;br /&gt;После чего мы вызываем OrderWindow методом ShowModal если в этом окне было нажата кнопка ОК то мы через коннектор методом ReRegisterClone перерегистрируем заявку. В него мы передаем старую заявку, которую надо отменить и новую которую надо выставить.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108042/image1314.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108042/image1314.png?size=800x800" alt="image1314.png" title="image1314.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события отмены заявки достаточно вызвать метод CancelOrder и передать в него ордер, который необходимо отменить.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108043/image2355.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108043/image2355.png?size=800x800" alt="image2355.png" title="image2355.png" /&gt;&lt;/a&gt;&lt;br /&gt;Чтобы Ордера отображались в OrderGrid необходимо в конструкторе OrderGridControl подписаться на события появления нового ордера и на событие ошибки регистрации и передавать эти события в OrderGrid.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108044/image9790.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108044/image9790.png?size=800x800" alt="image9790.png" title="image9790.png" /&gt;&lt;/a&gt;&lt;br /&gt;В центральную части MainWindow добавляем созданную панель OrderGridControl&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108045/image4806.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108045/image4806.png?size=800x800" alt="image4806.png" title="image4806.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108046/image7488.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108046/image7488.png?size=800x800" alt="image7488.png" title="image7488.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели собственных сделок&lt;/h2&gt;&lt;br /&gt;По аналогии с панелью инструментов создадим панель собственных сделок, в папку XAML добавляем еще один UserControl. Дадим ему имя MyTradeGridControl. В него добавим элемент MyTradeGrid.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108047/image3653.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108047/image3653.png?size=800x800" alt="image3653.png" title="image3653.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе MyTradeGridControl нам надо подписаться на события появления новой собственной сделки и передать ее в MyTradeGrid. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108048/image7227.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108048/image7227.png?size=800x800" alt="image7227.png" title="image7227.png" /&gt;&lt;/a&gt;&lt;br /&gt;В центральную части MainWindow добавляем созданную панель OrderGridControl&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108049/image3738.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108049/image3738.png?size=800x800" alt="image3738.png" title="image3738.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108050/image514.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108050/image514.png?size=800x800" alt="image514.png" title="image514.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели стаканов&lt;/h2&gt;&lt;br /&gt;По аналогии с предыдущими панелями создадим панель стаканов, в папку XAML добавляем еще один UserControl. Дадим ему имя MarketDepthControl. &lt;br /&gt;В MainWindow мы уже использовали LayoutControl, в этом контроле тоже воспользуемся LayoutControl. Разобьем панель на две части по горизонтали&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108051/image1678.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108051/image1678.png?size=800x800" alt="image1678.png" title="image1678.png" /&gt;&lt;/a&gt;&lt;br /&gt;В левую часть добавим SecurityPicker с ним мы встречались, когда создавали панель инструментов.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108052/image7627.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108052/image7627.png?size=800x800" alt="image7627.png" title="image7627.png" /&gt;&lt;/a&gt;&lt;br /&gt;Правую часть разобьем на части по вертикали. Сверху правой части будет стакан&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108053/image1159.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108053/image1159.png?size=800x800" alt="image1159.png" title="image1159.png" /&gt;&lt;/a&gt;&lt;br /&gt;У MarketDepthControl необходимо задать какое-нибудь значение MaxHeight иначе приложение не будет запускаться.&lt;br /&gt;Под стаканом расположим элементы задания портфеля, цены, и объёма заявки &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108054/image8282.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108054/image8282.png?size=800x800" alt="image8282.png" title="image8282.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь стоит отметить свойство Label у LayoutItem, оно позволяет заладь текст перед элементом. А также элемент SpinEdit от DevExpress в котором удобно задавать численные значения. Выглядят эти элементы следующим образом.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108055/image4967.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108055/image4967.png?size=800x800" alt="image4967.png" title="image4967.png" /&gt;&lt;/a&gt;&lt;br /&gt;Еще ниже расположим кнопки купить, продать.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108056/image62.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108056/image62.png?size=800x800" alt="image62.png" title="image62.png" /&gt;&lt;/a&gt;&lt;br /&gt;Полный код&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108057/image9810.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108057/image9810.png?size=800x800" alt="image9810.png" title="image9810.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе MarketDepthControl зададим источник инструментов для SecurityPicker и источник портфелей для PortfolioComboBox, в нашем случае это будет Connector.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108058/image651.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108058/image651.png?size=800x800" alt="image651.png" title="image651.png" /&gt;&lt;/a&gt;&lt;br /&gt;Создадим обработчик события выделения инструмента в SecurityPicker. В нем проверяем не равен ли нулю полученный инструмент. Если он не равен нулю сохраняем полученный инструмент в локальную переменную, нам он пригодиться при обновлении стакана. После чего очищаем регистрируем полученный инструмент в Connector на получение стакана с помощью метода RegisterMarketDepth. С помощь метода GetMarketDepth получаем текущий стакана по инструменту, чтобы им обновить MarketDepthControl.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108059/image3667.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108059/image3667.png?size=800x800" alt="image3667.png" title="image3667.png" /&gt;&lt;/a&gt;&lt;br /&gt;Чтобы стакан постоянно обновлялся в конструкторе MarketDepthControl подпишемся на событие изменения стакана MarketDepthChanged у коннектора. В обработчике этого события будем проверять какому инструменту принадлежит полученный стакан, и если он принадлежит выделенному инструменту в SecurityPicker то обновляем им MarketDepthControl.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108060/image4084.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108060/image4084.png?size=800x800" alt="image4084.png" title="image4084.png" /&gt;&lt;/a&gt;&lt;br /&gt;В центральную части MainWindow добавляем созданную панель MarketDepthControl &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108061/image7347.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108061/image7347.png?size=800x800" alt="image7347.png" title="image7347.png" /&gt;&lt;/a&gt;&lt;br /&gt;На данном этапе можно запустить программу и проверить работу обновления стаканов.&lt;br /&gt;Создадим обработчика события нажатия на кнопки купить и продать. В каждом обработчике создаем Order, в нем указываем инструмент выбранный в SecurityPicker, портфель выбранный в PortfolioComboBox, объём и цену из соответствующих SpinEdit. Регистрируем заявку в Connector с помощью метода RegisterOrder.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108062/image7717.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108062/image7717.png?size=800x800" alt="image7717.png" title="image7717.png" /&gt;&lt;/a&gt;&lt;br /&gt;Оба обработчика отличаются только направлением заявки. &lt;br /&gt;Сделаем чтобы при выделении котировки в стакане значение SpinEditPrice менялось на цену выделенной котировки. Для этого создадим обработчик события SelectionChanged у MarketDepthControl. В котором будем обновлять значение SpinEditPrice ценой выделенной котировки если выделенная котировка не равна нулю.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108063/image90.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108063/image90.png?size=800x800" alt="image90.png" title="image90.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запускаем для проверки&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108064/image8902.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108064/image8902.png?size=800x800" alt="image8902.png" title="image8902.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Сохранение маркет-данных&lt;/h2&gt;&lt;br /&gt;Для сохранения портфелей, инструментов, площадок нам необходим класс CsvEntityRegistry. В него надо переделать место хранения сущностей и вызвать метод Init, для их загрузки.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108065/image7322.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108065/image7322.png?size=800x800" alt="image7322.png" title="image7322.png" /&gt;&lt;/a&gt;&lt;br /&gt;Для сохранения свечей, сделок и т.д. нам понадобиться StorageRegistry&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108066/image809.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108066/image809.png?size=800x800" alt="image809.png" title="image809.png" /&gt;&lt;/a&gt;&lt;br /&gt;Также нам понадобиться реестр хранилищ-снэпшотов SnapshotRegistry&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108067/image4003.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108067/image4003.png?size=800x800" alt="image4003.png" title="image4003.png" /&gt;&lt;/a&gt;&lt;br /&gt;Все это мы передаем в Connector при его создании&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108068/image6704.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108068/image6704.png?size=800x800" alt="image6704.png" title="image6704.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь я также указал что Connector будет переподключаться при разрыве подключения, а также указал сколько дней истории необходимо загружать. &lt;br /&gt;Строка Connector.LookupAll(); запрашивает имеющиеся данные.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108069/image6016.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108069/image6016.png?size=800x800" alt="image6016.png" title="image6016.png" /&gt;&lt;/a&gt;&lt;br /&gt;После загрузки приложения перейдя в папку Data мы увидим, что появились новые папки.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108070/image7577.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108070/image7577.png?size=800x800" alt="image7577.png" title="image7577.png" /&gt;&lt;/a&gt;&lt;br /&gt;А при повторном подключении панели инструментов и портфелей уже будут заполнены.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание панели со стратегией&lt;/h2&gt;&lt;br /&gt;Панель стратегий я буду создавать также, как и все предыдущие панели. &lt;br /&gt;В папку XAML добавляем еще один UserControl. Дадим ему имя StrategyControl. С помощь LayoutControl разобьём экранную форму на две части. &lt;br /&gt;В левой части будут вкладка с свечным графиком &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108071/image344.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108071/image344.png?size=800x800" alt="image344.png" title="image344.png" /&gt;&lt;/a&gt;&lt;br /&gt;А также вкладка статистикой стратегии, &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108072/image4907.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108072/image4907.png?size=800x800" alt="image4907.png" title="image4907.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь я использую StatisticParameterGrid для отображения статистики стратегии, а также EquityCurveChart для отображения графика прибыли и убытка.&lt;br /&gt;У StatisticParameterGrid необходимо задать какое-нибудь значение MaxHeight иначе приложение не будет запускаться.&lt;br /&gt;В правой части будет проводиться настройка свойств стратегии в PropertyGridEx&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108073/image721.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108073/image721.png?size=800x800" alt="image721.png" title="image721.png" /&gt;&lt;/a&gt;&lt;br /&gt;А также кнопки запуска и остановки стратегии.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108074/image1047.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108074/image1047.png?size=800x800" alt="image1047.png" title="image1047.png" /&gt;&lt;/a&gt;&lt;br /&gt;Полный код &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108075/image2510.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108075/image2510.png?size=800x800" alt="image2510.png" title="image2510.png" /&gt;&lt;/a&gt;&lt;br /&gt;В конструкторе StrategyControl задаем Connector как источники данных для PropertyGridEx, почти в каждом контроле мы выполняли подобные действия.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108076/image8773.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108076/image8773.png?size=800x800" alt="image8773.png" title="image8773.png" /&gt;&lt;/a&gt;&lt;br /&gt;Нам необходимо как-то передать стратегию в наш контрол. Для этого в StrategyControl создам метод BindStraregy в который будет принимать стратегию, сохранять ссылку на нее в локальной переменной, а также задавать стратегию в PropertyGridEx и StatisticParameterGrid.&lt;br /&gt;С помощь метода SetChart в стратегию предаём график свечей Chart, после этого в стратегии Chart можно будет получить с помощью метода GetChart. Также задаем Connector для стратегии.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108077/image8230.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108077/image8230.png?size=800x800" alt="image8230.png" title="image8230.png" /&gt;&lt;/a&gt;&lt;br /&gt;При работе с графиком прибыли и убытков надо учесть, что стратегия будем запускать и останавливать и возможно несколько раз, поэму с каждым запуском стратегии график надо очищать. Для это создадим метод ResetEquityCurveChart в котором будем сначала очищать EquityCurveChart. После чего нам необходимо создать графические элементы для EquityCurveChart, им можно указать имя, цвет и тип линии.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108078/image6360.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108078/image6360.png?size=800x800" alt="image6360.png" title="image6360.png" /&gt;&lt;/a&gt;&lt;br /&gt;После чего подпишемся на событие изменения PnL у стратегии и в обработчике этого события отрисовываем новое значение на графике прибыли убытков EquityCurveChart.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108079/image3106.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108079/image3106.png?size=800x800" alt="image3106.png" title="image3106.png" /&gt;&lt;/a&gt;&lt;br /&gt;Полный код метода&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108080/image2024.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108080/image2024.png?size=800x800" alt="image2024.png" title="image2024.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события нажатия на кнопку Старт будем вызвать этот метод. А также будем сбрасывать состояние стратегии и запускать ее. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108081/image3375.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108081/image3375.png?size=800x800" alt="image3375.png" title="image3375.png" /&gt;&lt;/a&gt;&lt;br /&gt;В обработчике события нажатия на кнопку Стоп будем останавливать стратегию.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108082/image3399.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108082/image3399.png?size=800x800" alt="image3399.png" title="image3399.png" /&gt;&lt;/a&gt;&lt;br /&gt;В центральную части MainWindow добавляем созданную панель StrategyControl&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108083/image8678.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108083/image8678.png?size=800x800" alt="image8678.png" title="image8678.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание стратегии&lt;/h2&gt;&lt;br /&gt;Для примера рассмотрим создание простой стратегии со свечами. Которая будет покупать если свеча растущая (зеленая) и продавать если свеча убывающая (красная).&lt;br /&gt;Создадим еще одну папку в проекте в ней будем хранить все наши стратегии. В этой папке создаем новый класс и назовем его SimpleStrategy. Все стратегии S# должны наследоваться от базового класса стратегии Strategy.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108084/image1577.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108084/image1577.png?size=800x800" alt="image1577.png" title="image1577.png" /&gt;&lt;/a&gt;&lt;br /&gt;Так как наша стратегия использует свечи то создадим публичное свойство CandleSeries а в конструкторе нашей стратегии зададим ему значение по умолчанию.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108085/image442.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108085/image442.png?size=800x800" alt="image442.png" title="image442.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь я указал что свечи в CandleSeries будут TimeFrameCandle, с интервалом 15 секунд (TimeSpan.FromSeconds(15)). Для CandleSeries можно указать режим создания свечей BuildCandlesMode. Я указал что свечи будут построены (MarketDataBuildModes.Build), по умолчанию они будут строиться из тиков, но можно указать и другие типы данных.&lt;br /&gt;Так как CandleSeries мы сделали публичным свойством, то CandleSeries можно будет дополнительно настроить из PropertyGridEx описанном в предыдущем пункте.&lt;br /&gt;Все стратегии имеют методы который можно переопределить, нам понадобиться переопределить метод OnStarted. Который вызывается перед запуском стратегии и позволяет предварительно задать ей стартовое состояние.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108086/image6026.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108086/image6026.png?size=800x800" alt="image6026.png" title="image6026.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь мы для CandleSeries задаем инструмент, который указывается в PropertyGridEx. После чего создаем правило обработки законченной свечи. О работе с правилами можно ознакомиться в документации. В правиле указываем метод, который будет обрабатывать каждую законченную свечу в нашем случае это метод ProcessCandle он будет описан позже. После того как все задано подписываемся на появление свечей по CandleSeries в коннекторе через метод SubscribeCandles.&lt;br /&gt;В нашем случае метод ProcessCandle и содержит основную логику стратегии.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108087/image3324.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108087/image3324.png?size=800x800" alt="image3324.png" title="image3324.png" /&gt;&lt;/a&gt;&lt;br /&gt;В первую очередь нам необходимо определить является ли свеча реал тайм или исторической, если свеча историческая, то мы ее игнорируем. Не все стратегии требуют этого, например для стратегий основанные на стаканах не требуют этого так как стаканы идут всегда реал тайм. Нет универсального способа определить   является ли свеча реал тайм или исторической, и в каждой стратегии эту проблему придется решать самостоятельно в зависимости от требований стратегии. В данном случае я просто буду сравнивать время закрытие свечи с временем в коннекторе и если оно не превышает определенный лаг, то свечу считаю реал тайм.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108088/image2732.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108088/image2732.png?size=800x800" alt="image2732.png" title="image2732.png" /&gt;&lt;/a&gt;&lt;br /&gt;Далее смотрим на то какая это свеча и какая текущая позиция у стратегии. Если свеча растущая, то при позиции равной 0 мы откроем позицию рыночным ордером на объём, заданный нами в PropertyGridEx. Если свеча растущая и позиция меньше 0 то мы переворачиваем позицию.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108089/image4474.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108089/image4474.png?size=800x800" alt="image4474.png" title="image4474.png" /&gt;&lt;/a&gt;&lt;br /&gt;Противоположные действия делаем для убывающей свечи.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108090/image5127.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108090/image5127.png?size=800x800" alt="image5127.png" title="image5127.png" /&gt;&lt;/a&gt;&lt;br /&gt;На данный момент наша стратегия готова к работе. Ее необходимо передать в SimpleStrategyControl который мы создали в предыдущем пункте с помощью метода BindStraregy. Это мы делаем в конструкторе MainWindow сразу после инициализации компонентов MainWindow.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108091/image374.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108091/image374.png?size=800x800" alt="image374.png" title="image374.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запустим для проверки.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108092/image9399.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108092/image9399.png?size=800x800" alt="image9399.png" title="image9399.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108093/image5010.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108093/image5010.png?size=800x800" alt="image5010.png" title="image5010.png" /&gt;&lt;/a&gt;&lt;br /&gt;Стратегия работает, совершаются сделки, но пока нет свечей и сделок на графике.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Добавление свечей и сделок на график из стратегии&lt;/h2&gt;&lt;br /&gt;В пункте про панель стратегий с помощь метода SetChart в стратегию мы предали график свечей Chart. В методе OnStarted стратегии проверяем установлен ли График у стратегии и если он установлен, то инициализируем график, а также подписываемся на события появления новой собственной сделки и изменения свечи. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108094/image5547.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108094/image5547.png?size=800x800" alt="image5547.png" title="image5547.png" /&gt;&lt;/a&gt;&lt;br /&gt;Метод инициализации графика InitChart. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108095/image977.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108095/image977.png?size=800x800" alt="image977.png" title="image977.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь мы сохраняем ссылку на Сhart в локальной переменной. Очищаем график. А также создаем и передаем на график элементы графика для свечей и сделок. &lt;br /&gt;Конструкция _chart.GuiSync(() =&amp;gt;{ ... }); нужна для того чтобы инициализация графика выполнилась в главном потоке.&lt;br /&gt;Метод отрисовки свечей на графике CandleSeriesProcessing.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108096/image9921.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108096/image9921.png?size=800x800" alt="image9921.png" title="image9921.png" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь мы получаем свеча из события CandleSeriesProcessing коннектора, создаем ChartDrawData для отображения его на графике. Указываем время data.Group(candle.OpenTime), указываем что свечу надо добавить в свечной элемент графика .Add(_chartCandleElement, candle);. И указываем что графику надо прорисовать новые данные.&lt;br /&gt;Аналогичные действия выполняем для сделок. &lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108097/image4611.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108097/image4611.png?size=800x800" alt="image4611.png" title="image4611.png" /&gt;&lt;/a&gt;&lt;br /&gt;Запустим для проверки.&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/108098/image944.png' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/108098/image944.png?size=800x800" alt="image944.png" title="image944.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Краткий вывод&lt;/h2&gt;&lt;br /&gt;Для создание сложного и профессионально выглядящего приложения не нужно тратить массу времени. Мы за несколько часов создали полноценное приложение с возможностью конфигурирование, отображения и непосредственной торговли. &lt;br /&gt;Не бойтесь пробовать и создавать свои программы. Надеюсь, эта статья вам поможет освоиться в этом деле.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14638/</id>
    <title type="text">Коннектор МТ4</title>
    <published>2020-10-30T13:08:13Z</published>
    <updated>2020-11-03T11:07:16Z</updated>
    <author>
      <name>Sergey Mitrofanov</name>
      <uri>https://stocksharp.ru/users/134672/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Добрый день! Приобрел у Вас коннектор к мт4 для использования в связке МТ4-Ритмик, установил через инсталлер, у меня  файл длл и папка с файлами длл. Инструкции что делать дальше нет. Куда и что я не знаю. Подскажите. &lt;a href="https://stocksharp.ru/away/?u=AQAAAAAAAAA5kI99dEdbB0zY1sUn0Zsw2Nm9aLmjP7nsBapJfblIuA"&gt;serg150115@bk.ru&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14624/</id>
    <title type="text">Новый сервис S#.Freelance!</title>
    <published>2020-10-29T10:20:25Z</published>
    <updated>2020-11-03T00:39:35Z</updated>
    <author>
      <name>ILYA</name>
      <uri>https://stocksharp.ru/users/127794/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <category term="Программирование роботов" />
    <category term="Алготрейдинг" />
    <category term="Новости" />
    <category term="ТехПоддержка" />
    <category term="робот форекс" />
    <category term="биткоин" />
    <category term="роботы" />
    <category term="программы" />
    <category term="коммьюнити" />
    <content type="html">Дорогие друзья! [happy]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;em&gt;&lt;h2&gt;У нас для вас отличная новость! &lt;/h2&gt;&lt;/em&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href='https://stocksharp.ru/file/116644/algp-trading-news.jpg' class='lightview' data-lightview-options="skin: 'mac'" data-lightview-group='mixed'&gt;&lt;img src="https://stocksharp.ru/file/116644/algp-trading-news.jpg?size=800x800" alt="algp-trading-news.jpg" title="algp-trading-news.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Мы рады представить вам наш новый сервис &lt;b&gt;&lt;em&gt;&lt;u&gt;&lt;a href="https://stocksharp.ru/support/" title="https://stocksharp.ru/support/"&gt;S#.Freelance&lt;/a&gt;&lt;/u&gt;&lt;/em&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;В связи с тем, что наше комьюнити постоянно растёт и у вас возникает всё больше и больше вопросов по поводу наших &lt;a href="https://stocksharp.ru/products/" title="https://stocksharp.ru/products/"&gt;продуктов&lt;/a&gt;, &lt;a href="https://stocksharp.ru/support/" title="https://stocksharp.ru/support/"&gt;&lt;b&gt;S#.Freelance&lt;/b&gt; &lt;/a&gt;&lt;b&gt;&lt;h2&gt;разработан, что бы найти ответы на ваши вопросы и решить поставленные задачи.&lt;/h2&gt;  &lt;/b&gt;&lt;br /&gt;&lt;span style="color:red"&gt;&lt;b&gt;&lt;span style="font-size:140%"&gt;Теперь вы сами можете выступить в роли помощника за вознаграждение так же, как и можете найти того, кто будет готов оказать вам помощь! &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;em&gt;&lt;u&gt;Команда S#&lt;/u&gt;&lt;/em&gt;&lt;/b&gt; будет постоянно на связи по всем критическим вопросам и гарантирует вам полную прозрачность получения услуг и осуществления платежей! &lt;br /&gt;&lt;br /&gt;Желаем вам приятного использования![wink]&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14636/</id>
    <title type="text">S# Терминал</title>
    <published>2020-10-30T12:09:55Z</published>
    <updated>2020-10-30T12:09:55Z</updated>
    <author>
      <name>alexvolt2005</name>
      <uri>https://stocksharp.ru/users/104905/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Здравствуйте. В    S#.Terminal не работают кластерный профиль и Профиль объема. Как можно это настроить.Спасибо.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14617/</id>
    <title type="text">Ben I need help</title>
    <published>2020-10-27T17:02:05Z</published>
    <updated>2020-10-27T17:02:05Z</updated>
    <author>
      <name>YuryB</name>
      <uri>https://stocksharp.ru/users/100611/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Test 2</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14615/</id>
    <title type="text">Security пустое</title>
    <published>2020-10-27T09:43:43Z</published>
    <updated>2020-10-27T09:43:43Z</updated>
    <author>
      <name>Greenn</name>
      <uri>https://stocksharp.ru/users/99877/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Как с помощью генератора стаканов обновлять значения Security?</content>
  </entry>
  <entry>
    <id>https://stocksharp.ru/topic/14607/</id>
    <title type="text">Ben I need help 2</title>
    <published>2020-10-22T22:19:09Z</published>
    <updated>2020-10-22T22:23:48Z</updated>
    <author>
      <name>YuryB</name>
      <uri>https://stocksharp.ru/users/100611/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">This is a test message 2</content>
  </entry>
</feed>