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


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


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

Code

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=csharp} {/code}, вместо {} поставьте []. Без них код трудно воспринять.

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

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

Используйте правила.
Code

            this
                .When()
                .Do();

Thanks: Sergey Masyura Wetal Jeta

Wetal

Avatar
Date: 4/11/2012
Reply


Помогите пожалуйста написать свое правило и активировать его!
на форуме нашел такие примеры:
Code
 
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 Go to
Помогите пожалуйста написать свое правило и активировать его!

Какое правило я так и не понял. Официальный пример смотрели?
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