← 返回

Событие NewTrades

Здравствуйте. Скажите, а почему событие NewTrades возыращает IEnumerable? разве оно не возникает при событии появления КАЖДОЙ сделки? Если нет, то как оно возникает? Заранее спаисибо.

本主题对您有帮助吗?

分享主题

评论 (35)

登录创建账户, 登录或注册以发表评论

Tauler
Tauler 作者

И почему то не работает следующий код:

Security sec = TerminalProcessorHelper.Trader.Securities.Where(p => p.Code == tiker.Asset.Name).Last(); TerminalProcessorHelper.Trader.RegisterTrades(sec); TerminalProcessorHelper.Trader.NewTrades += Trader_NewTrades;

void Trader_NewTrades(IEnumerable<Trade> obj) { TerminalProcessorLogger.Logger.Debug("new deals"); }

в метод Trader_NewTrades ни разу не заходит. эт оможет быть изза того, что сделки по луку не идут?

Tauler
Tauler 作者

Посмотрел - есть сделки по луку, почему ж тогда событие не вызывается : (

Tauler
Tauler 作者

Походу я нашел ответ - у мея DDE был запущен только для интсрументов только - ой-ой-ой - мне в IEnumerable<Trade> obj выдало 16384 сделки по всяким разным бумагам. как с этим бороться? мне нужн опо конкретной, вот по этой :

Security sec = TerminalProcessorHelper.Trader.Securities.Where(p => p.Code == tiker.Asset.Name).Last();

я честно горя думал, что когда вызываю TerminalProcessorHelper.Trader.RegisterTrades(sec);

этим указываю ,что именно эту бумагу мне нужно слушать. чтож он омне все вываливает? :(

Mikhail Sukhov
Mikhail Sukhov

Квик шлет сделки пачками, как и другие шлюзы. Поэтому коллекция сделок, а не одна.

Mikhail Sukhov
Mikhail Sukhov

QuikTrader.RegisterTrades не работает для Квика. Логика пусткая. Я сделал это метод из-за того, что другие шлюзы как раз поддерживают такой метод. Что касается Квика, то фильт сделок настраивается из него, путем редактирования таблицы и применения табличного фильтра. К сожалению никак.

Tauler
Tauler 作者

тут интересный эксперимент провел. Есл ина таблице сделки поставлен фильтр , и записей в ней относительно немного (до 100 000), то событие начинает возникат ьименно в момент прихода сделки, и в коллекции всегда 1 сделка. Но если в таблице сделок до хрена - например 150 или 800 тыщ (результат за весь денб), то квик почему т овначале начинает выдавать сделки кусками по 16384 сделки, причем с какой то ему одному важной даты, выдает таких пакетов N штук, потом "неполный пакет" - например 8536 сделок, причем в этом неполном пакете последняя сделка с датой/временем когда создался DDE канаал, а потом как обычн опо 1-й сделке. Логику это поведения я так и не понял - так как колво_пакетов_по_16384_сделок*16384 != колву записей в таблице, и дата, от которой отбирает сделки для формирования этих пакетов != дате первой сделке в таблице.

Mikhail Sukhov
Mikhail Sukhov

А как же

В сумме разве не дает?

Tauler
Tauler 作者

Неа. я вычислил время от кторой начинается вот это вываливание сделок

  • 11:57:18 (если точно помню). причем - либ ос этой даты, либо от вренмени ближе к вечеру - от 17 часов приблизительно, причем если это не 11:57:18, то время варьрируется. Было бы понятно если бы квик выдавал историю сделок за день, н оистория начинается то с 10.30, а не с 11:57:18, и непонятно почему то с 11:57:18, т ос какой то произвольного времени. загадка... Причем в Эксель квик честно вывалил всю таблицу. И повторюсь - магия эта при большом колве записай в таблице сделок - от 100 тысяч
Mikhail Sukhov
Mikhail Sukhov

Можете показать, как Вы эту дату нашли?

Tauler
Tauler 作者

Так я ее не сам нашел, эт мне так логгер показывает.Собственно весь код:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ecng.Trading.BusinessEntities;

namespace TerminalProcessor { public class DealsAccumulator : AbstractDataAccumulator {

   protected internal DealsAccumulator(Tiker tiker)
        : base(tiker)
    {
         Security sec =

TerminalProcessorHelper.Trader.Securities.Where(p => p.Code == tiker.Asset.Name).Last(); // тут в переменной sec получается лукойл (LKOH) TerminalProcessorHelper.Trader.RegisterTrades(sec); TerminalProcessorHelper.Trader.NewTrades += Trader_NewTrades;

   }

   void Trader_NewTrades(IEnumerable<Trade> obj)
    {
        Trade trade = obj.FirstOrDefault();
        TerminalProcessorLogger.Logger.Debug(obj.Count()+ "     "
  • trade.Time);

     }
    

    }

Я лишнее убрал, оставил самое необходимое. Вся сагия происходит когда в таблице сделок много записей. я тестил на настрйоках, когда в таблицу сделок выводятся все сделки, так же когда выводятся сделки из А1(Акции)

Mikhail Sukhov
Mikhail Sukhov

А если сделать так:

obj.OrderBy(o => o.Id).FirstOrDefault()

Tauler
Tauler 作者

А толку? в обработчик события все равн онепонятно почему приходят пакеты сделок, бывших ранее. Вопрос - почему? Событие то - появление НОВОЙ сделки. и на таблицах с небольшим колвом-записей оно так и работает. Просто непоняно - почему и в зависимости от каких условий вначале вываливаются вот такие пакеты, а потом идет уже честное появление сделок по одной.

Tauler
Tauler 作者

Или Вы имеете ввиду в выводе лога так сделать?

Mikhail Sukhov
Mikhail Sukhov

В выводе лога.

Mikhail Sukhov
Mikhail Sukhov

Они всегда новые. Можете для проверки завести Dictionary<long, Trade> и через Add добавлять пришедшие сделки. Если не будет исключения - значит приходят только уникальные.

Tauler
Tauler 作者

Как же новые, если я вечером запускаю а сделки приходят со временем 11 утра :)

Mikhail Sukhov
Mikhail Sukhov

Насчет 11 утра. Я думаю, если сделать так: obj.OrderBy(o => o.Id).FirstOrDefault(), то сделки начнут приходить с 1030. В таблице в квике они с 1030?

Когда стартуется ДДЕ экспорт, то подгружаются все сделки, которые есть на данный момент в таблице. И загрузка идет непрерывно. Появляются новые - срабатывает событие. Отсюда и ситуация, когда первые сделки идут большими пачками, а затем, когда уже идет загрузка сделок, появляющиеся в настоящий момент, то и будут от 1-ой до нескольких (смотря, какой ликвидности инструменты).

Насчет новые. Имеется ввиду, что одна и так же сделка будет передана через событие NewTrades только один раз - не более. Даже если перезапускать экспорт.

Tauler
Tauler 作者

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

Tauler
Tauler 作者

Я правда не пойму - почему в оперделенных случаях в событие NewTrades вываливаются вначале все сделки, а потом уже новые, а в каких то - только новые сделки. вот не пойму и все :)

Tauler
Tauler 作者

Сделал я Order. нифига не с 10.30, три каждом запуске - разное время из середины дня.

Mikhail Sukhov
Mikhail Sukhov

Сложно ответить - никогда такое не происходило. Всегда экспортируются все сделки, которые есть в таблице (новые, не новые - не важно). Попробуйте найти закономерность.

Tauler
Tauler 作者

Я уже обыскался :) Закономерность пока такая - старые пачками вываливаются . есл ив таблице сделок больше 100 записей. а вот время, с кторого сделки ываливаются - разное

