← Zurück

Не проставляется OrderDirection в сделке

ó ÐÏÍÏÝØÀ Ó×ÏÅÇÏ ÍÅÔÏÄÁ: if (multiTrader.Trades.Count() > 0) { if (!Directory.Exists("MarketData")) { Directory.CreateDirectory("MarketData"); } var allTradesSw = new StreamWriter("MarketData\{0}{1:00}_{2:00} _AllTrades.log".Put(_multiTrader.Trades.Last().Time.Year, _multiTrader.Trades.Last().Time.Month, _multiTrader.Trades.Last().Time.Day), false); foreach (var trade in _multiTrader.Trades) { allTradesSw.WriteLine("{0} - {1} - {2} - {3}", trade.Time, trade.Price, trade.Volume, trade.OrderDirection); } allTradesSw.Close(); }

ðÅÞÁÔÁÀ ×ÓÅ ÓÄÅÌËÉ (ÌÅÎÔÕ) ÚÁ ÄÅÎØ. òÅÄËÏ, ÎÏ ÐÏÒÏÊ ÐÏÐÁÄÁÀÔÓÑ ÓÄÅÌËÉ ÂÅÚ ÐÒÏÓÔÁ×ÌÅÎÎÏÇÏ ÐÏÌÑ OrderDirection. ôÏÌÉ ÜÔÏ ÎÅ×ÅÒÎÏ ÒÁÂÏÔÁÅÔ ÐÅÞÁÔØ, ÔÏ ÌÉ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÞÔÏ-ÔÏ ÎÅ ÐÒÏÓÔÁ×ÌÑÅÔÓÑ (× Ë×ÉËÅ Õ ÄÁÎÎÙÈ ÓÄÅÌÏË ÎÁÐÒÁ×ÌÅÎÉÅ ÐÒÏÓÔÁ×ÌÅÎÏ). ÷ÏÔ ÐÒÉÍÅÒ ÉÚ ÆÁÊÌÁ ÓÏ ×ÓÅÍÉ ÓÄÅÌËÁÍÉ:

24.08.2010 23:45:01 - 138895 - 1 - Sell 24.08.2010 23:45:01 - 138890 - 1 - Sell 24.08.2010 23:45:01 - 138925 - 2 - 24.08.2010 23:45:01 - 138930 - 1 - Buy 24.08.2010 23:45:01 - 138930 - 3 - Buy 24.08.2010 23:45:01 - 138935 - 3 - Buy 24.08.2010 23:45:01 - 138935 - 2 - Buy 24.08.2010 23:45:01 - 138935 - 1 - Buy 24.08.2010 23:45:01 - 138940 - 3 - Buy 24.08.2010 23:45:02 - 138910 - 1 - Sell 24.08.2010 23:45:02 - 138935 - 2 - 24.08.2010 23:45:02 - 138935 - 1 - 24.08.2010 23:45:02 - 138930 - 2 - Buy 24.08.2010 23:45:02 - 138935 - 1 - Buy

úÁ×ÔÒÁ ×ÅÞÅÒÏÍ, ÅÓÌÉ OrderDirection ÎÅ ÓÅÌÌ É ÎÅ ÂÁÊ - ÂÕÄÅÔ ÏËÏÛËÏ ×ÙÄÁ×ÁÔØ. ôÁË ÈÏÔØ ÍÏÖÎÏ ÂÕÄÅÔ ÐÏÎÑÔØ × ËÁËÏÍ ÉÍÅÎÎÏ ÍÅÓÔÅ ×ÏÚÎÉËÁÅÔ ÏÛÉÂËÁ, ÏÔÐÉÛÕÓØ.

War dieses Thema hilfreich?

Thema teilen

Kommentare (15)

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

Mikhail Sukhov
Mikhail Sukhov

Что-то совсем плохие сервисы у гугла стали... Можешь написать русский текст отдельным сообщением?

Иванов Андрей
Иванов Андрей

ó ĐĎÍĎÝŘŔ Ó×ĎĹÇĎ ÍĹÔĎÄÁ: if (multiTrader.Trades.Count() > 0) { if (!Directory.Exists("MarketData")) { Directory.CreateDirectory("MarketData"); } var allTradesSw = new StreamWriter("MarketData\{0}{1:00}_{2:00} _AllTrades.log".Put(_multiTrader.Trades.Last().Time.Year, _multiTrader.Trades.Last().Time.Month, _multiTrader.Trades.Last().Time.Day), false); foreach (var trade in _multiTrader.Trades) { allTradesSw.WriteLine("{0} - {1} - {2} - {3}", trade.Time, trade.Price, trade.Volume, trade.OrderDirection); } allTradesSw.Close(); }

