← Zurück

Урок 2. Не могу получить стакан (BlackWood/Fusion)

Всем привет, прошу сильно не пинать, только месяц как учу C# и неделю S#. Пытаюсь получить стакан как в уроке №2, но через коннектор BlackWood.


_timer = ThreadingHelper.Timer(()=>this.GuiAsync(() =>
{
    Quotes.Clear();
    MarketDepth marketDepth = ConnectorInterFace.SafeConnection.Trader.GetMarketDepth(selectedSecurity);
    Debug.WriteLine("СТАКАН "+marketDepth.Security.Code +" Котировок в стакане: "+marketDepth.Count);
    //Quotes.AddRange(marketDepth.Select(q=>new QuoteSample(q)));
}))
    .Interval(TimeSpan.FromSeconds(1));

Предварительно зарегистрировав и подписавшись:


ConnectorInterFace.SafeConnection.Trader.RegisterMarketDepth(ConnectorInterFace.SelectedSecurity);

ConnectorInterFace.SafeConnection.Trader.MarketDepthsChanged += (l2S) =>
{
    foreach (var l2 in l2S)
       Debug.WriteLine("Стакан: " + l2.Security.Code + " изменился!");
};
ConnectorInterFace.SafeConnection.Trader.NewMarketDepths += l2S =>  
{
    foreach (var l2 in l2S)
       Debug.WriteLine("Новый стакан по" + l2.Security.Code);
};

Но в полученом стакане заполнено только свойство Security, никаких котировок и объёмов нет. В дебаг ничего не пишется (кроме "СТАКАН SPY Котировок в стакане 0"). Подскажите, на что ещё надо подписатся, или зарегистрировать чтобы получить этот стакан? P.S. С раскомментированной строкой создания объекта QuoteSample и отправкой его в ЛистБокс через Quotes тоже ничего не получается. Спасибо.

War dieses Thema hilfreich?

Thema teilen

Kommentare (3)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

SlashHammer
SlashHammer Autor

Немного упрощу вопрос. Написал консольный вариант получения стакана. Что в коде не так, да и вопросы некоторые в комментариях нуждаются в ответах. Код:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using StockSharp.Blackwood;
using StockSharp.BusinessEntities;

namespace GetMarketDepth
{
    class Program
    {
        static void Main(string[] args)
        {
            //Объект BlackWood для подключения и работы
            var trader = new BlackwoodTrader()
            {
                Login = "**********",
                Password = "**********",
                ExecutionAddress = new IPEndPoint(BlackwoodAddresses.WetBush, BlackwoodAddresses.ExecutionPort),
                MarketDataAddress = new IPEndPoint(BlackwoodAddresses.WetBush, BlackwoodAddresses.MarketDataPort),
                HistoricalDataAddress = new IPEndPoint(BlackwoodAddresses.WetBush, BlackwoodAddresses.HistoricalDataPort)
            };
            //Коллекция стаканов
            var l2List = new List<MarketDepth>(); 

            //Старт экспорта, непонятно нужен ли, зачем нужен и что делает?
            //без StartExport всё равно NewSecurities срабатывает!!!
            trader.Connected += () =>
            {
                Console.WriteLine("Подключились!");
                try
                {
                    trader.StartExport();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Ошибка экспорта \n{0}",ex.Message);
                }
                
            };

            trader.ConnectionError += err => Console.WriteLine("Ошибка подключения \n{0}", err.Message);

            //Подписываюсь на получение новых инструментов, непонятно нужно ли, главное - зачем оно вообще???
            trader.NewSecurities += secursList =>
            {
                foreach (var security in secursList)
                    //Зарегистрировать стаканы для первых десяти тикеров пришедших с сервера
                    if (trader.RegisteredMarketDepths.Count() < 10)
                    {
                        //регистрация
                        trader.RegisterMarketDepth(security);
                        Console.WriteLine("Подписка на стакан, тикер: {0}", security.Code);
                        //заполняю коллекцию стаканов
                        l2List.Add(trader.GetMarketDepth(security));

                    }
            };

            //Пописываюсь на изменение зарегистрированных стаканов (10шт)
            trader.MarketDepthsChanged += MDeps =>
            {
                foreach (var mD in MDeps)
                {
                    Console.WriteLine("Стакан по {0} изменился в {1}. Латентность: {2}",
                        mD.Security.Code,mD.LastChangeTime.TimeOfDay.ToString(),mD.Latency.ToString());
                    //Ищу в коллекции стаканы с тем же тикером что и стакан, вызвавший это событие
                    //и перезаписываю найденые стаканы
                    for (var i = 0; i < l2List.Count; i++)
                        if (l2List[i].Security.Code == mD.Security.Code)
                            l2List.Insert(i, mD);
                }
            };

            //Событие MarketDepthsChanged не происходит никогда!!!

            trader.Connect();

            Console.ReadLine();

            //Когда надоест сидеть и ждать срабатывание события MarketDepthsChanged
            //жмём ENTER и смотрим что у нас в коллекции стаканов полученной
            //методом GetMarketDepth(security)

            foreach (var l2 in l2List)
            {
                Console.WriteLine("Стакан {0}, котир. в стакане: {1}, лучшая пара: {2}, время изм.: {3}",
                    l2.Security.Code,l2.Count,l2.BestPair,l2.LastChangeTime.TimeOfDay);
            }

            Console.ReadLine();
        }
    }
}

Ждал события MarketDepthsChanged минут двадцать: ...потом жмакнул ENTER и пронаблюдал пустые стаканы

Дополнительный вопрос(нигде об этом не сказано), какие поля у объекта Security должны быть заполнены, чтобы его можно было использовать, скажем, в методе RegisterTrades(<Security>), и каким методом потом получить остальные недостающие свойства этого объекта (Бид, Аск и т.д.)

Извините за может глупые вопросы, но в таком очень скудном описании API нет ни примеров, ни даже толкового описания большинства свойств и методов. Не очень то всё это смахивает на "для непрограммистов". 😑

IvanB
IvanB

SlashHammer, Думаю лучше провести консультацию, чтобы дать исчерпывающие ответы.

SlashHammer
SlashHammer Autor

Добрый день. Иван, уже подписался, помимо этого момента, есть ещё вопросы с реализацией через Блеквуд.