Mikhail Sukhov
Mikhail Sukhov

А у вас в таблице всех сделок, если посмотреть в Квике, сделки с 1030 идут?

Tauler
Tauler 作者

Неа, вообще чуть не со вчерашнего дня. первая 19:00:00

Tauler
Tauler 作者

А лог выдал дату 01.04.2010 14:20:21 кодя для лога TerminalProcessorLogger.Logger.Debug(obj.OrderBy(o =>o.Id).FirstOrDefault().Time);

Mikhail Sukhov
Mikhail Sukhov

Так, а минимальное время за 2 дня какое?

Tauler
Tauler 作者

в смысле минимальное? Запись с порядковым номерм 1 в таблице Все сделки имеет время 19:00:00 (дата видимо вчера)

Mikhail Sukhov
Mikhail Sukhov

Квик не транслирует дату. Поэтому 19:00 - точно не будет минимальным.

Tauler
Tauler 作者

а как же поле Trade.Time?

Mikhail Sukhov
Mikhail Sukhov

Попробуйте сделать такое:

"19:00:00".To()

Как видно из строки, есть только компонента, содержащая время. Но метод To сделает полноценный DateTime, с датой. Потому что он просто возьмет текущую дату. Уловили? Ваши сделки за вчера с временем 19:00 будут рассматриваться просто как сделки сегодняшние. Может быть Вам почистить таблицу сделок перед запуском роботов?

Tauler
Tauler 作者

Честно говоря не до конца понимаю, что мне даст "19:00:00".To<DateTime>()

и что значит "Почистить таблицу сделок". Фильтр с инструментами наложить ?

Mikhail Sukhov
Mikhail Sukhov

"19:00:00".To() даст понимание того, почему вчерашняя сделка транслируется как сегодняшняя.

Почистить - значит удалить эти вчерашние строки. Думаю, они хранятся только у Вас локально на компьютере, и Квик сервер их не перетраслирует заново. Как вариант, через Связь-Списки перезакачать данные заново.

Tauler
Tauler 作者

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

Mikhail Sukhov
Mikhail Sukhov
  1. Потому что так устроен механизм экспорта сделок.
  2. Конечно, NewTrades - это событие появления новых сделок в программе роботе, а не в Квике.
Mikhail Sukhov
Mikhail Sukhov

Подумал еще раз - сделаю экспорт даты для сделок в следующем релизе. Вносит путаницу.