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



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

рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдкреИрдирд▓ рдмрдирд╛рдирд╛


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

<UserControl x:Class="ShellNew.XAML.PortfolioGridControl" 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:PortfolioGrid x:Name="PortfolioGrid" /> </UserControl> 

PortfolioGridControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдирдП рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдирдИ рд╕реНрдерд┐рддрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 public PortfolioGridControl() { InitializeComponent(); MainWindow.Instance.Connector.NewPortfolio += PortfolioGrid.Portfolios.Add; MainWindow.Instance.Connector.NewPosition += PortfolioGrid.Positions.Add; } 

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

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

 <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> 

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



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдм рд╣реИред

рдСрд░реНрдбрд░ рдХрд╛ рдкреИрдирд▓ рдмрдирд╛рдирд╛


S # .API рдореЗрдВ рдСрд░реНрдбрд░ рдмрд╛рд░ рдореЗрдВ рдСрд░реНрдбрд░ рдкреНрд▓реЗрд╕ рдХрд░рдиреЗ, рдСрд░реНрдбрд░ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЯреВрд▓рдмрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдордВрдЬрд╕реНрдп рдХрд░рдХреЗ, рдПрдХ рдСрд░реНрдбрд░ рдкреИрдирд▓ рдмрдирд╛рдПрдВ, XAML рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдФрд░ UserControl рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ рдСрд░реНрдбрд░рдЧреНрд░рд┐рдбрдХрдВрдЯреНрд░реЛрд▓ рдирд╛рдо рджреЗрдВред рдЗрд╕рдореЗрдВ рдСрд░реНрдбрд░рдЧреНрд░рд┐рдб рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ:

 <UserControl x:Class="ShellNew.XAML.OrderGridControl" 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:OrderGrid x:Name="OrderGrid" /> </UserControl> 

рдСрд░реНрдбрд░рдЧреНрд░рд┐рдб рдореЗрдВ рдПрдХ рдСрд░реНрдбрд░рд░рд╛рдЗрдЬрд┐рд╕реНрдЯрд░рд┐рдВрдЧ рдкрдВрдЬреАрдХрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо, рдСрд░реНрдбрд░рд░реЗрдЬрд┐рд╕реНрдЯрд░рд┐рд╕реНрдЯрд░ рд░реА-рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдЗрд╡реЗрдВрдЯ рдФрд░ рдСрд░реНрдбрд░рдХреИрдВрд╕рд▓рд┐рдВрдЧ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рд╣реИред

рдЖрдЗрдП рдЙрдирдХреЗ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВ:

 <UserControl x:Class="ShellNew.XAML.OrderGridControl" 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:OrderGrid x:Name="OrderGrid" OrderRegistering="OrderGrid_OnOrderRegistering" OrderReRegistering="OrderGrid_OnOrderReRegistering" OrderCanceling="OrderGrid_OnOrderCanceling" /> </UserControl> 

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

рддрдм рд╣рдо ShowModal рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдСрд░реНрдбрд░рд╡рд┐рдиреНрдбреЛ рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ OK рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо RegisterOrder рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ:

 private void OrderGrid_OnOrderRegistering() { var newOrder = new OrderWindow { Title = "Order registering", Order = new Order(), SecurityProvider = MainWindow.Instance.Connector, MarketDataProvider = MainWindow.Instance.Connector, Portfolios = new PortfolioDataSource(MainWindow.Instance.Connector), }; if (newOrder.ShowModal(this)) MainWindow.Instance.Connector.RegisterOrder(newOrder.Order); } 

