← Назад

[SOLVED] myTrade.Trade.OrderDirection == null если работать с QuikTrader

бага в версии 3.2.4 при работе с QuikTrader данный код в стратегии

	private void NewMyTrades(IEnumerable<MyTrade> myTrades)
	{
		foreach (MyTrade myTrade in myTrades)
		{

получает myTrade.Trade.OrderDirection == null по крайней мере для short sell на FORTS

при этом если работать в режиме эмуляции с RealTimeEmulationTrader<QuikTrader>(new QuikTrader()) то OrderDirection приходит правильный

Комментарии (13)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

President: получает myTrade.Trade.OrderDirection == null по крайней мере для short sell на FORTS

А что понимаете под myTrade.Trade.OrderDirection?

President
President Автор

Mikhail Sukhov:

President: получает myTrade.Trade.OrderDirection == null по крайней мере для short sell на FORTS

А что понимаете под myTrade.Trade.OrderDirection?

Направление трейда (buy/sell) - и оно, насколько я понимаю, должно совпадать с направлением ордера по которому и был создан трейд. (мне только не очень понятно почему тут тип данных nullable)

Mikhail Sukhov
Mikhail Sukhov

President: Направление трейда (buy/sell) - и оно, насколько я понимаю, должно совпадать с направлением ордера по которому и был создан трейд. (мне только не очень понятно почему тут тип данных nullable)

Потому что Trade.OrderDirection != Order.Direction. Trade.OrderDirection - это тот, кто стал инициатором сделки. Транслируется в таблице Все сделки. Использую (лично я) для бек тестинга.

Order.Direction - это направление для заявки (buy/sell).

President
President Автор

Mikhail Sukhov:

President: Направление трейда (buy/sell) - и оно, насколько я понимаю, должно совпадать с направлением ордера по которому и был создан трейд. (мне только не очень понятно почему тут тип данных nullable)

Потому что Trade.OrderDirection != Order.Direction. Trade.OrderDirection - это тот, кто стал инициатором сделки. Транслируется в таблице Все сделки. Использую (лично я) для бек тестинга.

Order.Direction - это направление для заявки (buy/sell).

спасибо за пояснение - я заюзал Order.Direction и все стало ок.

НО - если Trade.OrderDirection указывает кто стал инициатором сделки то почему он nullable и бывает null? ведь эта информация приходит в таблице Все сделки и там это поле либо "Купля" либо "Продажа" - третьего не дано

Alexander
Alexander

President:

Mikhail Sukhov:

President: Направление трейда (buy/sell) - и оно, насколько я понимаю, должно совпадать с направлением ордера по которому и был создан трейд. (мне только не очень понятно почему тут тип данных nullable)

Потому что Trade.OrderDirection != Order.Direction. Trade.OrderDirection - это тот, кто стал инициатором сделки. Транслируется в таблице Все сделки. Использую (лично я) для бек тестинга.

Order.Direction - это направление для заявки (buy/sell).

спасибо за пояснение - я заюзал Order.Direction и все стало ок.

НО - если Trade.OrderDirection указывает кто стал инициатором сделки то почему он nullable и бывает null? ведь эта информация приходит в таблице Все сделки и там это поле либо "Купля" либо "Продажа" - третьего не дано

У Trade, которые созданы по истории, нет направления. Отсюда необходимость в nullable

President
President Автор

Alexander: У Trade, которые созданы по истории, нет направления. Отсюда необходимость в nullable

значит бага. у меня-то не на истории - а с живого квика:

Konstantin: при работе с <u>QuikTrader</u> данный код в стратегии

private void NewMyTrades(IEnumerable<MyTrade> myTrades) { foreach (MyTrade myTrade in myTrades) {

получает myTrade.Trade.OrderDirection == null по крайней мере для short sell на FORTS

PS. а почему на истории нет направления?

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

  • или какой-нибудь RND добавить;
  • или - если уже есть какой-то алгоритм для генерации стакана, то указывать тут сторону стакана (ask/bid) которая ближе к цене исполнения (или даже генерацию стакана подправить чтобы цены ask/bid совпадали с ценой трейда) IMHO для стратегии которая завязана на Trade.OrderDirection RND будет лучше чем null (ближе к боевым условиям), а для остальных без разницы.
Alexander
Alexander

President;9593:

Alexander: У Trade, которые созданы по истории, нет направления. Отсюда необходимость в nullable

значит бага. у меня-то не на истории - а с живого квика:

Konstantin: при работе с <u>QuikTrader</u> данный код в стратегии

private void NewMyTrades(IEnumerable<MyTrade> myTrades) { foreach (MyTrade myTrade in myTrades) {

получает myTrade.Trade.OrderDirection == null по крайней мере для short sell на FORTS

Потому что в таблице Моих сделок направления нет. Направление есть только в таблице Всех сделок.

А вы пытаетесь событие получить по событию своих новых сделок.

President: PS. а почему на истории нет направления?

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

  • или какой-нибудь RND добавить;
  • или - если уже есть какой-то алгоритм для генерации стакана, то указывать тут сторону стакана (ask/bid) которая ближе к цене исполнения (или даже генерацию стакана подправить чтобы цены ask/bid совпадали с ценой трейда) IMHO для стратегии которая завязана на Trade.OrderDirection RND будет лучше чем null (ближе к боевым условиям), а для остальных без разницы.

Потому что все сделки, предоставленные нашей любимой биржей РТС, не содержат направления. "Какой-нибудь RND" будет не совпадать с реальной инфой. Если нужен "какой-нибудь RND", его можно добавить и самому. Решили что лучше писать null, чем неправильную информацию.

Supervisor
Supervisor

Аналогично и с Trade.Price иногда приходит null, часто приходит равной Order.Price, хотя на самом деле они различны.

Mikhail Sukhov
Mikhail Sukhov

Supervisor: Аналогично и с Trade.Price иногда приходит null

Такое невозможно, потому что double не может принимать null.

Supervisor: часто приходит равной Order.Price, хотя на самом деле они различны.

но не всегда.

Supervisor
Supervisor

Mikhail Sukhov:

Supervisor: Аналогично и с Trade.Price иногда приходит null

Такое невозможно, потому что double не может принимать null.

Прошу прощения, имел ввиду что иногда приходит NullReferenceException вот в таком коде:

Iron.Trader.NewMyTrades += t_myNewTrades =>
{
    t_price = t_myNewTrades.Last().Trade.Price;
    waitHandle.Set();
};
			
Iron.Trader.RegisterOrder(t_order);

// Дожидаемся исполнения заявки
waitHandle.WaitOne();

try
{
    Print("price:" + t_price.ToString());
}
catch (Exception t_ex)
{
    Print("ERROR: " + t_ex.ToString());
}

Mikhail Sukhov
Mikhail Sukhov

Supervisor:

Mikhail Sukhov:

Supervisor: Аналогично и с Trade.Price иногда приходит null

Такое невозможно, потому что double не может принимать null.

Прошу прощения, имел ввиду что иногда приходит NullReferenceException вот в таком коде:

Думаю, ошибка тут вовсе не в S#. Где-то переменную не инициализируете.

President
President Автор

Понял. Получается это ограничение конкретно Квика и данных на FTP у РТС. И если с будет нормальный коннект с биржей или данные на FTP поправят то и это поле в соответствующем случае будет содержать нормальные данные.

Первая мысль возникла что можно наверное было бы вылавливать свои трейды из общего списка трейдов (в Квике). Но ведь трейд наверное в мой список прилетает раньше чем в общий (по крайней мере я надеюсь что это именно так;) - а тогда это не вариант. Тогда согласен что nullable это наилучшее решение тут.

Спасибо за пояснения!

Alexander
Alexander

President: Понял. Получается это ограничение конкретно Квика и данных на FTP у РТС. И если с будет нормальный коннект с биржей или данные на FTP поправят то и это поле в соответствующем случае будет содержать нормальные данные.

Первая мысль возникла что можно наверное было бы вылавливать свои трейды из общего списка трейдов (в Квике). Но ведь трейд наверное в мой список прилетает раньше чем в общий (по крайней мере я надеюсь что это именно так;) - а тогда это не вариант. Тогда согласен что nullable это наилучшее решение тут.

Спасибо за пояснения!

Нет гарантии кто куда придёт первым. Экспорт идёт независимо по таблицам.