Добрый день, в методе подписки на свечки trader.SubscribeCandles(candleSeries, DateTime, DateTime) есть нюанс: он нормально работает только если первый параметр даты (с какой даты получать) находится в промежутке времени с 5:00 до, примерно, 16:10 (в разные дни по разному +/- 10мин). Если время дня этого параметра не попадает в промежуток, то не приходят свечки текущей сессии, только свечки до конца предыдущей. Время указал по Киеву, для Москвы, соответственно +2 Так же пока не ясно как реализовать возможность риалтайм обновления последней свечки и получения новых, исторические свечки загружаются, но последняя остаётся статичной, и не обновляется, ну и новые не появляются, т.е. метод загружает только историю, новых данных не получает. Trader.NewRealTimeCandle - рефлизации такого события в текущем API нет. Неужели надо самому реализовавать формирование свечек на основании NewTrades?
Теперь по событию: trader.SecuritiesChanged В пришедших с событием объектах Security информация есть только в том случае, если ExchangeBoard.Code этого объекта с к-вом символов >= 4. Т.е. если security.ExchangeBoard.Code == "NYSE" || "NASDAQ", то тогда есть все остальные данные в этом объекте, если ExchangeBoard.Code с тремя символами, то все остальные свойства пустые. security.ExchangeBoard.Code с четырмя и более символами приходит только в первых 1-2-ух событиях SecuritiesChanged, только тогда и можно увидеть инфу, дальше это событие приходит всегда только с тремя символами ExchangeBoard.Code, и соответственно, пустое. "NYSE" || "NASDAQ" в инструментах зависит от биржи размещения инструмента, например Майкрософт(MSFT) - NASDAQ, а вот Банк оф Америка (BAC) - NYSE. Дальше идут события с другими площадками, включая даркпулы (ADF), но всё пустое. Вот Скрин Всё то же самое касается и события trader.NewTrades. Скрин
Соответственно, из всех возможных данных в любой момент времени я могу получить только события:
- NewTrades, в которых есть цена сделки и объём, но объект Security содержит только тикер акции и площадку где прошла сделка, никаких ценовых параметров этот объект не содержит (BestAsk, BestBid, BestPair, Asks/BidsCount, Asks/BidsVolume ...).
- NewSecurities, содержит только ExchangeBoard, все остальные поля либо 0 либо null.
- SecuritiesChanged содержит только ExchangeBoard, все остальные поля либо 0 либо null. Только первое событие пришедшее после StartExport несёт данные.
- PortfoliosChanged содержит только RealizedPnL и UnrealizedPnL. Как узнать сколько у меня денег или BuyingPower непонятно.
События связанные со стаканами вообще не приходят, для регистрации стакана использовал инструменты полученные непосредственно через BlackWood, а так-же через IQFeed(реализовывал одновременно два подключения, но стакан пытался зарегить через BlackWood). Кстати, а вот через коннектор IQFeed стакан есть, и события с ним связанные приходят, хотя для регистрации стакана использовал "самодельный" объект Security:
var security = new Security
{
Code = "MSFT",
ExchangeBoard = new ExchangeBoard
{
Exchange = new Exchange()
},
};
т.е. полностью пустой объект, указан только тикер, и стакан по всем площадкам начинал обновляться.
Для регистрации получения данных в BlackWoodиспользовал методы:
_trader.SubscribeMarketData(security,MarketDataTypes.LastTrade);
_trader.SubscribeMarketData(security,MarketDataTypes.Trades);
_trader.SubscribeMarketData(security,MarketDataTypes.BestQuotes);
_trader.SubscribeMarketData(security,MarketDataTypes.Candles);
_trader.SubscribeMarketData(security,MarketDataTypes.Level1);
_trader.SubscribeMarketData(security,MarketDataTypes.MarketDepth);
_trader.SubscribeMarketData(security,MarketDataTypes.OrderLog);
<u>а так же аналогичные им _trader.Register...</u> Всё что я регистрирую и субскрайблю данными методами, невозможно потом отрегить или отсубскрайбить соответствующими методами _trader.UnRegister... или _trader.UnSubscribe... (UnSubscribeMarketData, UnSubscribeCandles), хотя применяю весь набор инструментов одного тикера, но всех возможных площадок, полученных с обеих коннекторов. Одним словом, поток данных в программу продолжается и всё время увеличивается с регистрацией на всё новые тикеры.
Заключение: не могу получить хоть какой-нибудь риалтайм минимум данных в программу для принятия торговых решений, прошу помощи.
Comentários (26)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
Вы, не пробовали получать инструмент через LookupSecurities(criteria)? Ждал минуты три так и не увидел результата поиска. Получилось подписаться через RegisterTrades(Security) на первый пришедший инструмент после подключения (Connected) и начала экспорта (StartExport()) обновления приходят через событие NewTrades (уже можно ваять ленту 😀 ). Сейчас пытаюсь разобраться как подписаться не на первый попавшийся а на любой заданный. Тут как я понял фишка вот в чем: разберем на примере тиков, есть метод RegisterTrades(Security) - он позволяет "зарегистрировать" инструмент в списке слежения, новый тик приходит через событие NewTrades, получаем IEnumerable<Trade> и далее чего хотим того с ним и делаем, НО для того, что бы "зарегистрировать" инструмент, не достаточно просто создать его через конструктор, его надо найти на сервере. А вот с поиском тут что-то не ладное (это можно наблюдать и в самом APITester'е, который с библиотеками идет, хотя Тестер от Fusion'а в плане поиска работает совсем шустро, я имею ввиду окно MarketMaker). Как возможное решение проблемы, нашел метод GetSecurity, только же он собака не позволяет себя использовать, говорит "inaccessible Я". Воюем дальше 🤨
LookupSecurities(criteria) - не работает в принципе, вот здесь - Новая версия 4.2.2.5 сказано что ошибка с поиском устранена, хотя о какой ошибке идёт речь, непонятно, оно просто ничего не ищет. Нормально работает только RegisterTrades, трейды исправно приходят, но когда пытаешся из этого пришедшего трейда вытащить объект Security и в нём уже посмотреть BestBid и BestAsk, то они оказываются нулевыми, и даже определить направление этого, пришедшего, трейда не удаётся, ведь определить это можно только сравнив цену трейда с текущими Bid и Ask. А по поводу самого инструмента, то я, как и писал выше, просто создаю объект Security:
и его использую для регистрации, работает в RegisterTrades и RegisterSecurity, события начинают приходить, при чём со всех доступных для текущего аккаунта Fusion биржевых площадок, только всё с нулевыми Security. А вот в RegisterMarketDepth что только я не применял, ничего не работает, стакана нет!
Для того, чтобы успешно регистрировать заявки на бирже, достаточно создать объект Security вот такого содержания:
Но очень важная проблема в свойстве ExchangeBoard.Code , там нужно указывать текстовое обозначение площадки, через которую нужно выставить заявку (NYSE, NASDAQ, BATS, EDGA, EDGX ...), на Америке их очень много, и только некоторые можно получить из событий NewSecurity и NewTrades, а кроме площадок ведь существует ещё огромное множество роутов (ASUROUX, NSDQSCAN, NSDQDDOT ...) и даркпулов (XFINDER, DARKPLUS, SMARTDARK ...), они уже просто по имени не выставляются, заявки не проходят с такими именами. Как быть? Что делать? Скорее всего нужны ещё методы типа GetExchangeBoards(), т.к. у разных брокеров они могут отличатся количеством.
Давайте по порядку. Что-то все намешано в кучу.
Поиска инструментов у Фьюжена нет. Сама система так сделана. У нас есть эвристика ввиде запроса level2 данных. Как только они начинают приходить, то приходит и информация по инструментам.
Тикер в понятии Фьюжена не совпадает с Security. Security - это тикер на конкретном ESN или MM. Чтобы получить агрегированную информацию со средней температурой по больнице нужно делать группировку по Security.Code.
Подскажите пожалуйста, почему Trade.OrderDirection = null? Ведь остальные данные приходят (Price, Volume, LowPrice и пр)? Где можно найти описание того, как устроена "система Фьюжена" (такая информация помогла бы сократить количество глупых вопросов на порядок)?
Обратитесь к вашему брокеру.
Теперь размышления. Если по одной акции надо иметь набор инструментов, которые должны отличаться только ExchangeBoard, при чём ExchangeBoardзаранее известны, почему бы не запрограммерить метод типа:
Security[] AmerSecurityGenerator(stringticker )
который возвратит массив инструментов с одинаковым .Code, но разными .ExchangeBoard и, если надо, .Id ? Может и не надо создавать базу инструментов??? Собсно, я так и делал, потом делал цикл с регистрацией трёх десятков инструментов на получение стакана (.RegisterMarketDepth). И ничего. Стакана так и не было, ни .NewMarketDepth, ни .MarketDepthChanged. Также и .SecuritiesChanged после соответствующей регистрации, приходил пустой, т.е. сам инструмент в событии был, ExchangeBoardв инструменте был заполнен, а все котировки были null.
<u>Вот и вопрос: "Что же всё-таки надо применять для регистрации"???</u>
И где взять то что надо применять, и почему его вообще надо где то брать, откуда сам Fusion их берёт? Так же очень хотелось бы понимать механизмы работы методов, да и вообще, описание к API просто "невероятно информативное и подробное", и с " простыми примерами", что не может не радовать :((((
А лучше всего, было бы сделать отдельный видеоурок по Америке, раз уж она так сильно отличается от всего остального. А то деньги за видеоуроки уплачены, а толку от них null. Возникает неприятное чувство "кидалова", извините.
Насканеннные ExchangeBoard :
два списка, первый получен из событий NewTrades после регистрации на 30 первых пришедших инструментов по NewSecurities, второй список из событий NewSecurities, звёздочкой помечены совпадающие
...и програмка:
Я с вами общался по скайпу, отвечал вам, а вы опять все те же самые вопросы задаете. Хорошо, отвечу еще раз, может быть так нагляднее будет и другие увидят ответы на свои вопросы.
Это делает Гидра. Программировать не нужно, нужно ее запустить.
Потому что Блэквуд гонит данные со всех площадок и ему достаточно лишь тикера.
Потому что одна и та же акция не торгуется на всех площадках.
Как я уже говорит вам в скайпе, DOM на америке отсутствует. DOM (MarketDepth) - это чисто российский механизм.
Смотреть нужно на Security BestBid/BestAsk. Котировки в них заполняться как только Блэквуд пришлет обновление.
Вызвать метод RegisterSecurity.
SampleBlackwood не хватает?
Окей, пусть он называется как хочет, мне главное нужно знать, я вот это получить могу или нет???
Пускай это не полный стакан, просто это демо-аккаунт, и в нём нет NYSE и NASDAQ, но это не важно, важен сам факт возможности или невозможности.
Да, я уже писал.
Это не стакан в том понимании, что используется в российских биржах. Это level2. Level2 - это лента из последних котировок. Другими словами, чтобы такое получить, нужно выводить строчку за строчкой при обновлении BestBid BestAsk.
Blackwood API (родной). Ну и ничего так, нормально работает (указать свой пароль/логин!!!)
Где взяли IP?
Всем привет. Теперь я убеждён на 100% что проблемы с коннектором BlackWood присутствуют. Их описывать надо очень долго, проще сказать что работает, чем что не работает. Главная проблема - инструменты. Закачка инструментов в локальную базу не рациональна, и даже по своей идее - невозможна. Вопросы с этим связанные:
Вторая проблема - получение данных BestBid и BestAsk. Какие и в каком количестве инструменты я бы не применял (хоть сгенеренные, хоть из базы Гидры), результат один и тот же, данных НЕТ! События SecuritiesChanged, а так же события, в объектах которых есть злосчастный Security приносят этот параметр с BestBid=BestAsk=null. Только изредка бывает проскочит не null, обычно только по одной какой-то площадке в конкретной акции.
Третья проблема - стакан, ну или, если угодно, L2. Событие MarketDepthsChanged не приходит никогда! По вашим путаным объяснениям якобы стакана на американских биржах нет, поэтому и события нет. Вы утверждали что сформировать его (стакан) можно только по ленте событий с Security.BestBid/BestAsk, но...
Четвёртая проблема - как отправлять заявки не через конкретные площадки, а через роуты и даркпулы. Инструменты с этими параметрами и скачать то нельзя, ведь они в терминал не приходят!
Жду чётких пояснений по каждому пункту. Если хотя бы один из пунктов не разрешится, то использование коннектора BlackwoodTrader можно считать невозможным, а тем более брать за это деньги.
[Михаил Сухов] Я удалил содержимое топика, так как это нарушает условие распространения софта. Публикуйте емейл, пускай туда пишут с вопросами. Но не нужно публиковать несанкционированные доступы к чужому ПО на нашем сайте. Хорошо? Иначе будет бан.🙄
tobin, спасибо, щаз поковыряюсь. А на счёт S#, я же за него <u>деньги заплатил</u>, а он не рабочий 😑 . Просто так бросить теперь не могу.
Простите что вмешиваюсь в ваш разговор. Но может мне хоть кто-нибудь сказать, что именно не работает? Пример с голым АПИ делает ровно то же самое, что и коннектор. Юзайте его, но решение первоначальных проблем не будет - ибо идет непонимание маркет данных америки, а не апи. Тут никакой АПИ не поможет.
Абсолютно никто из вас не отписался в теме http://stocksharp.com/forum/4354/Tiestirovaniie-novyi-fichiei/ Я так понимаю, бытует мнение, что разработчики должны бегать за пользователям. К сожалению (или к счастью) это не так. Есть проблемы - пишите. Не пишите - значит нет проблем. Вы используете бесплатный софт. Вы тестеры. Не мы.
И добавлю, что за коннектор деньги никто не платил.
Код с применением нативного API я ужи приводил чуть выше, вот, что он выдает
Вот код консольки с применением S#
Пришлось сделать запрос после задержки (взял с запасом), потому что LookupSecurities в событии Connected не подхватывался (это особенность внутренней реализации как я понимаю) и вот какой результат можно увидеть
Причем интересная особенность (о которой уже упоминалось) первых пару принтов BestAsk и BestBid присутствуют а потом обнуляются.
Скажите пожалуйста, где ошибка?
Ошибка в том, что вы не понимаете, что такое площадка. Для вас тикер и инструмент есть одно и то же. Александру я объяснил, так как он купил обучение. А вам не хочется. Если Александр захочет, он вам передаст мою информацию.
Всем привет. Mikhail Sukhov только-что продемонстрировал получение событий с <u>котировками</u>, котировки есть, не null, т.е. работает. Правда реализовано через событие NewMessage, пока не разобрался с работой именно с сообщениями, буду разбираться.
Забавно получается, мое непонимание не мешает получать данные через родной API, но затрудняет их получение через ваш API 😳 . Впрочем это не столь существенно, задача получения данных решена, остается только выяснить что такое площадка и в чем же разница между тикером и инструментом )). Александр, если вам не трудно, покажите скрин принта, у которого OrderDirection != null, что бы окончательно развеять все сомнения, по поводу и без него.
Покажите как вы получаете это через API и я скажу как это получить через S#.
В посте №11 приведен код (я думаю не стоит его сюда снова копировать). Пояснение к коду (по строкам):
16-23 - настройки подключения
25-34 - подключаемся
35 - ждем (если я правильно понимаю подключение происходит в асинхронном режиме и что бы продолжить работу программе необходимо дождаться ответа с сервера IsConnected)
37 - запрашиваем ссылку на инструмент (объект BWStock m_stock = new m_session.GetStock("TIKER") никакой информации не содержит)
39 - подписываемся на принты
40 - запрашиваем данные (запрос на сервер)
С обработчиком я думаю все понятно. Результат работы программы в посте №16 первый скрин. Пример с использованием S# в том же 16м посте (взят из вебинара "Connector Fusion (BlackWood)", переделан под прием принтов).
Все то же самое получается и через S#. Вы писали про направление тика. Не меняйте тему пожалуйста. Или извинитесь что наврали
Во первых, то же самое через S# не получается, внимательно посмотрите на пост №16 второй скрин (перед скрином образец кода, третий раз уже об этом пишу). Во вторых, тема все та же мы говорим о том, при схожих подходах к получению данных результат различен, а именно: через BWAPI приходит side = UP_TICK(DOWN_TICK), через S# приходит OrderDirection = null (и снова отправляю к скринам) И, наконец, в третьих, о каком вранье и извинении идет речь, по вашему мне наверное больше нечем заняться, кроме как устраивать на форуме провокации, если бы все работало так как это описано в справке, меня бы тут не было, допускаю, что я неверно понял описание применения вашего инструмента и поэтому решил обратиться за помощью, что бы выяснить кто и в каком месте не прав. Если мне стоит извиниться за просьбу о помощи, тогда конечно же извините.
И почему вы решили что это одно и то же?
StockSharp.chm
Это описание однозначно говорит о том, свойство должно указывать, была ли сделка совершена по биду, либо по аску. Свойство side указывает указывает на тот же признак.
Посмотрите внимательно апи. И что именно отвечает за признак восходящего и нисходящего тренда. И вообще почитайте про эти термины внимательнее. Тогда может быть вы поймете почему там null.