рдЗрд╡реЗрдВрдЯ рд░реА-рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрд░реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдИрд╡реЗрдВрдЯ рдореЗрдВ рдЖрддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдСрд░реНрдбрд░ рд╣реИ рдЬрд┐рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, OrderWindow рдореЗрдВ, рд╣рдо Order = order.ReRegisterClone(newVolume: order.Balance) рдХреЛ рдСрд░реНрдбрд░рд╡рд┐рдВрдбреЛ рд╡рд┐рдВрдбреЛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рддрдм рд╣рдо ShowModal рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдСрд░реНрдбрд░рд╡рд┐рдиреНрдбреЛ рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ OK рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо ReRegisterClone рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЗрд╕реЗ рдкреБрд░рд╛рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдирдпрд╛, рдЬрд┐рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 private void OrderGrid_OnOrderReRegistering(Order order) { var window = new OrderWindow { Title = "Order re-registering", SecurityProvider = MainWindow.Instance.Connector, MarketDataProvider = MainWindow.Instance.Connector, Portfolios = new PortfolioDataSource(MainWindow.Instance.Connector), Order = order.ReRegisterClone(newVolume: order.Balance) }; if (window.ShowModal(this)) MainWindow.Instance.Connector.ReRegisterOrder(order, window.Order); } 

рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдХреЗрд╡рд▓ CancelOrder рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рд░рджреНрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 private void OrderGrid_OnOrderCanceling(Order order) { MainWindow.Instance.Connector.CancelOrder(order); } 

рдСрд░реНрдбрд░рдЧреНрд░рд┐рдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирдП рдСрд░реНрдбрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдСрд░реНрдбрд░рдЧреНрд░реЗрдбрдХрдВрдЯреНрд░реЛрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рддреНрд░реБрдЯрд┐ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдСрд░реНрдбрд░рдЧреНрд░рд┐рдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ:

 public OrderGridControl() { InitializeComponent(); MainWindow.Instance.Connector.NewOrder += OrderGrid.Orders.Add; MainWindow.Instance.Connector.OrderRegisterFailed += OrderGrid.AddRegistrationFail; } 

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

 <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> 

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



рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓реЗрди-рджреЗрди рдкреИрдирд▓ рдмрдирд╛рдирд╛


рдЯреВрд▓рдмрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рдХрд░рдХреЗ, рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЗрдирджреЗрди рдХрд╛ рдПрдХ рдкреИрдирд▓ рдмрдирд╛рдПрдВред XAML рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рдФрд░ UserControl рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ MyTradeGridControl рдирд╛рдо рджреЗрдВред рдЗрд╕рдореЗрдВ MyTradeGrid рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ:

 <UserControl x:Class="ShellNew.XAML.MyTradeGridControl" 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:MyTradeGrid x:Name="MyTradeGrid" /> </UserControl> 

MyTradeGridControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдирдП рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЗрдирджреЗрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ MyTradeGrid рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 public MyTradeGridControl() { InitializeComponent(); MainWindow.Instance.Connector.NewMyTrade += MyTradeGrid.Trades.Add; } 

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

 <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> 

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



рдПрдХ рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдирд▓ рдмрдирд╛рдирд╛


рд╣рдо рд╕рднреА рдкрд┐рдЫрд▓реЗ рдкреИрдирд▓реЛрдВ рдХреА рддрд░рд╣ рд╣реА рдПрдХ рд░рдгрдиреАрддрд┐ рдкреИрдирд▓ рдмрдирд╛рдПрдВрдЧреЗред XAML рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рдФрд░ UserControl рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ StrategyControl рдирд╛рдо рджреЗрдВред LayoutControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдХреИрдВрдбрд▓рд╕реНрдЯрд┐рдХ рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдм рд╣реЛрдЧрд╛ рдФрд░ рд░рдгрдиреАрддрд┐ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдм рд╣реЛрдЧрд╛:

 <dxlc:LayoutGroup Orientation="Vertical"> <dxlc:LayoutGroup View="Tabs" Name="StatistisAndChartLayoutGroup"> <dxlc:LayoutGroup Header="Chart"> <xaml:Chart x:Name="Chart" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="Statistic"> <dxlc:LayoutItem VerticalAlignment="Stretch" dxlc:LayoutControl.AllowHorizontalSizing="True" > <xaml:StatisticParameterGrid x:Name="StatisticParameterGrid" MaxHeight="2000"/> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" > <xaml:EquityCurveChart x:Name="EquityCurveChart" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> </dxlc:LayoutGroup> </dxlc:LayoutGroup> 

