рд╣рдо рд╕реНрдЯреЙрдХрд╢рд╛рд░реНрдк рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рднрд╛рдЧ 1



рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ, рд╣рдо рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдФрд░ рд╕реНрдЯреЙрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореБрдХреНрдд рд╕реНрдЯреЙрдХрд╢рд░реНрдк рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ C # рдореЗрдВ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ S # .API рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЧреНрд░рд╛рдлрд┐рдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдЯрд░реНрдорд┐рдирд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ?


  1. рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2017 (рдХрдореНрдпреБрдирд┐рдЯреА, рдлреНрд░реА рд╡рд░реНрдЬрди), рдЗрд╕рдореЗрдВ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░реЗрдВрдЧреЗред
  2. рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкрд░ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди, рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЖрдИрдЯреАрдЖрдИ рдХреИрдкрд┐рдЯрд▓ рд╕реЗ SMARTcom рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг


Visual Studio рдореЗрдВ рдПрдХ рдирдпрд╛ WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдБ:



рдлрд┐рд░ рдЖрдкрдХреЛ S # .API рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк Nuget рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реИред

рдЪреВрдБрдХрд┐ рд╕рднреА S # .API рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡ DevExpress рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдФрд░ DevExpress рд▓рд╛рдЗрдмреНрд░реЗрд░реА S # .API рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдирд╛ рдореВрд░реНрдЦрддрд╛ рд╣реЛрдЧреАред рдЖрдЗрдП рд╡рд┐рдВрдбреЛ рдПрдбрд┐рдЯрд░ MainWindow.xaml рдкрд░ рдЬрд╛рдПрдВ:



DXWindow рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдмрджрд▓реЗрдВ, рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧ рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:



рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЦреБрдж рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред

рд╣рдо рд╡рд┐рдВрдбреЛ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ - рд╢реАрд░реНрд╖ рдкрд░ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рдкрдЯреНрдЯреА рд╣реЛрдЧреА, рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реЛрдЧреА, рдФрд░ рдмреАрдЪ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдкреИрдирд▓ рд╣реЛрдВрдЧреЗред рдПрдХ рдЦрд┐рдбрд╝рдХреА рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ DevExpress рдХреЗ LayoutControl рдХреЗ рд╕рд╛рде рд╣реИред

рдкрд░рд┐рдгрд╛рдореА рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ, рд╣рдо рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

<dx:DXWindow x:Class="ShellNew.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <dxlc:LayoutControl Padding="0" Name="LayoutControlRoot" Orientation="Vertical"> <dxlc:LayoutGroup HorizontalAlignment="Stretch" Height="25"> <!--  --> </dxlc:LayoutGroup> <dxlc:LayoutGroup HorizontalAlignment="Stretch" > <!--  --> </dxlc:LayoutGroup> <dxlc:LayoutGroup HorizontalAlignment="Stretch" > <!--  --> </dxlc:LayoutGroup> </dxlc:LayoutControl> </dx:DXWindow> 

рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрдЯрди, рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди, рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдмрдЯрдиред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DevExpress рд╕реЗ SimpleButton рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдмрдЯрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдореЗрдВ рд╣рдо S # .рдбрд┐рдЬрд╛рдЗрдирд░ , S # .рдбрд╛рдЯрд╛ рдФрд░ S # .рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ ред

 <dx:DXWindow x:Class="ShellNew.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" xmlns:xaml="http://schemas.stocksharp.com/xaml" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <dxlc:LayoutControl Padding="0" Name="LayoutControlRoot" Orientation="Vertical"> <dxlc:LayoutGroup HorizontalAlignment="Stretch" Height="25"> <!--  --> <dxlc:LayoutItem Width="40"> <dx:SimpleButton x:Name="SettingsButton" Click="SettingsButton_Click" > <Image Source="{xaml:ThemedIcons Key=Settings}" Width="16" /> </dx:SimpleButton> </dxlc:LayoutItem> <dxlc:LayoutItem Width="40"> <dx:SimpleButton x:Name="ConnectButton" Click="ConnectButton_Click" > <Image Source="{xaml:ThemedIcons Key=Connect}" Width="16" /> </dx:SimpleButton> </dxlc:LayoutItem> </dxlc:LayoutGroup> <dxlc:LayoutGroup HorizontalAlignment="Stretch" View="Tabs"> <!--  --> </dxlc:LayoutGroup> <dxlc:LayoutGroup HorizontalAlignment="Stretch" > <!--  --> </dxlc:LayoutGroup> </dxlc:LayoutControl> </dx:DXWindow> 

