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

Событийная модель
Atom
3/29/2012
Wetal


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


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 не подойдет, анализирую несколько переменных. Думаю создать события на каждое из условий. Может есть уже какие нибудь стандартизированные методы решения такой задачи?

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


Tags:


Thanks:


Moadip

Avatar
Date: 3/30/2012
Reply


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

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

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


            this
                .When()
                .Do();

Thanks: Sergey Masyura Wetal Jeta

Wetal

Avatar
Date: 4/11/2012
Reply


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

 
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");
                 });
        }

Thanks:

hobo

Avatar
Date: 4/12/2012
Reply


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

Thanks:

Wetal

Avatar
Date: 4/12/2012
Reply


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

Thanks:

OvcharenkoVI

Avatar
Date: 4/12/2012
Reply


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

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

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy