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]
|