рд╕реНрдХреНрд░реАрди рдлреЙрд░реНрдо рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВрдЧреЗ:



рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдореЗрдирд╡рд┐рдВрдбреЛ рдХреЛрдб рдореЗрдВ, рдЖрдкрдХреЛ рдХрдиреЗрдХреНрдЯрд░, рд╕рд╛рде рд╣реА рд╕реНрдерд╛рди рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрдиреЗрдХреНрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред

 public readonly Connector Connector; private const string _dir = "Data"; private static readonly string _settingsFile = $@"{_dir}\connection.xml"; 

рдХрдиреЗрдХреНрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗред

 private void SettingsButton_Click(object sender, RoutedEventArgs e) { if (Connector.Configure(this)) { new XmlSerializer<SettingsStorage>().Serialize(Connector.Save(), _settingsFile); } } 

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ:

 //---------------------------------------------------------------------------------- Directory.CreateDirectory(_dir); Connector = new Connector(); if (File.Exists(_settingsFile)) { Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile)); } //---------------------------------------------------------------------------------- 

рдЕрдзрд┐рдХрд╛рдВрд╢ S # .API рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рд▓реЛрдб рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА XML рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрдиреЗрдХреНрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдзрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред

  private void ConnectButton_Click(object sender, RoutedEventArgs e) { Connector.Connect(); } 

рдЕрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдбрд╛рд░реНрдХ рдереАрдо рд╕реЗрдЯ рдХрд░рдирд╛


рдХрдИ рд╡реНрдпрд╛рдкрд╛рд░реА рдЯреНрд░реЗрдбрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд╛рд░реНрдХ рдереАрдо рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдереАрдо рдХреЛ рдЕрдВрдзреЗрд░рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ App.xaml рдлрд╝рд╛рдЗрд▓ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд╛рд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ: рдЗрд╕рдореЗрдВ ExtendedBaseApplication, рдФрд░ Visual Studio рд╕реНрд╡рдпрдВ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред

 <charting:ExtendedBaseApplication x:Class="ShellNew.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:charting="http://schemas.stocksharp.com/xaml" StartupUri="MainWindow.xaml"> </charting:ExtendedBaseApplication> 

рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ App.xaml.cs рдЖрдкрдХреЛ ": рдЕрдиреБрдкреНрд░рдпреЛрдЧ" рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 namespace ShellNew { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App { } } 

ApplicationThemeHelper.ApplicationThemeName = Theme.VS2017DarkName;