đĹŢÁÔÁŔ ×ÓĹ ÓÄĹĚËÉ (ĚĹÎÔŐ) ÚÁ ÄĹÎŘ. ňĹÄËĎ, ÎĎ ĐĎŇĎĘ ĐĎĐÁÄÁŔÔÓŃ ÓÄĹĚËÉ ÂĹÚ ĐŇĎÓÔÁ×ĚĹÎÎĎÇĎ ĐĎĚŃ OrderDirection. ôĎĚÉ ÜÔĎ ÎĹ×ĹŇÎĎ ŇÁÂĎÔÁĹÔ ĐĹŢÁÔŘ, ÔĎ ĚÉ ÄĹĘÓÔ×ÉÔĹĚŘÎĎ ŢÔĎ-ÔĎ ÎĹ ĐŇĎÓÔÁ×ĚŃĹÔÓŃ (× Ë×ÉËĹ Ő ÄÁÎÎŮČ ÓÄĹĚĎË ÎÁĐŇÁ×ĚĹÎÉĹ ĐŇĎÓÔÁ×ĚĹÎĎ). ÷ĎÔ ĐŇÉÍĹŇ ÉÚ ĆÁĘĚÁ ÓĎ ×ÓĹÍÉ ÓÄĹĚËÁÍÉ:

24.08.2010 23:45:01 - 138895 - 1 - Sell 24.08.2010 23:45:01 - 138890 - 1 - Sell 24.08.2010 23:45:01 - 138925 - 2 - 24.08.2010 23:45:01 - 138930 - 1 - Buy 24.08.2010 23:45:01 - 138930 - 3 - Buy 24.08.2010 23:45:01 - 138935 - 3 - Buy 24.08.2010 23:45:01 - 138935 - 2 - Buy 24.08.2010 23:45:01 - 138935 - 1 - Buy 24.08.2010 23:45:01 - 138940 - 3 - Buy 24.08.2010 23:45:02 - 138910 - 1 - Sell 24.08.2010 23:45:02 - 138935 - 2 - 24.08.2010 23:45:02 - 138935 - 1 - 24.08.2010 23:45:02 - 138930 - 2 - Buy 24.08.2010 23:45:02 - 138935 - 1 - Buy

úÁ×ÔŇÁ ×ĹŢĹŇĎÍ, ĹÓĚÉ OrderDirection ÎĹ ÓĹĚĚ É ÎĹ ÂÁĘ - ÂŐÄĹÔ ĎËĎŰËĎ ×ŮÄÁ×ÁÔŘ. ôÁË ČĎÔŘ ÍĎÖÎĎ ÂŐÄĹÔ ĐĎÎŃÔŘ × ËÁËĎÍ ÉÍ

äÁĚŘŰĹ ÔĹËÓÔ ĎÂŇŮ×ÁĹÔÓŃ =)

Mikhail Sukhov
Mikhail Sukhov

Андрей, Вы мега хацкер.

Александр, лучше сразу мониторить ProcessWellKnownDdeData и ждать там такие сделки. Если пустое направление - сразу записывать дде данные.

Alexander
Alexander Autor