рдпрд╣рд╛рдБ, StatisticParameterGrid рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдгрдиреАрддрд┐ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ EquityCurveChart рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд╛рдн рдФрд░ рд╣рд╛рдирд┐ рдЪрд╛рд░реНрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред StatisticParameterGrid рдХреЛ рдХреБрдЫ MaxHeight рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд░рд╛рдЗрдЯ-рд╣реИрдВрдб рд╕рд╛рдЗрдб рдкреНрд░реЙрдкрд░реНрдЯреАрдЧреНрд░реЗрдбреЗрдХреНрд╕ рдореЗрдВ рд░рдгрдиреАрддрд┐ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред рд░рдгрдиреАрддрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рднреА рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ:

 <dxlc:LayoutGroup View="Group" dxlc:LayoutControl.AllowHorizontalSizing="True" dxlc:DockLayoutControl.Dock="Right" Orientation="Vertical"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <xaml:PropertyGridEx x:Name="PropertyGridEx" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" Height="20"> <dx:SimpleButton x:Name="StartStrategyButton" Content="Start strategy" ToolTip="Start strategy" Click="StartStrategyButton_Click" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" Height="20"> <dx:SimpleButton x:Name="StopStrategyButton" Content="Stop strategy" ToolTip="Stop strategy" Click="StopStrategyButton_Click" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> 

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

 <UserControl x:Class="ShellNew.XAML.StrategyControl" 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:xaml="http://schemas.stocksharp.com/xaml" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" mc:Ignorable="d"> <dxlc:LayoutControl> <dxlc:LayoutGroup Orientation="Vertical"> <dxlc:LayoutGroup View="Tabs" Name="StatistisAndChartLayoutGroup"> <dxlc:LayoutGroup Header="Chart"> <xaml:Chart x:Name="Chart" /> </dxlc:LayoutGroup> <dxlc:LayoutGroup Header="Statistic"> <dxlc:LayoutItem VerticalAlignment="Stretch" dxlc:LayoutControl.AllowHorizontalSizing="True" > <xaml:StatisticParameterGrid x:Name="StatisticParameterGrid" MaxHeight="2000"/> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" > <xaml:EquityCurveChart x:Name="EquityCurveChart" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> </dxlc:LayoutGroup> </dxlc:LayoutGroup> <dxlc:LayoutGroup View="Group" dxlc:LayoutControl.AllowHorizontalSizing="True" dxlc:DockLayoutControl.Dock="Right" Orientation="Vertical"> <dxlc:LayoutItem VerticalAlignment="Stretch"> <xaml:PropertyGridEx x:Name="PropertyGridEx" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" Height="20"> <dx:SimpleButton x:Name="StartStrategyButton" Content="Start strategy" ToolTip="Start strategy" Click="StartStrategyButton_Click" /> </dxlc:LayoutItem> <dxlc:LayoutItem VerticalAlignment="Stretch" Height="20"> <dx:SimpleButton x:Name="StopStrategyButton" Content="Stop strategy" ToolTip="Stop strategy" Click="StopStrategyButton_Click" /> </dxlc:LayoutItem> </dxlc:LayoutGroup> </dxlc:LayoutControl> </UserControl> 

StrategyControl рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдХрдиреЗрдХреНрдЯрд░ рдХреЛ PropertyGridEx рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ, рд▓рдЧрднрдЧ рд╣рд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣рдо рд╕рдорд╛рди рд╣реИрдВ:

 public StrategyControl() { InitializeComponent(); PropertyGridEx.SecurityProvider = MainWindow.Instance.Connector; PropertyGridEx.Portfolios = new PortfolioDataSource(MainWindow.Instance.Connector); } 

рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд░рдгрдиреАрддрд┐ рдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, StrategyControl рдореЗрдВ рдПрдХ BindStraregy рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ, рдЬреЛ рд░рдгрдиреАрддрд┐ рд▓реЗрдЧрд╛, рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдФрд░ рд╕рд╛рде рд╣реА PropertyGridEx рдФрд░ StatisticParameterGrid рдореЗрдВ рд░рдгрдиреАрддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВред

SetChart рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЪрд╛рд░реНрдЯ рдореЛрдордмрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрд╛рд░реНрдЯ рдХреЛ рд░рдгрдиреАрддрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ; рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк GetChart рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рд░реНрдЯ рд░рдгрдиреАрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

 private Strategy _strategy; public void BindStraregy(Strategy strategy) { _strategy = strategy; PropertyGridEx.SelectedObject = strategy; StatisticParameterGrid.Parameters. AddRange(_strategy.StatisticManager.Parameters); _strategy.SetChart(Chart); _strategy.Connector = MainWindow.Instance.Connector; } 

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

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд░рдгрдиреАрддрд┐ рдХреЗ PnL рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ EquityCurveChart рд▓рд╛рдн / рд╣рд╛рдирд┐ рдЪрд╛рд░реНрдЯ рдкрд░ рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 private void ResetEquityCurveChart() { EquityCurveChart.Clear(); var pnl = EquityCurveChart. CreateCurve("PNL", Colors.Green, ChartIndicatorDrawStyles.Area); var unrealizedPnL = EquityCurveChart. CreateCurve("unrealizedPnL", Colors.Black, ChartIndicatorDrawStyles.Line); var commissionCurve = EquityCurveChart .CreateCurve("commissionCurve", Colors.Red, ChartIndicatorDrawStyles.Line); _strategy.PnLChanged += () => { var data = new ChartDrawData(); data.Group(_strategy.CurrentTime) .Add(pnl, _strategy.PnL) .Add(unrealizedPnL, _strategy.PnLManager.UnrealizedPnL ?? 0) .Add(commissionCurve, _strategy.Commission ?? 0); EquityCurveChart.Draw(data); }; } 

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

 private void StartStrategyButton_Click(object sender, RoutedEventArgs e) { ResetEquityCurveChart(); _strategy.Reset(); _strategy.Start(); } 

рд╕реНрдЯреЙрдк рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рд░рдгрдиреАрддрд┐ рдХреЛ рд░реЛрдХ рджреЗрдВрдЧреЗред
рдирд┐рдЬреА рд╢реВрдиреНрдп StopStrategyButton_Click (рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЗрд╖рдХ, RoutedEventArgs e)

 { _strategy.Stop(); } 

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

 <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 Header="SimpleStrategyControl"> <myxaml:StrategyControl x:Name="SimpleStrategyControl" /> </dxlc:LayoutGroup> </dxlc:LayoutGroup> 

рд░рдгрдиреАрддрд┐ рдирд┐рд░реНрдорд╛рдг


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓ рдХреИрдВрдбрд▓рд╕реНрдЯрд┐рдХ рд░рдгрдиреАрддрд┐ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡рд╣ рдЦрд░реАрджреЗрдЧреА рдЕрдЧрд░ рдореЛрдордмрддреНрддреА рдмрдврд╝ рд░рд╣реА рд╣реИ (рд╣рд░рд╛) рдФрд░ рдЕрдЧрд░ рдореЛрдордмрддреНрддреА рдХрдо рд╣реЛ рд░рд╣реА рд╣реИ (рд▓рд╛рд▓)ред

рдЖрдЗрдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ - рд╣рдо рдЕрдкрдиреА рд╕рднреА рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ SimpleStrategy рдХрд╣реЗрдВред рд╕рднреА рдПрд╕ # рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд░рдгрдиреАрддрд┐ рд░рдгрдиреАрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

 public class SimpleStrategy : Strategy {} 

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

 public class SimpleStrategy : Strategy { public CandleSeries Series { get; set; } public SimpleStrategy() { Series = new CandleSeries(typeof(TimeFrameCandle), new Security(), TimeSpan.FromSeconds(15)) { BuildCandlesMode = MarketDataBuildModes.Build }; } } 

