tmt
|
Date: 1/9/2012
насколько я понял из примера для смарт, то стакан мы вызываем вот так Quote:_lkoh = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future); затем мы берем лучшую пару котировок Quote:var firstMid = _lkoh.BestPair.SpreadPrice / 2; судя по всему чтобы показать общий объем бид.. надо как то вот так.. Quote:var firstMid = _lkoh.TotalBidsVolume; ведь надо же еще что то передавать (public decimal TotalBidsVolume { get; }) но вот мне пишет Ошибка 1 "StockSharp.BusinessEntities.Security" не содержит определения для "TotalBidsVolume" и не был найден метод расширения "TotalBidsVolume", принимающий тип "StockSharp.BusinessEntities.Security" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\user\Desktop\StockSharp_4.0.14\Samples\Smart\SampleSmartConsole\Program.cs 138 46 SampleSmartConsole подскажите пожалуйста
|
|
Thanks:
|
|
|
|
|
BigBen
|
Date: 1/9/2012
Для работы со стаканом в S# есть класс MarketDepth. У него есть свойства TotalBidsVolume (Получить общий объем по бидам) и TotalAsksVolume (Получить общий объем по офферам) - вот здесь и нужно копать.
|
|
Thanks:
|
|
|
|
|
tmt
|
Date: 1/9/2012
|
|
Thanks:
|
|
|
|
|
BigBen
|
Date: 1/9/2012
Примером, как я понимаю, является SampleSmartConsole. var firstMid = _lkoh.BestPair.SpreadPrice / 2; - здесь BestPair является свойством класса Security, экземпляр которого _lkoh имеет код = "LKOH". В данном примере класс MarketDepth не используется.
|
|
Thanks:
|
|
|
|
|
tmt
|
Date: 1/9/2012
а не мог бы подсказать пример где используется этот класс?
|
|
Thanks:
|
|
|
|
|
fau
|
Date: 1/9/2012
tmt а не мог бы подсказать пример где используется этот класс? поиск по форуму?
|
|
Thanks:
|
|
|
|
|
BigBen
|
Date: 1/9/2012
Для SmartCOM стакан используется в примере SampleSmart.
|
|
Thanks:
|
|
|
|
|
BigBen
|
Date: 1/9/2012
|
|
Thanks:
|
|
|
|
|
tmt
|
Date: 1/9/2012
|
|
|
|
вобщем ошибок у меня больше не вылазиет. но вот программа не работает.. вся загвоздка с тем же.. добавил Quote:private static MarketDepth _depth; и Quote: // подписываемся на событие обновления стакана trader.QuotesChanged += depths => { if (_depth == null && _instrument != null) { _depth = depths.FirstOrDefault(d => d.Security == _instrument);
if (_depth != null) { Console.WriteLine("Стакан появился.");
if (_portfolio != null) waitHandle.Set(); } } }; ну и программа не идет дальше, тк depth у меня равное null остается Quote:namespace SampleSmartConsole { using System; using System.Net; using System.Linq; using System.Threading;
using Ecng.Collections; using Ecng.Common;
using StockSharp.BusinessEntities; using StockSharp.Smart; using StockSharp.Algo;
class Program { private static Security _instrument; private static Portfolio _portfolio; private static MarketDepth _depth;
static void Main() { try { // для теста выбираем бумагу const string secCode = "RIH2";
//Console.Write("Введите логин: "); //var login = Console.ReadLine(); var login = "ST12858";
//Console.Write("Введите пароль: "); //var password = Console.ReadLine(); var password = "8YDJ7E";
//Console.Write("Введите номер счета, через который будет выставлена заявка: "); //var account = Console.ReadLine(); var account = "ST12858-RF-01";
IPAddress ipadress = IPAddress.Parse("95.131.26.246"); IPEndPoint ip = new IPEndPoint(ipadress, 8090); using (var waitHandle = new AutoResetEvent(false)) { // создаем шлюз к Smart-у using (var trader = new SmartTrader(login, password, ip)) { // подписываемся на событие успешного подключения // все действия необходимо производить только после подключения trader.Connected += () => { Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени waitHandle.Set(); };
Console.WriteLine("Производим подключение...");
trader.Connect();
// дожидаемся события об успешном соединении waitHandle.WaitOne();
// подписываемся на все портфели-счета trader.NewPortfolios += portfolios => { // необходимое условие работы в SmartCOM portfolios.ForEach(trader.RegisterPortfolio);
if (_portfolio == null) { _portfolio = portfolios.FirstOrDefault(p => p.Name == account);
if (_portfolio != null) { Console.WriteLine("Портфель {0} появился.", account);
if (_instrument != null && _depth != null) waitHandle.Set(); } } };
// подписываемся на событие появление инструментов trader.NewSecurities += securities => { if (_instrument == null) { // находим инструмент и присваиваем ее переменной _instrument _instrument = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);
if (_instrument != null) { Console.WriteLine("Инструмент появился.");
if (_portfolio != null && _depth != null) waitHandle.Set(); } } };
// подписываемся на событие обновления стакана trader.QuotesChanged += depths => { if (_depth == null && _instrument != null) { _depth = depths.FirstOrDefault(d => d.Security == _instrument);
if (_depth != null) { Console.WriteLine("Стакан появился.");
if (_portfolio != null) waitHandle.Set(); } } };
// подписываемся на событие появления моих новых сделок trader.NewMyTrades += myTrades => { foreach (var myTrade in myTrades) { var trade = myTrade.Trade; Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time); } };
Console.WriteLine("Дожидаемся появления в программе инструмента и портфеля {0}...".Put(account));
// запускаем экспорт по инструментам и портфелям trader.StartExport();
// дожидаемся появления портфеля и инструмента waitHandle.WaitOne();
trader.SecuritiesChanged += securities => { // если инструмент хоть раз изменился (по нему пришли актуальные данные) if (securities.Contains(_instrument)) waitHandle.Set(); };
Console.WriteLine("Дожидаемся обновления данных по инструменту...");
// запускаем обновление по инструменту trader.RegisterSecurity(_instrument); waitHandle.WaitOne();
// запоминаем первоначальное значение середины спреда var totb = _depth.TotalBidsVolume; var tota = _depth.TotalBidsVolume; if (_instrument.BestBid == null) throw new Exception("Нет лучшего бида для котировки.");
Console.WriteLine("общий объем bid", totb); Console.WriteLine("общий объем ask", tota);
while (true) { var mid = _instrument.BestPair.SpreadPrice / 2; // если спред вышел за пределы нашего диапазона if (totb > tota) { var order = new Order { Portfolio = _portfolio, Price = _instrument.ShrinkPrice(_instrument.BestAsk.Price), Security = _instrument, Volume = 1, Direction = OrderDirections.Sell, }; trader.RegisterOrder(order); Console.WriteLine("Заявка {0} зарегистрирована.", order.Id); break; } else { var order = new Order { Portfolio = _portfolio, Price = _instrument.ShrinkPrice(_instrument.BestBid.Price), Security = _instrument, Volume = 1, Direction = OrderDirections.Buy, }; trader.RegisterOrder(order); Console.WriteLine("Заявка {0} зарегистрирована.", order.Id); break; } //Console.WriteLine("Текущее значение середины спреда {0:0.##}", _instrument.BestBid.Price + mid); // ждем 60 секунду //Thread.Sleep(60000); }
// останавливаем экспорт trader.StopExport(); } } } catch (Exception ex) { Console.WriteLine(ex); } } } }
|
|
Thanks:
|
|
|
|
|
BigBen
|
Date: 1/9/2012
Ты подписался на событие обновления стакана, но не вижу, где запустил экспорт стакана. Можно сделать так:
... // подписываемся на событие появление инструментов trader.NewSecurities += securities => { if (_instrument == null) { // находим инструмент и присваиваем ее переменной _instrument _instrument = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);
if (_instrument != null) { Console.WriteLine("Инструмент появился.");
trader.RegisterQuotes(_instrument); // запускаем экспорт стакана
if (_portfolio != null && _depth != null) waitHandle.Set(); } } }; ...
|
|
|
|