← Back

Событие наличия активных заявок

Как сделать такое событие, которое бы мониторило ордера и передавала в обработчик коллекцию активных заявок? Ну типа trader.ActiveOrders += actords => и т.д. Просто сложность для меня пока в том, что данные действия должны скорее всего выполняться асинхронно, а в многопоточном программировании я пока не очень, да и инфы с примерами использования async/await пока маловато. Там внутри, наверное, должен быть зацикленный или рекурсивный метод?

И заодно подкину ещё пара вопросов:

  1. Почему свойство Quote.Volume возвращает тип decimal, а не что-нибудь целочисленное?
  2. Можно ли вернуть позу, отфильтрованную по фирме, типа: trader.GetPosition(account, sec, "SPBFUT") ?

Comments (21)

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

Творог
Творог Author

Продолжаю поток новичковских вопросов 🙄 Что такое Правило и Токен? Например, создаю переменную rule. Как я её могу практически использовать во благо?

MarketRule<Security, MarketDepth> rule = MarketRuleHelper.WhenMarketDepthChanged(sec);
Moadip
Moadip

Как сделать такое событие, которое бы мониторило ордера и передавала в обработчик коллекцию активных заявок? Ну типа trader.ActiveOrders += actords => и т.д. Класс, в нем таймер. По таймеру проверяется наличие активных заявок и вызывается событие. Два вопроса. Зачем это надо и как часто должен будет срабатывать таймер.

OrdersChanged - может это подойдет.

Что такое Правило и Токен? Справку читать не пробовали? Событийная модель.

Творог
Творог Author

Как сделать такое событие, которое бы мониторило ордера и передавала в обработчик коллекцию активных заявок? Ну типа trader.ActiveOrders += actords => и т.д. Класс, в нем таймер. По таймеру проверяется наличие активных заявок и вызывается событие. Два вопроса. Зачем это надо и как часто должен будет срабатывать таймер.

OrdersChanged - может это подойдет.

Что такое Правило и Токен? Справку читать не пробовали? Событийная модель.

Пока думаю над оптимальным алгоритмом. Получается, без всяких заморочек просто рефрешить таблицу и генерировать своё событие? А если периодичность задавать через MarketTimeChanged, там счёт идёт на единицы миллисекунд? А если такую функцию зациклить, то ведь лучше это сделать асинхронно, в другом потоке?

Справку читать пробовал, но не получилось. Не нашёл. Спасиб за наводку. Неплохо было бы делать ссылки в хэлпе на подобные материалы по ключевым словам, это вопрос по организации навигации.

Moadip
Moadip

Получается, без всяких заморочек просто рефрешить таблицу и генерировать своё событие? Какую таблицу?😳

А если периодичность задавать через MarketTimeChanged, там счёт идёт на единицы миллисекунд? Период срабатывания таймера можно задать любой. Хоть в мс, хоть нс.

А если такую функцию зациклить, то ведь лучше это сделать асинхронно, в другом потоке? Зачем что то циклить. Если использовать таймер, то это тот же бесконечный цикл. Будет работать до тех пор, пока не остановить таймер. Метод который вызывается по таймеру, будет отрабатывать в отдельном потоке.

Вы напишите зачем вам это надо, возможно это можно сделать без циклов, рекурсии, таймеров, потоков, async/await и прочей хрени.🙂

Творог
Творог Author

Сейчас у меня в QPILE так: раз в секунду пробегаюсь по заявкам. Если заявка активна, то беру её цену и проверяю насколько она адекватна текущей ситуации в стакане. Если не адекватна - снимаю. В следующую секунду выставляю новую заявку и по новой начинаю её мониторить.

Moadip
Moadip

Подписаться на событие изменения стакана MarketDepthsChanged. Сработало. Проверять что с ордерам.

Или использовать правило WhenMarketDepthChanged.

Творог
Творог Author

Moadip: Или использовать правило WhenMarketDepthChanged.

А, возвращаясь ко второму посту, можно показать пример как использовать?

Moadip
Moadip

Нашли нужный инструмент, зарегистрировали стакан, создали правило.

_quikTrader.NewSecurities += securities =>
{
	if (_security.IsNull())
	{
		_security = securities.FirstOrDefault(sec => sec.Code == _securityCode);
		_quikTrader.RegisterMarketDepth(_security);

		_security
			.WhenMarketDepthChanged()
			.Do(MarketDepthChaged)
			.Apply();
	}
};

...