рдпрд╣рд╛рдБ рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХреИрдВрдбрд▓рд╕рд░реАрдЬ рдореЗрдВ рдореЛрдордмрддреНрддрд┐рдпрд╛рдБ TimeFrameCandle рд╣реЛрдВрдЧреА, 15 рд╕реЗрдХрдВрдб (TimeSpan.FromSeconds (15)) рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рдеред CandleSeries рдХреЗ рд▓рд┐рдП, рдЖрдк BuildCandlesMode рдореЛрдордмрддреНрддреА рдирд┐рд░реНрдорд╛рдг рдореЛрдб рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдореЛрдордмрддреНрддрд┐рдпрд╛рдБ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреА (MarketDataBuildModes.Build)ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдХреНрд╕ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

 protected override void OnStarted() { _connector = (Connector)Connector; Series.Security = Security; _connector .WhenCandlesFinished(Series) .Do(ProcessCandle) .Apply(this); _connector.SubscribeCandles(Series); base.OnStarted(); } 

рдпрд╣рд╛рдВ, рдХреИрдВрдбрд▓рд╕рд░реАрдЬ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕ рдЯреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЙрдкрд░реНрдЯреАрдЧреНрд░рд┐рдбреЗрдХреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред рдлрд┐рд░ рддреИрдпрд╛рд░ рдореЛрдордмрддреНрддреА рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдмрдирд╛рдПрдВред рдирд┐рдпрдо рдореЗрдВ, рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдкреНрдд рдореЛрдордмрддреНрддреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреА - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдмрд╛рдж рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо SubscribeCandles рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдХреИрдВрдбрд▓рд╕рд░реАрдЬ рдкрд░ рдореЛрдордмрддреНрддрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, ProcessCandle рдкрджреНрдзрддрд┐ рдореЗрдВ рд░рдгрдиреАрддрд┐ рдХрд╛ рдореБрдЦреНрдп рддрд░реНрдХ рд╣реИ:

 private void ProcessCandle(Candle candle) { if (!IsRealTime(candle)) return; if (candle.OpenPrice < candle.ClosePrice && Position <= 0) { RegisterOrder(this.BuyAtMarket(Volume + Math.Abs(Position))); } else if (candle.OpenPrice > candle.ClosePrice && Position >= 0) { RegisterOrder(this.SellAtMarket(Volume + Math.Abs(Position))); } } 

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

 private bool IsRealTime(Candle candle) { return (Connector.CurrentTime - candle.CloseTime).TotalSeconds < 10; } 

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

 if (candle.OpenPrice < candle.ClosePrice && Position <= 0) { RegisterOrder(this.BuyAtMarket(Volume + Math.Abs(Position))); } 


рд╣рдо рдПрдХ waning рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд┐рдП рд╡рд┐рдкрд░реАрдд рдХрд░рддреЗ рд╣реИрдВ:

 else if (candle.OpenPrice > candle.ClosePrice && Position >= 0) { RegisterOrder(this.SellAtMarket(Volume + Math.Abs(Position))); } 

рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реА рд░рдгрдиреАрддрд┐ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕реЗ SimpleStrategyControl рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ BindStraregy рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рд╣рдо рдореЗрдирд╡рд┐рдВрдбреЛ рдШрдЯрдХреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдореЗрдирд╡рд┐рдВрдбреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред

 SimpleStrategyControl.BindStraregy(new SimpleStrategy()); 


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





рд░рдгрдиреАрддрд┐ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╕реМрджреЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдореЛрдордмрддреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реМрджреЗ рдирд╣реАрдВ рд╣реИрдВред

