API 4.2.2.6 несколько вопросов. Blackwood/Fusion


API 4.2.2.6 несколько вопросов. Blackwood/Fusion
Atom
07.02.2014


Добрый день, в методе подписки на свечки
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);

а так же аналогичные им _trader.Register...
Всё что я регистрирую и субскрайблю данными методами, невозможно потом отрегить или отсубскрайбить
соответствующими методами _trader.UnRegister... или _trader.UnSubscribe... (UnSubscribeMarketData, UnSubscribeCandles),
хотя применяю весь набор инструментов одного тикера, но всех возможных площадок, полученных с обеих коннекторов.
Одним словом, поток данных в программу продолжается и всё время увеличивается с регистрацией на всё новые тикеры.

Заключение: не могу получить хоть какой-нибудь риалтайм минимум данных в программу для принятия торговых решений, прошу помощи.

Теги:


Спасибо:


< 1 2 3  >
SlashHammer

Фотография
Дата: 20.02.2014
Ответить


Всем привет. Теперь я убеждён на 100% что проблемы с коннектором BlackWood присутствуют. Их описывать надо очень долго, проще сказать что работает, чем что не работает.
Главная проблема - инструменты. Закачка инструментов в локальную базу не рациональна, и даже по своей идее - невозможна. Вопросы с этим связанные:

  • как проверить что в базе присутствуют все возможные инструменты?
  • как контролировать изменение инструментов, т.е. актуальность базы?
  • работа с такой базой очень негативно сказывается на производительности приложения

я закачивал Гидрой инструменты, как Вы и советовали. Три дня!!! В результате получил базу с ~76к объктов, причём уникальных по тикеру там ~7,5к штук. Т.е. по тикеру почти правильное к-во, но вот если на каждый тикер должно быть по, примерно, 35 площадок, то объектов в базе должно быть 7500 * 35 = 262.500. Как я сказал выше, это качалось три дня, при чём в первый день скачалось ~60к объктов, во второй 10к, в третий 6к, если так и дальше пойдёт, то к лету докачаю [blink]
Ввиду этого вижу только два выхода - либо как то всё же реализовывать LookupSecurities, либо генератор инструментов по тикеру, если честно, то в варианте генератора не вижу никаких проблем!!! Но повторюсь, проблем не вижу только потому, что абсолютно нет описания логики работы API, и принципа работы самой торговой системы. И самое главное в этом вопросе - если применять скачанные инструменты, или сгенерированные - результат ОДИН И ТОТ ЖЕ !!! Но об этом дальше.

Вторая проблема - получение данных BestBid и BestAsk. Какие и в каком количестве инструменты я бы не применял (хоть сгенеренные, хоть из базы Гидры), результат один и тот же, данных НЕТ! События SecuritiesChanged, а так же события, в объектах которых есть злосчастный Security приносят этот параметр с BestBid=BestAsk=null. Только изредка бывает проскочит не null, обычно только по одной какой-то площадке в конкретной акции.

Третья проблема - стакан, ну или, если угодно, L2. Событие MarketDepthsChanged не приходит никогда! По вашим путаным объяснениям якобы стакана на американских биржах нет, поэтому и события нет. Вы утверждали что сформировать его (стакан) можно только по ленте событий с Security.BestBid/BestAsk, но...

  • как говорил выше - BestBid=BestAsk=null в 95% событий
  • как по лучшим котировкам(BestBid/BestAsk) можно сформировать глубину???
  • как можно получить стакан в один момент, ведь в терминале тикер ввёл и в доли секунды получил полный стакан, а по BestBid/BestAsk он будет строится заметно дольше.

...и ещё, в IQFeed-коннекторе события MarketDepthsChanged приходят очень активненько, не знаю можно ли по ним построить стакан, но события есть, и не null-евые [blink]

Четвёртая проблема - как отправлять заявки не через конкретные площадки, а через роуты и даркпулы. Инструменты с этими параметрами и скачать то нельзя, ведь они в терминал не приходят!

Жду чётких пояснений по каждому пункту. Если хотя бы один из пунктов не разрешится, то использование коннектора BlackwoodTrader можно считать невозможным, а тем более брать за это деньги.
Спасибо:

tobin

Фотография
Дата: 21.02.2014
Ответить


[Михаил Сухов] Я удалил содержимое топика, так как это нарушает условие распространения софта. Публикуйте емейл, пускай туда пишут с вопросами. Но не нужно публиковать несанкционированные доступы к чужому ПО на нашем сайте. Хорошо? Иначе будет бан.[rolleyes]
Спасибо:

SlashHammer

Фотография
Дата: 21.02.2014
Ответить


tobin, спасибо, щаз поковыряюсь. А на счёт S#, я же за него деньги заплатил, а он не рабочий [bored] . Просто так бросить теперь не могу.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 21.02.2014
Ответить


SlashHammer Перейти
tobin, спасибо, щаз поковыряюсь. А на счёт S#, я же за него деньги заплатил, а он не рабочий [bored] . Просто так бросить теперь не могу.


Простите что вмешиваюсь в ваш разговор. Но может мне хоть кто-нибудь сказать, что именно не работает? Пример с голым АПИ делает ровно то же самое, что и коннектор. Юзайте его, но решение первоначальных проблем не будет - ибо идет непонимание маркет данных америки, а не апи. Тут никакой АПИ не поможет.

Абсолютно никто из вас не отписался в теме http://stocksharp.com/fo...rovaniie-novyi-fichiei/ Я так понимаю, бытует мнение, что разработчики должны бегать за пользователям. К сожалению (или к счастью) это не так. Есть проблемы - пишите. Не пишите - значит нет проблем. Вы используете бесплатный софт. Вы тестеры. Не мы.

