Задача - написать отдельный сервис, который бы срабатывал в моменты 18:45:20 и 23:45:20, снимал бы статус всех счетов (балансы, открытые позиции) и отключался. В связи с асинхронной моделью задача кажется некрасиво реализуемой.
Что делаем:
Подписываемся на .NewPortfolios += portfolios => .... Trader.RegisterPortfolio() здесь. Подписываемся на .NewPositions += positions => ... (хотя наверное этого можно и не делать).
Запускаем StartExport
Тупо в цикле делаем Thread.Sleep(1000) 20-30 раз, за это время приходят события по портфелям и по позициям. Подозреваю, что в моменты клиринга и ночью этого времени достаточно, но если времени не хватит - как понять, что вся инфомация пришла? Использовать вариант waitHandle нереально, так как кол-во портфелей может поменяться (в теории) и позиции точно каждый день разные, и сколько их - заранее неизвестно.
После паузы делаем Trader.portfolios.ForEach(снять данные портфеля) Trader.positions.ForEach(снять позиции по портфелям).
Далее проще - регистрируем акции/фюьчи из портфеля, смотрим их котировки/ГО и все считаем.
Отключаемся.
Господа авторы, подскажите пожалуйста правильный путь. Есть ли какие-то варианты того, как убедиться в том, что (1) пришла / актуализировалась информация по всем портфелям (2) прошла информация по всем позициям?
Заранее благодарю.
Comments (4)
Login or Create account, Log in or register to leave a comment
Не понятно зачем 3 пункт. Зачем подписываться на NewProtfilios и New Positions. Можно сделать таймер, например, при Trader.MarketTime = 18:45 запросить Trader.Positions. Дальше Trader.Disconnect();, а таймер Stop();
Может не так понял конечно.
Во первых не мешало бы казать что за платформа используется, то есть терминал. Это роляет как говорится. Во вторых почему бы не запускать экспорт за 5 минут до нужного времени, считывать данные тогда когда нужно и отключаться? Возможности знать точно что пришли все данные нет :). Для этого надо знать какие данные должны прийти, а коннектор этого в общем не знает.
to OvcharenkoVI:
я тоже так сделал сначала, но получил Positions и Securities, в которых все поля нулевые (MarginBy, MarginSell, BestAskPrice и т.д. и т.д.). Без этих данных невозможно посчитать ГО, а также (предполагаемую) ликвидационную стоимость. Вот поэтому пришлось подписываться на все эти события, что очень удивило. Возможно, проблема крылась в том, что я гонял проект только в отладочном режиме VS2010. До тех пор, пока не подписался на обновление информации по позиция и инструметам, не смог получить актуальную информацию по ним.
to ra81: не очень понял, при чем тут терминал. Какой бы не использовался (SmartTrade), данные нужно брать все равно с сервера и не через терминальное API. А вот Ваша идея нравится на счет того, чтобы просыпаться на пару минут раньше и ждать назначенного времени, чтобы сразу снять последнюю информацию.
Спасибо.