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


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

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

Теги:


Спасибо:




21 Ответов
Творог

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


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

Код
MarketRule<Security, MarketDepth> rule = MarketRuleHelper.WhenMarketDepthChanged(sec);
Автор топика
Спасибо:

Moadip

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


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

Класс, в нем таймер. По таймеру проверяется наличие активных заявок и вызывается событие.
Два вопроса.
Зачем это надо и как часто должен будет срабатывать таймер.

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

Цитата:
Что такое Правило и Токен?

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

Творог

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


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

Класс, в нем таймер. По таймеру проверяется наличие активных заявок и вызывается событие.
Два вопроса.
Зачем это надо и как часто должен будет срабатывать таймер.

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

Цитата:
Что такое Правило и Токен?

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


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

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

Moadip

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


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

Какую таблицу?Blink

Цитата:
А если периодичность задавать через MarketTimeChanged, там счёт идёт на единицы миллисекунд?

Период срабатывания таймера можно задать любой. Хоть в мс, хоть нс.

Цитата:
А если такую функцию зациклить, то ведь лучше это сделать асинхронно, в другом потоке?

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

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

Творог

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


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

Moadip

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


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

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

Творог

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


Moadip Перейти

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


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

Автор топика
Спасибо:

Moadip

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


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

Код
_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);
Спасибо:

Творог

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


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

Moadip

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


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

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

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

Творог

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


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

Творог

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


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

esper

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


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

Творог

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


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


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

Moadip

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


Цитата:
Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет.

Algo.Strategies - куча классов, базовым классом для которых является Strategy.

Чем не "примеры имплементации"?
Спасибо:

Творог

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


А почему этот код не выводит активные заявки? Ордера меняю по всякому, а 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 выводятся! Confused
Автор топика
Спасибо:

Творог

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


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

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

_trader.SupportManualOrders = true;
Автор топика
Спасибо:

Творог

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


Moadip Перейти
Цитата:
Внутренности классов и методов там отражено, а вот примеры имплементаций скорее всего нет.

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


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

esper

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


Читайте документацию.
Спасибо:

Творог

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


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


на ней скоро дыры появятся
Автор топика
Спасибо:

Moadip

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


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

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

Вам нужны были примеры-шаблоны дочерних классов от Strategy => Algo.Strategies
Есть еще в примерах SmaStrategy.Smile

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

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

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

Нужны "продвинутые" примеры - Algo.Strategies.
Спасибо:


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

loading
clippy