Добрый день, в методе подписки на свечки 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), хотя применяю весь набор инструментов одного тикера, но всех возможных площадок, полученных с обеих коннекторов. Одним словом, поток данных в программу продолжается и всё время увеличивается с регистрацией на всё новые тикеры.
Заключение: не могу получить хоть какой-нибудь риалтайм минимум данных в программу для принятия торговых решений, прошу помощи.
Kommentare (26)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Вы, не пробовали получать инструмент через 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.