Событийная модель
Atom Ответить
29.03.2012


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

Код

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

Фотография
Автор статей Программист
Дата: 29.03.2012
Ответить


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

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

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

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

            this
                .When()
                .Do();

Спасибо: Sergey Masyura Wetal Jeta

Wetal

Фотография
Дата: 11.04.2012
Ответить


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

Фотография
Дата: 12.04.2012
Ответить


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

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

Wetal

Фотография
Дата: 12.04.2012
Ответить


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

OvcharenkoVI

Фотография
Автор статей
Дата: 12.04.2012
Ответить


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

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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy