← Back

Событийная модель

Коллеги, прошу помощи! Есть много условий на выставление и изменение(перерегистрация)заявок. Все работает но в один момент заявка почему-то не выставляется. Понял что скорость анализа данных и выполнения условий мала.


private void button1_Click(object sender, RoutedEventArgs e)
        {
            bool flag=false;
            Globals.Trader.QuotesChanged += depth =>
            {
                List<MarketDepthPair> t = Globals.Trader.GetMarketDepth(security).GetTopPairs(1).ToList();
                foreach (MarketDepthPair t1 in t)
                {
                    decimal spread = t1.Ask.Price - t1.Bid.Price;
                    if (условие 1)
                    {
                        if (  flag==false)
                        {
                            Dispatcher.BeginInvoke(new Action(() =>
                            {
                                
                                order_buy = new Order
                                 {
                                     Portfolio = Portfolio,
                                     Price = ...,
                                     Security = security,
                                     Volume = 1,
                                     Direction = OrderDirections.Buy,
                                 };
                                Globals.Trader.RegisterOrder(order_buy);
                                order_sell = new Order
                                {
                                    Portfolio = Portfolio,
                                    Price = ...,
                                    Security = security,
                                    Volume = 1,
                                    Direction = OrderDirections.Sell,
                                };
                                Globals.Trader.RegisterOrder(order_sell);
                            }));
                            flag = true; 
                        }
                        else if(order_buy.State == OrderStates.Done && order_sell.State==OrderStates.Active) 
                        {
                            if (условие)
                            {
                                Dispatcher.BeginInvoke(new Action(() =>
                                {
                                    Globals.Trader.CancelOrder(order_sell);
                                    
                                    order_sell = new Order
                                    {
                                        Portfolio = Portfolio,
                                        Price = ....,
                                        Security = security,
                                        Volume = 1,
                                        Direction = OrderDirections.Sell,
                                    };
                                    Globals.Trader.RegisterOrder(order_sell);
                                }));
                            }
                            flag = true;
                        }
                        
                        else if (order_sell.State == OrderStates.Done && order_buy.State == OrderStates.Active)
                        {
                            if (условие)
                            {
                                Dispatcher.BeginInvoke(new Action(() =>
                                {
                                    Globals.Trader.CancelOrder(order_buy);
                                    order_buy = new Order
                                    {
                                        Portfolio = Portfolio,
                                        Price = ....,
                                        Security = security,
                                        Volume = 1,
                                        Direction = OrderDirections.Buy,
                                    };
                                    Globals.Trader.RegisterOrder(order_buy);
                                }));
                                flag = true;
                            }
                        }
                        else if (order_sell.State == OrderStates.Done && order_buy.State == OrderStates.Done)
                        {
                         
                            flag = false;
                        }
                        
                    }
                }
                
            };
            
        }

Понимаю, что if else - очень замедляет switch не подойдет, анализирую несколько переменных. Думаю создать события на каждое из условий. Может есть уже какие нибудь стандартизированные методы решения такой задачи?

Заранее благодарю!

Comments (5)

Login or Create account, Log in or register to leave a comment

Moadip
Moadip

На будущее, используйте теги {/code}, вместо поставьте []. Без них код трудно воспринять.

Всю бизнес логику надо писать в классе наследованном от Strategy, а не в обработчике нажатия кнопки.

Думаю создать события на каждое из условий. Может есть уже какие нибудь стандартизированные методы решения такой задачи? Используйте правила.


            this
                .When()
                .Do();

Sergey Masyura Wetal Jeta
Wetal
Wetal Author

Помогите пожалуйста написать свое правило и активировать его! на форуме нашел такие примеры:

 
public class rule1 : StrategyRule
    {
        public  StrategyRule rule11(Order order_sell, Order order_buy)
        {
            if (order.State == OrderStates.Done && order.State == OrderStates.Done)
                this.Activate();
            return this;
        }
    }

public class strategy : Strategy
    {
        protected StrategyRule rule1()
        {
            return new rule1().rule11(Globals.order_buy);
        }
       
        protected override void OnStarting()
        {
              this
                     .When(rule1())
                     .Do(() =>
                {
                   
                        MessageBox.Show("buy done");
                 });
        }

hobo
hobo

Wetal: Помогите пожалуйста написать свое правило и активировать его! Какое правило я так и не понял. Официальный пример смотрели? 99.9%, что вам не нужно новое правило и что дело не в том, что "if else - очень замедляет". Начните все же с чтения документации и разбора примеров.

Wetal
Wetal Author

Саму идею я понял! Но конкретно где не правильно я делаю не вижу! Моя задача в следующем написать правило на изменение состояния статуса 2х заявок, т.е. допустим условие 1. заявка на продажу исполнилась а заявка на покупку еще активна -> если спред=х -> пере выставляем заявку на покупку уже с другой ценой. 2. Так же как 1, только на оборот по заявкам. 3. Обе заявки исполнились -> выставляем две новые. Вот собственно эти 3 я и написал, но они не срабатывают. (

OvcharenkoVI
OvcharenkoVI

немножко оффтоп, но вы собираетесь спред через quik торговать? вроде без плазы там(внутри спреда) делать нечего )))

В вашем случае я бы посоветовал создавать две стратегии котирования и, когда у обеих будет статус Stopped - создавать новые )