Такие результаты:

  1. На локальном компьютере (с 1м квиком) - OrderDirection проставлен везде
  2. На сервере (5 квиков) - довольно много сделок где OrderDirection нет, т.е. null. :(
Mikhail Sukhov
Mikhail Sukhov

Без лога сложновато разораться... Еще такой вопрос. А эти сделки случаем не являются ли собственными (тиковая сделка, порожденная собственно)?

Alexander
Alexander Autor

Нет, не являются. Они печатаются просто из MultiTrader.Trades, в первом сообщении скидывал кусок кода.

Куда лог добавить? Могу поэкспериментировать. хотя можем посмотреть как повлияет фикс в 2.3.1 который, как я понимаю, не будет в MultiTrader.Trades выдавать все сделки от 6 квиков, а только объединённые.

Mikhail Sukhov
Mikhail Sukhov

То, что сделка получается через MultiTrader.Trades еще не является гарантом того, что она не своя. Своя сделка - это объединение тиковой

  • номер заявки.

Лог добавлять в QuikTrader, так как это его событие. А уже его в MultiTrader.

aerv
aerv

У меня сходная ситуация. Анализирую у QuikTrader все сделки: попадаются с trade.OrderDirection == null. По Id сделки выяснил, что это как раз мои сделки. Чтоб много букав не писать привожу примерный код:


_trader = new QuikTrader(_quikPath);
_trader.Terminal.StartDde(_trader.TradesTable,
                          _trader.MyTradesTable,
                          _trader.EquityPositionsTable,
                          _trader.DerivativePositionsTable,
                          _trader.SecuritiesTable);
//..
var trades = _trader.Trades.Where(trade => trade.Security.Code == _secCode);
foreach (Trade trade in trades) {
  if (!trade.OrderDirection.HasValue)
    ;// Опа! И сюда заходит
}

В принципе, для меня это не критично, все остальное работает, но несколько не понятно: почему в таблице всех сделок Квика направление указано для всех сделок, а в _trader.Trades только для "чужих".

Mikhail Sukhov
Mikhail Sukhov

aerv: В принципе, для меня это не критично, все остальное работает, но несколько не понятно: почему в таблице всех сделок Квика направление указано для всех сделок, а в _trader.Trades только для "чужих".

Потому что для MyTrade информация не берется из таблицы всех сделок. Вся необходимая информация есть в таблице Мои Сделки. А направления там нет.

aerv
aerv

Та сделка которую совершил мой робот попадает в обе таблицы Квика: "Все сделки" и "Мои сделки" со всей требуемой информацией. Затем эта сделка попадает в список _trader.Trades но почему-то уже без направления. Почему - не понятно. Я сначала подумал: может это ошибка какая-то? Но если это "by design" и так и должно быть, то ладно.

Mikhail Sukhov
Mikhail Sukhov

aerv: Та сделка которую совершил мой робот попадает в обе таблицы Квика: "Все сделки" и "Мои сделки" со всей требуемой информацией.

Только вот сканирования всех сделок на поиск направление не было сделано в целях оптимизации.

aerv: Затем эта сделка попадает в список _trader.Trades но почему-то уже без направления. Почему - не понятно.

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

aerv: Я сначала подумал: может это ошибка какая-то? Но если это "by design" и так и должно быть, то ладно.

Я бы сказал так - исторически сложившаяся бага.🙂 Я занес в баг трекинг ссылку на топик. Но пока не скоро смогу что-то придумать - есть баги приоритетнее.

aerv
aerv

Mikhail Sukhov:

aerv: Та сделка которую совершил мой робот попадает в обе таблицы Квика: "Все сделки" и "Мои сделки" со всей требуемой информацией. Затем эта сделка попадает в список _trader.Trades но почему-то уже без направления. Почему - не понятно.

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

Я бы сказал так - исторически сложившаяся бага.🙂 Я занес в баг трекинг ссылку на топик. Но пока не скоро смогу что-то придумать - есть баги приоритетнее.

Я бы предложил заполнять список QuikTrader.Trades только по данным ДДЕ из таблицы "Все сделки" Квика. Пытаться мудрить и комбинировать его с данными из таблицы "Мои сделки" - ИМХО только лишние взаимосвязи городить. Запутаться и без этих сложностей можно. Я, например, точно смогу 🙂

Спасибо Вам Михаил за библиотеку и ее поддержку!

aerv
aerv

Кстати, в то же время когда мой робот совершает сделку, может возникнуть и дублирующаяся свеча: 20110203,172300,191535,191535,191535,191535,3 20110203,172300,191600,191655,191505,191550,1113

  • это свечи, полученные _candleManager.GetTimeFrameCandles(...): дата, время, цены, объем. "3" - как раз объем моей сделки.

20110203,172339,-1,191535,3

  • это из списка всех сделок, полученных из QuikTrader.Trades. "-1" - это нет направления.

Предположу, что это связанные проблемы: заполнение Trades сделками из MyTrades и дублирующиеся свечи http://stocksharp.com/forum/1330/Niepravil-naia-vydacha-sviechiek-v-CandleManager-GetTimeFrameCandles/

Mikhail Sukhov
Mikhail Sukhov

aerv: Предположу, что это связанные проблемы: заполнение Trades сделками из MyTrades и дублирующиеся свечи http://stocksharp.com/forum/1330/Niepravil-naia-vydacha-sviechiek-v-CandleManager-GetTimeFrameCandles/

Точно, как раз из-за этого. Собственная сделка приходит раньше, поэтому на какой-то момент формируется свечка раньше времени. Поэтому, я решил сделать то, как Вы предложили, и убить сразу 2-ух зайцев. Но тогда ITrader.Trades.Contains(myTrade.Trade) будет возвращать false, но я пока не вижу, когда это может быть полезно.

aerv
aerv

Mikhail Sukhov: Но тогда ITrader.Trades.Contains(myTrade.Trade) будет возвращать false, но я пока не вижу, когда это может быть полезно.

Не думаю, что это сильно помешает. Искать свою сделку можно, например, так:


_trader.Trades.Contains(myTrade.Trade, new TradeByIdComparer());
// Или так
int index = Array.BinarySearch(_trader.Trades.ToArray(), myTrade.Trade, new TradeByIdComparer());

// Где-то в другом месте
class TradeByIdComparer : IComparer<Trade>, IEqualityComparer<Trade> {
  public int Compare(Trade t1, Trade t2) { return (int) (t1.Id - t2.Id); }
  public bool Equals(Trade t1, Trade t2) { return t1.Id == t2.Id; }
  public int GetHashCode(Trade obj) { return obj.Id.GetHashCode(); }
}