← 戻る

Банальная задача, но непонятно как решать.

Задача - написать отдельный сервис, который бы срабатывал в моменты 18:45:20 и 23:45:20, снимал бы статус всех счетов (балансы, открытые позиции) и отключался. В связи с асинхронной моделью задача кажется некрасиво реализуемой.

Что делаем:

  1. Подписываемся на .NewPortfolios += portfolios => .... Trader.RegisterPortfolio() здесь. Подписываемся на .NewPositions += positions => ... (хотя наверное этого можно и не делать).

  2. Запускаем StartExport

  3. Тупо в цикле делаем Thread.Sleep(1000) 20-30 раз, за это время приходят события по портфелям и по позициям. Подозреваю, что в моменты клиринга и ночью этого времени достаточно, но если времени не хватит - как понять, что вся инфомация пришла? Использовать вариант waitHandle нереально, так как кол-во портфелей может поменяться (в теории) и позиции точно каждый день разные, и сколько их - заранее неизвестно.

  4. После паузы делаем Trader.portfolios.ForEach(снять данные портфеля) Trader.positions.ForEach(снять позиции по портфелям).

  5. Далее проще - регистрируем акции/фюьчи из портфеля, смотрим их котировки/ГО и все считаем.

  6. Отключаемся.

Господа авторы, подскажите пожалуйста правильный путь. Есть ли какие-то варианты того, как убедиться в том, что (1) пришла / актуализировалась информация по всем портфелям (2) прошла информация по всем позициям?

Заранее благодарю.

このトピックは参考になりましたか?

トピックを共有

コメント (4)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

OvcharenkoVI
OvcharenkoVI

Не понятно зачем 3 пункт. Зачем подписываться на NewProtfilios и New Positions. Можно сделать таймер, например, при Trader.MarketTime = 18:45 запросить Trader.Positions. Дальше Trader.Disconnect();, а таймер Stop();

Может не так понял конечно.

ra81
ra81

Во первых не мешало бы казать что за платформа используется, то есть терминал. Это роляет как говорится. Во вторых почему бы не запускать экспорт за 5 минут до нужного времени, считывать данные тогда когда нужно и отключаться? Возможности знать точно что пришли все данные нет :). Для этого надо знать какие данные должны прийти, а коннектор этого в общем не знает.

igork
igork 著者

to OvcharenkoVI:

я тоже так сделал сначала, но получил Positions и Securities, в которых все поля нулевые (MarginBy, MarginSell, BestAskPrice и т.д. и т.д.). Без этих данных невозможно посчитать ГО, а также (предполагаемую) ликвидационную стоимость. Вот поэтому пришлось подписываться на все эти события, что очень удивило. Возможно, проблема крылась в том, что я гонял проект только в отладочном режиме VS2010. До тех пор, пока не подписался на обновление информации по позиция и инструметам, не смог получить актуальную информацию по ним.

to ra81: не очень понял, при чем тут терминал. Какой бы не использовался (SmartTrade), данные нужно брать все равно с сервера и не через терминальное API. А вот Ваша идея нравится на счет того, чтобы просыпаться на пару минут раньше и ждать назначенного времени, чтобы сразу снять последнюю информацию.

Спасибо.

ra81
ra81

igork: to ra81: не очень понял, при чем тут терминал. Какой бы не использовался (SmartTrade), данные нужно брать все равно с сервера и не через терминальное API. А вот Ваша идея нравится на счет того, чтобы просыпаться на пару минут раньше и ждать назначенного времени, чтобы сразу снять последнюю информацию.

Спасибо. Суть в том что разные терминалы по разному получают информацию и тут могут быть ньюансы :).