И добавлю, что за коннектор деньги никто не платил.
Спасибо:

tobin

Фотография
Дата: 21.02.2014
Ответить


Цитата:
[Михаил Сухов] Я удалил содержимое топика, так как это нарушает условие распространения софта. Публикуйте емейл, пускай туда пишут с вопросами. Но не нужно публиковать несанкционированные доступы к чужому ПО на нашем сайте. Хорошо? Иначе будет бан.RollEyes

Согласен, не подумал.

Цитата:
Абсолютно никто из вас не отписался в теме http://stocksharp.com/fo...niie-novyi-fichiei.aspx Я так понимаю, бытует мнение, что разработчики должны бегать за пользователям. К сожалению (или к счастью) это не так. Есть проблемы - пишите. Не пишите - значит нет проблем. Вы используете бесплатный софт. Вы тестеры. Не мы.

Я чувствую в какую строну идет этот диалог и хочу кое-что разъяснить: я был бы рад если бы косяк был в моем непонимании "Америки" или в неумении правильно пользоваться вашими инструментами, НО обо всем по порядку.

Код с применением нативного API я ужи приводил чуть выше, вот, что он выдает


Вот код консольки с применением S#
Код
using System;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StockSharp.Blackwood;
using System.Net;
using StockSharp.BusinessEntities;
using Ecng.Serialization;


namespace blackwoodConosole
{
    class Program
    {
        static void Main(string[] args)
        {
            string login = "FUSDEMO33";
            string password = "d8eej4";

            BlackwoodTrader _trader;

            var ipAddr = BlackwoodAddresses.WetBush;
            _trader = new BlackwoodTrader()
                 {
                     Login = login,
                     Password = password,
                     ExecutionAddress = new IPEndPoint(ipAddr, BlackwoodAddresses.ExecutionPort),
                     MarketDataAddress = new IPEndPoint(ipAddr, BlackwoodAddresses.MarketDataPort),
                     HistoricalDataAddress = new IPEndPoint(ipAddr, BlackwoodAddresses.HistoricalDataPort),
                 };

            _trader.Connected += () =>
                {
                    _trader.StartExport();

                    Console.WriteLine("Connected!!!");


                };

            _trader.LookupSecuritiesResult += smas =>
                {
                    foreach (var sec in smas)
                    {
                        _trader.RegisterSecurity(sec);
                        _trader.RegisterTrades(sec);
                    }
                };

            _trader.NewTrades += _trader_NewTrades;

            _trader.Connect();

            Thread.Sleep(7000);

            var criteria = new Security { Code = "FB" };
            _trader.LookupSecurities(criteria);

            while (Console.Read() != 'e') { }
        }


        static void _trader_NewTrades(IEnumerable<Trade> obj)
        {
            
            Console.WriteLine("{0, -10} {1, -10} {2, -10}", obj.Last().Price, obj.Last().Security.Code, obj.Last().OrderDirection);
        }


    }
}


Пришлось сделать запрос после задержки (взял с запасом), потому что LookupSecurities в событии Connected не подхватывался (это особенность внутренней реализации как я понимаю)
и вот какой результат можно увидеть

Причем интересная особенность (о которой уже упоминалось) первых пару принтов BestAsk и BestBid присутствуют а потом обнуляются.

Скажите пожалуйста, где ошибка?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 21.02.2014
Ответить


tobin Перейти

Скажите пожалуйста, где ошибка?


Ошибка в том, что вы не понимаете, что такое площадка. Для вас тикер и инструмент есть одно и то же. Александру я объяснил, так как он купил обучение. А вам не хочется. Если Александр захочет, он вам передаст мою информацию.
Спасибо:

SlashHammer

Фотография
Дата: 21.02.2014
Ответить


Всем привет. Mikhail Sukhov только-что продемонстрировал получение событий с котировками, котировки есть, не null, т.е. работает. Правда реализовано через событие NewMessage, пока не разобрался с работой именно с сообщениями, буду разбираться.
Спасибо:

tobin

Фотография
Дата: 21.02.2014
Ответить


Забавно получается, мое непонимание не мешает получать данные через родной API, но затрудняет их получение через ваш API [blink] . Впрочем это не столь существенно, задача получения данных решена, остается только выяснить что такое площадка и в чем же разница между тикером и инструментом )). Александр, если вам не трудно, покажите скрин принта, у которого OrderDirection != null, что бы окончательно развеять все сомнения, по поводу и без него.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 22.02.2014
Ответить


tobin Перейти
покажите скрин принта, у которого OrderDirection != null, что бы окончательно развеять все сомнения, по поводу и без него.


Покажите как вы получаете это через API и я скажу как это получить через S#.
Спасибо:

tobin

Фотография
Дата: 25.02.2014
Ответить


В посте №11 приведен код (я думаю не стоит его сюда снова копировать). Пояснение к коду (по строкам):

16-23 - настройки подключения

25-34 - подключаемся

35 - ждем (если я правильно понимаю подключение происходит в асинхронном режиме и что бы продолжить работу программе необходимо дождаться ответа с сервера IsConnected)

37 - запрашиваем ссылку на инструмент (объект BWStock m_stock = new m_session.GetStock("TIKER") никакой информации не содержит)

39 - подписываемся на принты

40 - запрашиваем данные (запрос на сервер)

С обработчиком я думаю все понятно. Результат работы программы в посте №16 первый скрин. Пример с использованием S# в том же 16м посте (взят из вебинара "Connector Fusion (BlackWood)", переделан под прием принтов).
Спасибо:
< 1 2 3  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy