
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ, рд╣рдо рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдФрд░ рд╕реНрдЯреЙрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореБрдХреНрдд
рд╕реНрдЯреЙрдХрд╢рд░реНрдк рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ C # рдореЗрдВ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд░реЛрдмреЛрдЯ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ S # .API рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЧреНрд░рд╛рдлрд┐рдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдЯрд░реНрдорд┐рдирд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ?
- рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2017 (рдХрдореНрдпреБрдирд┐рдЯреА, рдлреНрд░реА рд╡рд░реНрдЬрди), рдЗрд╕рдореЗрдВ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░реЗрдВрдЧреЗред
- рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкрд░ рдЯреНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди, рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЖрдИрдЯреАрдЖрдИ рдХреИрдкрд┐рдЯрд▓ рд╕реЗ 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); } }
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗ:
рдЕрдзрд┐рдХрд╛рдВрд╢ 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 {
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() {
рдЕрдВрдзреЗрд░реЗ рд╡рд┐рд╖рдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПрдБ:

рдЯреВрд▓рдмрд╛рд░ рдмрдирд╛рдПрдВ
рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдХрд╣реЗрдВрдЧреЗред рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ 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 рдмрдирд╛рдПрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рд╕реНрд░реЛрдд рдФрд░ рд╢реНрд░реЛрддрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░реЗрдВ:
рдЯреВрд▓рдмрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ, 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 (); рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз:
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдирдП рдлрд╝реЛрд▓реНрдбрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ:

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