Здравствуйте.
Скажите, а почему событие NewTrades возыращает IEnumerable? разве оно
не возникает при событии появления КАЖДОЙ сделки? Если нет, то как оно
возникает?
Заранее спаисибо.
Походу я нашел ответ - у мея DDE был запущен только для интсрументов
только - ой-ой-ой - мне в IEnumerable<Trade> obj выдало 16384 сделки
по всяким разным бумагам. как с этим бороться? мне нужн опо
конкретной, вот по этой :
QuikTrader.RegisterTrades не работает для Квика. Логика пусткая. Я
сделал это метод из-за того, что другие шлюзы как раз поддерживают
такой метод.
Что касается Квика, то фильт сделок настраивается из него, путем
редактирования таблицы и применения табличного фильтра. К сожалению
никак.
тут интересный эксперимент провел. Есл ина таблице сделки поставлен
фильтр , и записей в ней относительно немного (до 100 000), то событие
начинает возникат ьименно в момент прихода сделки, и в коллекции
всегда 1 сделка. Но если в таблице сделок до хрена - например 150 или
800 тыщ (результат за весь денб), то квик почему т овначале начинает
выдавать сделки кусками по 16384 сделки, причем с какой то ему одному
важной даты, выдает таких пакетов N штук, потом "неполный пакет" -
например 8536 сделок, причем в этом неполном пакете последняя сделка с
датой/временем когда создался DDE канаал, а потом как обычн опо 1-й
сделке. Логику это поведения я так и не понял - так как
колво_пакетов_по_16384_сделок*16384 != колву записей в таблице, и
дата, от которой отбирает сделки для формирования этих пакетов != дате
первой сделке в таблице.
Неа. я вычислил время от кторой начинается вот это вываливание сделок
11:57:18 (если точно помню). причем - либ ос этой даты, либо от
вренмени ближе к вечеру - от 17 часов приблизительно, причем если это
не 11:57:18, то время варьрируется. Было бы понятно если бы квик
выдавал историю сделок за день, н оистория начинается то с 10.30, а не
с 11:57:18, и непонятно почему то с 11:57:18, т ос какой то
произвольного времени. загадка... Причем в Эксель квик честно вывалил
всю таблицу. И повторюсь - магия эта при большом колве записай в
таблице сделок - от 100 тысяч
Я лишнее убрал, оставил самое необходимое. Вся сагия происходит когда
в таблице сделок много записей. я тестил на настрйоках, когда в
таблицу сделок
выводятся все сделки, так же когда выводятся сделки из А1(Акции)
А толку? в обработчик события все равн онепонятно почему приходят
пакеты сделок, бывших ранее. Вопрос - почему? Событие то - появление
НОВОЙ сделки. и на таблицах с небольшим колвом-записей оно так и
работает. Просто непоняно - почему и в зависимости от каких условий
вначале вываливаются вот такие пакеты, а потом идет уже честное
появление сделок по одной.
Они всегда новые. Можете для проверки завести Dictionary<long, Trade>
и через Add добавлять пришедшие сделки. Если не будет исключения -
значит приходят только уникальные.
Насчет 11 утра. Я думаю, если сделать так: obj.OrderBy(o =>
o.Id).FirstOrDefault(), то сделки начнут приходить с 1030. В таблице в
квике они с 1030?
Когда стартуется ДДЕ экспорт, то подгружаются все сделки, которые есть
на данный момент в таблице. И загрузка идет непрерывно. Появляются
новые - срабатывает событие. Отсюда и ситуация, когда первые сделки
идут большими пачками, а затем, когда уже идет загрузка сделок,
появляющиеся в настоящий момент, то и будут от 1-ой до нескольких
(смотря, какой ликвидности инструменты).
Насчет новые. Имеется ввиду, что одна и так же сделка будет передана
через событие NewTrades только один раз - не более. Даже если
перезапускать экспорт.
Хм. Подгружаются вот только они не всегда, а только тогда, когда в
таблице много записей.
Если записей не мног она момент запуска програмы - стразу фигачатся
сделки по одной по мере поступления их в квик, а есл имного - то
вначале вываливаются пачками до момента запуска программы, а потом уже
по одной.
Я правда не пойму - почему в оперделенных случаях в событие NewTrades
вываливаются вначале все сделки, а потом уже новые, а в каких то -
только новые сделки. вот не пойму и все :)
Сложно ответить - никогда такое не происходило. Всегда экспортируются
все сделки, которые есть в таблице (новые, не новые - не важно).
Попробуйте найти закономерность.
Я уже обыскался :) Закономерность пока такая - старые пачками
вываливаются . есл ив таблице сделок больше 100 записей.
а вот время, с кторого сделки ываливаются - разное
Как видно из строки, есть только компонента, содержащая время. Но
метод To сделает полноценный DateTime, с датой. Потому что он просто
возьмет текущую дату. Уловили? Ваши сделки за вчера с временем 19:00
будут рассматриваться просто как сделки сегодняшние. Может быть Вам
почистить таблицу сделок перед запуском роботов?
"19:00:00".To() даст понимание того, почему вчерашняя сделка
транслируется как сегодняшняя.
Почистить - значит удалить эти вчерашние строки. Думаю, они хранятся
только у Вас локально на компьютере, и Квик сервер их не
перетраслирует заново. Как вариант, через Связь-Списки перезакачать
данные заново.
Ну фиг с ними со вчерашними. Вопрос то в том - почему когда в таблице
сделок записей много -происходит вывод пакетами бывших сделок,а потом
уже тех, кторые реально новые.
Причем что инетересно - вот в эти пакеты попадают те сделки, время
кторых меньше момента подписки на событие NewTrades.
コメント (35)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
И почему то не работает следующий код:
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 ни разу не заходит. эт оможет быть изза того, что сделки по луку не идут?
Посмотрел - есть сделки по луку, почему ж тогда событие не вызывается : (
Походу я нашел ответ - у мея DDE был запущен только для интсрументов только - ой-ой-ой - мне в IEnumerable<Trade> obj выдало 16384 сделки по всяким разным бумагам. как с этим бороться? мне нужн опо конкретной, вот по этой :
Security sec = TerminalProcessorHelper.Trader.Securities.Where(p => p.Code == tiker.Asset.Name).Last();
я честно горя думал, что когда вызываю TerminalProcessorHelper.Trader.RegisterTrades(sec);
этим указываю ,что именно эту бумагу мне нужно слушать. чтож он омне все вываливает? :(
Квик шлет сделки пачками, как и другие шлюзы. Поэтому коллекция сделок, а не одна.
QuikTrader.RegisterTrades не работает для Квика. Логика пусткая. Я сделал это метод из-за того, что другие шлюзы как раз поддерживают такой метод. Что касается Квика, то фильт сделок настраивается из него, путем редактирования таблицы и применения табличного фильтра. К сожалению никак.
тут интересный эксперимент провел. Есл ина таблице сделки поставлен фильтр , и записей в ней относительно немного (до 100 000), то событие начинает возникат ьименно в момент прихода сделки, и в коллекции всегда 1 сделка. Но если в таблице сделок до хрена - например 150 или 800 тыщ (результат за весь денб), то квик почему т овначале начинает выдавать сделки кусками по 16384 сделки, причем с какой то ему одному важной даты, выдает таких пакетов N штук, потом "неполный пакет" - например 8536 сделок, причем в этом неполном пакете последняя сделка с датой/временем когда создался DDE канаал, а потом как обычн опо 1-й сделке. Логику это поведения я так и не понял - так как колво_пакетов_по_16384_сделок*16384 != колву записей в таблице, и дата, от которой отбирает сделки для формирования этих пакетов != дате первой сделке в таблице.
А как же
В сумме разве не дает?
Неа. я вычислил время от кторой начинается вот это вываливание сделок
Можете показать, как Вы эту дату нашли?
Так я ее не сам нашел, эт мне так логгер показывает.Собственно весь код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ecng.Trading.BusinessEntities;
namespace TerminalProcessor { public class DealsAccumulator : AbstractDataAccumulator {
TerminalProcessorHelper.Trader.Securities.Where(p => p.Code == tiker.Asset.Name).Last(); // тут в переменной sec получается лукойл (LKOH) TerminalProcessorHelper.Trader.RegisterTrades(sec); TerminalProcessorHelper.Trader.NewTrades += Trader_NewTrades;
trade.Time);
}
Я лишнее убрал, оставил самое необходимое. Вся сагия происходит когда в таблице сделок много записей. я тестил на настрйоках, когда в таблицу сделок выводятся все сделки, так же когда выводятся сделки из А1(Акции)
А если сделать так:
obj.OrderBy(o => o.Id).FirstOrDefault()
А толку? в обработчик события все равн онепонятно почему приходят пакеты сделок, бывших ранее. Вопрос - почему? Событие то - появление НОВОЙ сделки. и на таблицах с небольшим колвом-записей оно так и работает. Просто непоняно - почему и в зависимости от каких условий вначале вываливаются вот такие пакеты, а потом идет уже честное появление сделок по одной.
Или Вы имеете ввиду в выводе лога так сделать?
В выводе лога.
Они всегда новые. Можете для проверки завести Dictionary<long, Trade> и через Add добавлять пришедшие сделки. Если не будет исключения - значит приходят только уникальные.
Как же новые, если я вечером запускаю а сделки приходят со временем 11 утра :)
Насчет 11 утра. Я думаю, если сделать так: obj.OrderBy(o => o.Id).FirstOrDefault(), то сделки начнут приходить с 1030. В таблице в квике они с 1030?
Когда стартуется ДДЕ экспорт, то подгружаются все сделки, которые есть на данный момент в таблице. И загрузка идет непрерывно. Появляются новые - срабатывает событие. Отсюда и ситуация, когда первые сделки идут большими пачками, а затем, когда уже идет загрузка сделок, появляющиеся в настоящий момент, то и будут от 1-ой до нескольких (смотря, какой ликвидности инструменты).
Насчет новые. Имеется ввиду, что одна и так же сделка будет передана через событие NewTrades только один раз - не более. Даже если перезапускать экспорт.
Хм. Подгружаются вот только они не всегда, а только тогда, когда в таблице много записей. Если записей не мног она момент запуска програмы - стразу фигачатся сделки по одной по мере поступления их в квик, а есл имного - то вначале вываливаются пачками до момента запуска программы, а потом уже по одной.
Я правда не пойму - почему в оперделенных случаях в событие NewTrades вываливаются вначале все сделки, а потом уже новые, а в каких то - только новые сделки. вот не пойму и все :)
Сделал я Order. нифига не с 10.30, три каждом запуске - разное время из середины дня.
Сложно ответить - никогда такое не происходило. Всегда экспортируются все сделки, которые есть в таблице (новые, не новые - не важно). Попробуйте найти закономерность.
Я уже обыскался :) Закономерность пока такая - старые пачками вываливаются . есл ив таблице сделок больше 100 записей. а вот время, с кторого сделки ываливаются - разное
А у вас в таблице всех сделок, если посмотреть в Квике, сделки с 1030 идут?
Неа, вообще чуть не со вчерашнего дня. первая 19:00:00
А лог выдал дату 01.04.2010 14:20:21 кодя для лога TerminalProcessorLogger.Logger.Debug(obj.OrderBy(o =>o.Id).FirstOrDefault().Time);
Так, а минимальное время за 2 дня какое?
в смысле минимальное? Запись с порядковым номерм 1 в таблице Все сделки имеет время 19:00:00 (дата видимо вчера)
Квик не транслирует дату. Поэтому 19:00 - точно не будет минимальным.
а как же поле Trade.Time?
Попробуйте сделать такое:
"19:00:00".To()
Как видно из строки, есть только компонента, содержащая время. Но метод To сделает полноценный DateTime, с датой. Потому что он просто возьмет текущую дату. Уловили? Ваши сделки за вчера с временем 19:00 будут рассматриваться просто как сделки сегодняшние. Может быть Вам почистить таблицу сделок перед запуском роботов?
Честно говоря не до конца понимаю, что мне даст "19:00:00".To<DateTime>()
и что значит "Почистить таблицу сделок". Фильтр с инструментами наложить ?
"19:00:00".To() даст понимание того, почему вчерашняя сделка
транслируется как сегодняшняя.
Почистить - значит удалить эти вчерашние строки. Думаю, они хранятся только у Вас локально на компьютере, и Квик сервер их не перетраслирует заново. Как вариант, через Связь-Списки перезакачать данные заново.
Ну фиг с ними со вчерашними. Вопрос то в том - почему когда в таблице сделок записей много -происходит вывод пакетами бывших сделок,а потом уже тех, кторые реально новые. Причем что инетересно - вот в эти пакеты попадают те сделки, время кторых меньше момента подписки на событие NewTrades.
Подумал еще раз - сделаю экспорт даты для сделок в следующем релизе. Вносит путаницу.