private void MarketDepthChaged()
{
	что то делаем
}

Если внутри стратегии, то вместо Apply(), Apply(this);

Творог
Творог Author

А в чём преимущества правил перед событиями? В каких случаях предпочтительнее применять и те и другие?

Moadip
Moadip

Все зависит от конкретной ситуации. Если на примере MarketDepthsChanged и WhenMarketDepthChanged

Допустим зарегистрировали стаканы по 10 инструментам. И теперь каждый раз когда будет изменятся стакан по одному из этих инструментов, каждый раз будет срабатывать событие MarketDepthsChanged. Что может быть не совсем удобно. Поэтому создаем правило для конкретного инструмента и обрабатываем изменение стакана именно по нему.

C правилами много чего можно делать. Почитайте справку, попробуйте применить, посмотрите как работает.

Творог
Творог
Творог Author

А где-то ещё можно посмотреть примеры создания Стратегий, в т.ч. и дочерних, и стратегий котирования? Пример их хэлпа с хеджированием мало что объясняет 😭 Может кто поделится, пусть и бесполезными в плане извлечения прибыли, кодами!

Творог
Творог Author

Жаль 😢 Придётся изобретать велосипед и писать свои шаблоны для стратегий всё с нуля.

esper
esper

Так есть исходники S#, чем они не подходят?

Творог
Творог Author

esper: Так есть исходники S#, чем они не подходят?

Ну чем больше источников и информации, чтобы въехать в тему, тем лучше. В исходниках тоже надо привыкнуть разбираться, где там что и как. Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет.

Moadip
Moadip

Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет. Algo.Strategies - куча классов, базовым классом для которых является Strategy.

Чем не "примеры имплементации"?

Творог
Творог Author

Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет. Algo.Strategies - куча классов, базовым классом для которых является Strategy.

Чем не "примеры имплементации"?

Ну, например, пытаюсь выставить заявку пропуская 100 контрактов вперёд в стакане. Не понимаю точно, как выполнить котирование (наверное, то что я пытаюсь сделать это так и называется), но пытаюсь написать что-то типа того:


            var contract = Decimal.Parse(todo.Text);
            var order = new Order
            {
                Trader = _trader,
                Portfolio = (Portfolio)Accounts.SelectedItem,
                Security = (Security)Securitites.SelectedItem,
                Volume = contract,
                Price = decimal.Parse(_price.Text),
                Direction = OrderDirections.Buy
            };

            var best = new BestByVolumeQuotingStrategy(order, 100);
            best.OpenPositionByQuoting(contract);
            best.RegisterOrder(order);

Не вижу, чтобы что-то где-то говорилось о конкретной имплементации, в исходниках или хелпе.

Творог
Творог Author

А почему этот код не выводит активные заявки? Ордера меняю по всякому, а breakpoint внутри цикла даже не задевается.


        private ObservableCollection<Order> myorders = new ObservableCollection<Order>();
            mygrid.ItemsSource = myorders;
            _trader.OrdersChanged += orders => this.GuiAsync(() =>
            {
                //myorders.Clear();
                foreach (Order order in orders)
                {
                    if (order.State == OrderStates.Active)
                    {
                        myorders.Add(order);
                    }
                }
            }); 

При этом заявки со статусом OrderStates.Done выводятся! 🤨

Творог
Творог Author

После медитации над таблицей заявок мне пришла в голову одна гипотеза: экспортируются заявки только с наличием транз. ID. Насколько она бредовая?

Нашёл. Не прошло и суток.


_trader.SupportManualOrders = true;

esper
esper

Читайте документацию.

Творог
Творог Author

esper: Читайте документацию.

на ней скоро дыры появятся

Moadip
Moadip

Жаль 😢 Придётся изобретать велосипед и писать свои шаблоны для стратегий всё с нуля. Ну чем больше источников и информации, чтобы въехать в тему, тем лучше. В исходниках тоже надо привыкнуть разбираться, где там что и как. Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет. Вам нужны были примеры-шаблоны дочерних классов от Strategy => Algo.Strategies Есть еще в примерах SmaStrategy.🙂

На форуме помню выкладывали шаблон стратегии на свечках. Искать лень.

Не вижу, чтобы что-то где-то говорилось о конкретной имплементации, в исходниках или хелпе. Под конкретно вашу задачу естественно не будет готовых шаблонов-решений. Ни в справке, ни в исходниках.

Нужны "продвинутые" примеры - Algo.Strategies.