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


Всем привет, прошу сильно не пинать, только месяц как учу 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 тоже ничего не получается.
Спасибо.

Теги:


Спасибо:




3 Ответов
SlashHammer

Фотография
Курсы
Дата: 17.01.2014
Ответить


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

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 нет ни примеров, ни даже толкового описания большинства свойств и методов. Не очень то всё это смахивает на "для непрограммистов". Bored
Автор топика
Спасибо:

IvanB

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


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

SlashHammer

Фотография
Курсы
Дата: 18.01.2014
Ответить


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


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

loading
clippy