рдлрд┐рд▓рд╣рд╛рд▓ рдкреВрд░рд╛ рдХреЛрдб:

 public partial class MainWindow { public readonly Connector Connector; private const string _dir = "Data"; private static readonly string _settingsFile = $@"{_dir}\connection.xml"; public MainWindow() { //---------------------------------------------------------------------------------- ApplicationThemeHelper.ApplicationThemeName = Theme.VS2017DarkName; //---------------------------------------------------------------------------------- Directory.CreateDirectory(_dir); Connector = new Connector(); if (File.Exists(_settingsFile)) { Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile)); } //---------------------------------------------------------------------------------- InitializeComponent(); } private void SettingsButton_Click(object sender, RoutedEventArgs e) { if (Connector.Configure(this)) { new XmlSerializer<SettingsStorage>().Serialize(Connector.Save(), _settingsFile); } } private void ConnectButton_Click(object sender, RoutedEventArgs e) { Connector.Connect(); } } 

рдЕрдВрдзреЗрд░реЗ рд╡рд┐рд╖рдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПрдБ:



рдЯреВрд▓рдмрд╛рд░ рдмрдирд╛рдПрдВ


рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдХрд╣реЗрдВрдЧреЗред рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ UserControll рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕реЗ SecurityGridControl рдирд╛рдо рджреЗрдВред



рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ SecurityPicker рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ рдЙрдкрд▓рдмреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдЕрдиреБрд░реВрдк, рд╣рдо DevExpress рд╕реЗ рд▓реЗрдЖрдЙрдЯрдХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 <UserControl x:Class="ShellNew.XAML.SecurityGridControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:xaml="http://schemas.stocksharp.com/xaml" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <xaml:SecurityPicker x:Name="SecPicker" /> </UserControl> 

рдЖрдЗрдП рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдордзреНрдп рднрд╛рдЧ рдХреЛ рдмреБрдХрдорд╛рд░реНрдХ рджреГрд╢реНрдп рдореЗрдВ рдмрджрд▓реЗрдВред рдХрд┐рд╕реА рдПрдХ рдмреБрдХрдорд╛рд░реНрдХ рдореЗрдВ рд╣рдо рдЙрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ:

 <dxlc:LayoutGroup HorizontalAlignment="Stretch" View="Tabs"> <!--  --> <dxlc:LayoutGroup Header="Securities"> <myxaml:SecurityGridControl x:Name="SecurityPanel" /> </dxlc:LayoutGroup> </dxlc:LayoutGroup> 

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреВрд▓рдмрд╛рд░ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдХрдиреЗрдХреНрдЯрд░ рд╣реИред рдЖрдк рдмрд╕ MainWindow
SecurityPanel.SecPicker.SecurityProvider = Connector;
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ MainWindow
SecurityPanel.SecPicker.SecurityProvider = Connector;
рд╕рдХрддреЗ рд╣реИрдВ MainWindow
SecurityPanel.SecPicker.SecurityProvider = Connector;
ред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ MainWindow рдХреЛ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реНрдЯреИрдЯрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ MainWindow рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ MainWindow рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ:

 тАж public static MainWindow Instance; тАж Instance = this; тАж 

рдЕрдм, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ рднреА, рд╣рдо MainWindow.Instance.XXX рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ MainWindow рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

SecurityGridControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 public SecurityGridControl() { InitializeComponent(); SecPicker.SecurityProvider = MainWindow.Instance.Connector; } 

рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:



рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛


рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдХрдиреЗрдХреНрдЯрд░ рдпрд╛ рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, S # .API рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ LogManager рд╡рд░реНрдЧ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд░реЛрдд рдХрдиреЗрдХреНрдЯрд░, рд░рдгрдиреАрддрд┐ рдЖрджрд┐ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╢реНрд░реЛрддрд╛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рд▓реЙрдЧ рдкреИрдирд▓ рд╣реЛрдЧрд╛ред

MainWindow рдХреЛрдб рдореЗрдВ, рд╣рдо LogManager рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 public readonly LogManager LogManager; private static readonly string _logsDir = $@"{_dir}\Logs\"; 

MainWindow рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдПрдХ LogManager рдмрдирд╛рдПрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рд╕реНрд░реЛрдд рдФрд░ рд╢реНрд░реЛрддрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ:

 //---------------------------------------------------------------------------------- LogManager = new LogManager(); LogManager.Sources.Add(Connector); LogManager.Listeners.Add(new FileLogListener { SeparateByDates = SeparateByDateModes.SubDirectories, LogDirectory = _logsDir }); //---------------------------------------------------------------------------------- 

рдЯреВрд▓рдмрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ, XAML рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд▓реЙрдЧ рдкреИрдирд▓ рдмрдирд╛рдПрдВ, рдПрдХ рдФрд░ UserControl рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ MonitorControl рдирд╛рдо рджреЗрдВред рдЗрд╕рдореЗрдВ рдореЙрдирд┐рдЯрд░ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВред

 <UserControl x:Class="ShellNew.XAML.MonitorControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:xaml="http://schemas.stocksharp.com/xaml" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <xaml:Monitor x:Name="Monitor" /> </UserControl> 

рдореЙрдирд┐рдЯрд░рдХрдВрдЯреНрд░реЛрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд▓реЙрдЧрдореИрди рдХреЛ рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВ:

 public MonitorControl() { InitializeComponent(); MainWindow.Instance.LogManager.Listeners.Add(new GuiLogListener(Monitor)); } 

рдмрдирд╛рдП рдЧрдП рдореЙрдирд┐рдЯрд░рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рдореЗрдирд╡рд┐рдВрдбреЛ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:

 <dxlc:LayoutGroup HorizontalAlignment="Stretch" dxlc:LayoutControl.AllowVerticalSizing="True"> <!--  --> <myxaml:MonitorControl x:Name="MonitorControl" /> </dxlc:LayoutGroup> 

рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:



рдПрдХ рдЧреНрд▓рд╛рд╕ рдкреИрдирд▓ рдмрдирд╛рдПрдВ


рдкрд┐рдЫрд▓реЗ рдкреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ, рдПрдХ рдЧреНрд▓рд╛рд╕ рдкреИрдирд▓ рдмрдирд╛рдПрдВ, рдПрдХреНрд╕рдПрдПрдордПрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдХрдВрдЯреНрд░реЛрд▓ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ MarketDepthControl рдирд╛рдо рджреЗрдВред

MainWindow рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА LayoutControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣рдо LayoutControl рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдкреИрдирд▓ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  <UserControl x:Class="ShellNew.XAML.MarketDepthControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" mc:Ignorable="d"> <dxlc:LayoutControl Padding="0" Name="LayoutControlRoot" Orientation="Horizontal"> <dxlc:LayoutGroup> <!--Left--> </dxlc:LayoutGroup> <dxlc:LayoutGroup Orientation="Vertical" dxlc:LayoutControl.AllowHorizontalSizing="True"> <!--Rigth--> </dxlc:LayoutGroup> </dxlc:LayoutControl> </UserControl> 

рдмрд╛рдИрдВ рдУрд░ рд╕реЗ SecurityPicker рдЬреЛрдбрд╝реЗрдВ - рдЬрдм рд╣рдордиреЗ рдЯреВрд▓рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдерд╛ рддреЛ рд╣рдо рдЙрд╕рдХреЗ рд╕рд╛рде рдорд┐рд▓реЗ рдереЗред

 <dxlc:LayoutGroup> <xaml:SecurityPicker x:Name="SecPicker" SecuritySelected="SecPicker_SecuritySelected" /> </dxlc:LayoutGroup>       .     : <dxlc:LayoutGroup Orientation="Vertical" dxlc:LayoutControl.AllowHorizontalSizing="True"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <xaml:MarketDepthControl x:Name="MarketDepth" MaxHeight="2000" SelectionChanged="MarketDepth_SelectionChanged" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> 

MarketDepthControl рдХреЛ рдХреБрдЫ рдореИрдХреНрд╕рд╣рд╛рдЗрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЧреНрд▓рд╛рд╕ рдХреЗ рдиреАрдЪреЗ, рд╣рдо рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХрд╛рд░реНрдп, рдореВрд▓реНрдп рдФрд░ рдСрд░реНрдбрд░ рд╡реЙрд▓реНрдпреВрдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦреЗрдВрдЧреЗ:

 <dxlc:LayoutItem Label="Portfolio" Height="20"> <xaml:PortfolioComboBox x:Name="PortfolioComboBox" /> </dxlc:LayoutItem> <dxlc:LayoutItem Label="Price" Height="20"> <dxe:SpinEdit MinValue="0" Name="SpinEditPrice" /> </dxlc:LayoutItem> <dxlc:LayoutItem Label="Volume" Height="20"> <dxe:SpinEdit MinValue="0" Name="SpinEditVolume" /> </dxlc:LayoutItem> 

рдпрд╣ LayoutItem рдХреЗ рд▓реЗрдмрд▓ рдЧреБрдг рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЗ рд╕рд╛рдордиреЗ рдкрд╛рда рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА DevExpress рд╕реЗ рд╕реНрдкрд┐рдирдПрдбрд┐рдЯ рддрддреНрд╡ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпреЗ рддрддреНрд╡ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:



рдиреАрдЪреЗ рд╣рдо рдЦрд░реАрдж рдФрд░ рдмрд┐рдХреНрд░реА рдмрдЯрди рд░рдЦреЗрдВрдЧреЗ:

 <dxlc:LayoutGroup Orientation="Horizontal" Height="20" VerticalAlignment="Stretch"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <dx:SimpleButton Content="Buy" x:Name="BuyButton" Click="BuyButton_Click" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch"> <dx:SimpleButton Content="Sell" x:Name="SelltButton" Click="SelltButton_Click" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> 

рдкреВрд░реНрдг рдХреЛрдб:

 <UserControl x:Class="ShellNew.XAML.MarketDepthControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:xaml="http://schemas.stocksharp.com/xaml" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" mc:Ignorable="d"> <dxlc:LayoutControl Padding="0" Name="LayoutControlRoot" Orientation="Horizontal"> <dxlc:LayoutGroup> <xaml:SecurityPicker x:Name="SecPicker" SecuritySelected="SecPicker_SecuritySelected" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Orientation="Vertical" dxlc:LayoutControl.AllowHorizontalSizing="True"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <xaml:MarketDepthControl x:Name="MarketDepth" MaxHeight="2000" SelectionChanged="MarketDepth_SelectionChanged" /> </dxlc:LayoutItem> <dxlc:LayoutItem Label="Portfolio" Height="20"> <xaml:PortfolioComboBox x:Name="PortfolioComboBox" /> </dxlc:LayoutItem> <dxlc:LayoutItem Label="Price" Height="20"> <dxe:SpinEdit MinValue="0" Name="SpinEditPrice" /> </dxlc:LayoutItem> <dxlc:LayoutItem Label="Volume" Height="20"> <dxe:SpinEdit MinValue="0" Name="SpinEditVolume" /> </dxlc:LayoutItem> <dxlc:LayoutGroup Orientation="Horizontal" Height="20" VerticalAlignment="Stretch"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <dx:SimpleButton Content="Buy" x:Name="BuyButton" Click="BuyButton_Click" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch"> <dx:SimpleButton Content="Sell" x:Name="SelltButton" Click="SelltButton_Click" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> </dxlc:LayoutGroup> </dxlc:LayoutControl> </UserControl> 

MarketDepthControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, SecurityPicker рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдФрд░ PortfolioComboBox рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХрд╛ рд╕реНрд░реЛрдд рд╕реЗрдЯ рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрдиреЗрдХреНрдЯрд░ рд╣реЛрдЧрд╛:

 public MarketDepthControl() { InitializeComponent(); SecPicker.SecurityProvider = MainWindow.Instance.Connector; PortfolioComboBox.Portfolios = new PortfolioDataSource(MainWindow.Instance.Connector); } 

SecurityPicker рдореЗрдВ рдЯреВрд▓ рдЪрдпрди рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВред рдЗрд╕рдореЗрдВ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдЯреВрд▓ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЯреВрд▓ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдпрд╣ рдЧреНрд▓рд╛рд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдлрд┐рд░ рд╣рдо RegisterMarketDepth рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреНрд▓рд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЯреВрд▓ рдХреЛ рд╕рд╛рдл рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред GetMarketDepth рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдореЗрдВ MarketDepthControl рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЧреНрд▓рд╛рд╕ рдорд┐рд▓рддрд╛ рд╣реИред

 private Security _selectedSecurity; private void SecPicker_SecuritySelected(Security security) { if (security == null) return; _selectedSecurity = security; MainWindow.Instance.Connector.RegisterMarketDepth(_selectedSecurity); var marketDepth = MainWindow.Instance.Connector.GetMarketDepth(_selectedSecurity); MarketDepth.UpdateDepth(marketDepth); } 

MarketDepthControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЧреНрд▓рд╛рд╕ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рдкрд░ MarketDepthChanged рдЧреНрд▓рд╛рд╕ рдЪреЗрдВрдЬ рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдЧреНрд▓рд╛рд╕ рдХрд┐рд╕ рдЯреВрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ SecurityPicker рдореЗрдВ рдЪрдпрдирд┐рдд рдЯреВрд▓ рдХрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: MarketDepthControlред

 public MarketDepthControl() { InitializeComponent(); SecPicker.SecurityProvider = MainWindow.Instance.Connector; PortfolioComboBox.Portfolios = new PortfolioDataSource(MainWindow.Instance.Connector); MainWindow.Instance.Connector.MarketDepthChanged += Connector_MarketDepthChanged; } private void Connector_MarketDepthChanged(MarketDepth marketDepth) { if (_selectedSecurity == null || marketDepth.Security != _selectedSecurity) return; MarketDepth.UpdateDepth(marketDepth); } 

рдореЗрдирд╡рд┐рдВрдбреЛ рдХреЗ рдордзреНрдп рднрд╛рдЧ рдореЗрдВ, рдмрдирд╛рдИ рдЧрдИ MarketDepthControl рдкреИрдирд▓ рдЬреЛрдбрд╝реЗрдВ:

 <dxlc:LayoutGroup HorizontalAlignment="Stretch" View="Tabs"> <!--  --> <dxlc:LayoutGroup Header="Securities"> <myxaml:SecurityGridControl x:Name="SecurityPanel" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="Portfolios"> <myxaml:PortfolioGridControl x:Name="PortfolioGridControl" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="Orders"> <myxaml:OrderGridControl x:Name="OrderGridControl" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="MyTrades"> <myxaml:MyTradeGridControl x:Name="MyTradeGridControl" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="MarketDepth"> <myxaml:MarketDepthControl x:Name="MarketDepthControl" /> </dxlc:LayoutGroup> </dxlc:LayoutGroup> 

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪрд╢реНрдореЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрдЯрди рдЦрд░реАрджрдиреЗ рдФрд░ рдмреЗрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВред рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣рдо рдПрдХ рдСрд░реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╣рдо SecurityPicker рдореЗрдВ рдЪреБрдиреЗ рдЧрдП рдЯреВрд▓, рдкреЛрд░реНрдЯрдлрд╝реЛрд▓рд┐рдпреЛрдХреЙрдореНрдмрдмреЙрдХреНрд╕ рдореЗрдВ рдЪреБрдиреЗ рдЧрдП рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ, рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдкрд┐рдирдПрдбрд┐рдЯ рд╕реЗ рд╡реЙрд▓реНрдпреВрдо рдФрд░ рдХреАрдордд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред RegisterOrder рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред

 private void BuyButton_Click(object sender, RoutedEventArgs e) { Order order = new Order() { Security = _selectedSecurity, Portfolio = PortfolioComboBox.SelectedPortfolio, Volume = SpinEditVolume.Value, Price = SpinEditPrice.Value, Direction = StockSharp.Messages.Sides.Buy, }; MainWindow.Instance.Connector.RegisterOrder(order); } private void SelltButton_Click(object sender, RoutedEventArgs e) { Order order = new Order() { Security = _selectedSecurity, Portfolio = PortfolioComboBox.SelectedPortfolio, Volume = SpinEditVolume.Value, Price = SpinEditPrice.Value, Direction = StockSharp.Messages.Sides.Sell, }; MainWindow.Instance.Connector.RegisterOrder(order); } 

рджреЛрдиреЛрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рдЧреНрд▓рд╛рд╕ рдореЗрдВ рдЙрджреНрдзрд░рдг рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЪрдпрдирд┐рдд рдЙрджреНрдзрд░рдг рдХреА рдХреАрдордд рд╕реЗ рд╕реНрдкрд┐рдирдПрдбрд┐рдЯрдкреНрд░рд╛рдЗрд╕ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MarketDepthControl рдХреЗ рд▓рд┐рдП SelectionChanged рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВред рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЪрдпрдирд┐рдд рдЙрджреНрдзрд░рдг рдХреА рдХреАрдордд рдкрд░ SpinEditPrice рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдЪрдпрдирд┐рдд рдЙрджреНрдзрд░рдг рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред

 private void MarketDepth_SelectionChanged(object sender, GridSelectionChangedEventArgs e) { if (MarketDepth.SelectedQuote == null) return; SpinEditPrice.Value = MarketDepth.SelectedQuote.Price; } 

рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:



рд╕реЗрд╡рд┐рдВрдЧ рдорд╛рд░реНрдХреЗрдЯ рдбреЗрдЯрд╛


рд╡рд┐рднрд╛рдЧреЛрдВ, рдФрдЬрд╛рд░реЛрдВ, рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ CsvEntityRegistry рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрдХрд╛рдИ рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

  _csvEntityRegistry = new CsvEntityRegistry(_csvEntityRegistryDir); _csvEntityRegistry.Init(); 

рдореЛрдордмрддреНрддрд┐рдпреЛрдВ, рд╕реМрджреЛрдВ рдЖрджрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдореЗрдВ StorageRegistry рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  _storageRegistry = new StorageRegistry { DefaultDrive = new LocalMarketDataDrive(_storageRegistryDir), }; 

рд╣рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдиреИрдкрд╢реЙрдЯ рд░реАрдЬреЗрдВрд╕реА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 _snapshotRegistry = new SnapshotRegistry(_snapshotRegistryDir); 

рдпрд╣ рд╕рдм рддрдм рдмрдирддрд╛ рд╣реИ рдЬрдм рд╣рдо рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:

 Connector = new Connector(_csvEntityRegistry, _storageRegistry, _snapshotRegistry) { IsRestoreSubscriptionOnReconnect = true, StorageAdapter = { DaysLoad = TimeSpan.FromDays(3) }, }; Connector.LookupAll(); 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдпрд╣ рднреА рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдЯ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрдиреЗрдХреНрдЯрд░ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рджрд┐рдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрдиреЗрдХреНрдЯрд░ редookupAll (); рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз:

 //---------------------------------------------------------------------------------- Directory.CreateDirectory(_dir); _csvEntityRegistry = new CsvEntityRegistry(_csvEntityRegistryDir); _csvEntityRegistry.Init(); _storageRegistry = new StorageRegistry { DefaultDrive = new LocalMarketDataDrive(_storageRegistryDir), }; _snapshotRegistry = new SnapshotRegistry(_snapshotRegistryDir); Connector = new Connector(_csvEntityRegistry, _storageRegistry, _snapshotRegistry) { IsRestoreSubscriptionOnReconnect = true, StorageAdapter = { DaysLoad = TimeSpan.FromDays(3) }, }; Connector.LookupAll(); if (File.Exists(_settingsFile)) { Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile)); } //---------------------------------------------------------------------------------- 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдирдП рдлрд╝реЛрд▓реНрдбрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ:



рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЯреВрд▓рдмрд╛рд░ рдФрд░ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд░ рдЬрд╛рдПрдВрдЧреЗред

рд╣рдордиреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рдмрд╛рдЬрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рднрд╛рдЧ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ - рдЕрд░реНрдерд╛рддреН, рдореИрдиреНрдпреБрдЕрд▓ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рджреЛрдиреЛрдВ рдореЛрдб рдореЗрдВ рд╡реНрдпрд╛рдкрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

рд▓реЗрдЦрдХ : рдЗрд╡рд╛рди рдЬрд╝рд╛рд▓реБрддрд╕реНрдХреА

Source: https://habr.com/ru/post/hi432812/


All Articles