рд░рдгрдиреАрддрд┐ рд╕реЗ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдореЛрдордмрддреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реМрджреЗ рдЬреЛрдбрд╝рдирд╛


SetChart рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд░рдгрдиреАрддрд┐ рдкреИрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдЪрд╛рд░реНрдЯ рдореЛрдордмрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрд╛рд░реНрдЯ рдХреЛ рд░рдгрдиреАрддрд┐ рдореЗрдВ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ред рд░рдгрдиреАрддрд┐ рдХреА OnStarted рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд╛рд░реНрдЯ рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рд╕реЗрдЯ рд╣реИ, рддреЛ рд╣рдо рдЪрд╛рд░реНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдирдП рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЗрди-рджреЗрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдПрдХ рдореЛрдордмрддреНрддреА рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рднреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред

 protected override void OnStarted() { _connector = (Connector)Connector; if (this.GetChart() is Chart chart) { InitChart(chart); NewMyTrade += DrawMyTrade; _connector.CandleSeriesProcessing += CandleSeriesProcessing; } Series.Security = Security; _connector .WhenCandlesFinished(Series) .Do(ProcessCandle) .Apply(this); _connector.SubscribeCandles(Series); base.OnStarted(); } 

InitChart рдЪрд╛рд░реНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐:

 private ChartCandleElement _chartCandleElement; private ChartTradeElement _tradesElem; private Chart _chart; private void InitChart(Chart chart) { _chart = chart; _chart.GuiSync(() => { _chart.ClearAreas(); var candlesArea = new ChartArea(); _chart.AddArea(candlesArea); _chartCandleElement = new ChartCandleElement(); _chart.AddElement(candlesArea, _chartCandleElement); _tradesElem = new ChartTradeElement { FullTitle = "Trade" }; _chart.AddElement(candlesArea, _tradesElem); }); } 

рдпрд╣рд╛рдВ рд╣рдо рдЪрд╛рд░реНрдЯ рдХреЛ рд▓рд┐рдВрдХ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╢реЗрдбреНрдпреВрд▓ рдХреНрд▓рд┐рдпрд░ рдХрд┐рдпрд╛ред рд╣рдо рдореЛрдордмрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реМрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдЪрд╛рд░реНрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рдг _chart.GuiSync (() => {...}); рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ рдЕрдиреБрд╕реВрдЪреА рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдПрдХ рдЪрд╛рд░реНрдЯ рдкрд░ рдореЛрдордмрддреНрддрд┐рдпрд╛рдБ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП CandleSeriesProcessing рдЪрд╛рд░реНрдЯ:

 private void CandleSeriesProcessing(CandleSeries candleSeries, Candle candle) { var data = new ChartDrawData(); data.Group(candle.OpenTime) .Add(_chartCandleElement, candle); _chart.Draw(data); } 

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдХреИрдВрдбрд▓рд╕рд░реАрдЬрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд╕реЗ рдПрдХ рдореЛрдордмрддреНрддреА рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕реЗ рдЪрд╛рд░реНрдЯ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд░реНрдЯрдбреНрд░рд╛рд╡рдбрд╛рдЯ рдмрдирд╛рдПрдВред рд╣рдо рд╕рдордп рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдореВрд╣ (рдореЛрдордмрддреНрддреАред рдкреАрдбреАрдПрдл рдЯрд╛рдЗрдо), рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЛрдордмрддреНрддреА рдХреЛ рдЪрд╛рд░реНрдЯ рдХреЗ рдореЛрдордмрддреНрддреА рддрддреНрд╡ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЛрдбрд╝реЗрдВ (_chartCandleElement, рдореЛрдордмрддреНрддреА); рдФрд░ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдирдпрд╛ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:

 public void DrawMyTrade(MyTrade myTrade) { var data = new ChartDrawData(); data.Group(myTrade.Trade.Time) .Add(_tradesElem, myTrade); _chart.Draw(data); } 

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



рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖


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

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

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


All Articles