| SlashHammer 
 
   
 
						
						
					 | Date: 1/17/2014 
						
							|  |  |  |   |  
 
 
	
			Немного упрощу вопрос. Написал консольный вариант получения стакана. Что в коде не так, да и вопросы некоторые в комментариях нуждаются в ответах. Код: Code
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] 
			
			
			
			
		
 |