Algorithmischer Handel für .NET und Python✦86+ Konnektoren · Börsen · Broker · Krypto✦S#.Designer · Backtest · optimieren · live gehen✦Eine Community von 31,455+ Tradern und Entwicklern✦Algorithmischer Handel für .NET und Python✦86+ Konnektoren · Börsen · Broker · Krypto✦S#.Designer · Backtest · optimieren · live gehen✦Eine Community von 31,455+ Tradern und Entwicklern✦
Здравствуйте.
Скажите, а почему событие NewTrades возыращает IEnumerable? разве оно
не возникает при событии появления КАЖДОЙ сделки? Если нет, то как оно
возникает?
Заранее спаисибо.
Kommentare (35)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Походу я нашел ответ - у мея 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.
Подумал еще раз - сделаю экспорт даты для сделок в следующем релизе.
Вносит путаницу.
Wir verwenden Cookies, um die beste Erfahrung auf unserer Website zu gewährleisten. Durch die weitere Nutzung unserer Seite stimmen Sie der Verwendung von Cookies zu.
Kommentare (35)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
И почему то не работает следующий код:
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.
Подумал еще раз - сделаю экспорт даты для сделок в следующем релизе. Вносит путаницу.