← 返回

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

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


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

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

本主题对您有帮助吗?

分享主题

评论 (5)

登录创建账户, 登录或注册以发表评论

Moadip
Moadip

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

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

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


            this
                .When()
                .Do();

Sergey Masyura Wetal Jeta
Wetal
Wetal 作者

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

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

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

OvcharenkoVI
OvcharenkoVI

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

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