← Zurück

[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 приходит правильный

War dieses Thema hilfreich?

Thema teilen

Kommentare (13)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

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

President
President Autor

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 Autor

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 Autor

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 Autor

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

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

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

Alexander
Alexander

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

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

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

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