вобщем ошибок у меня больше не вылазиет. но вот программа не работает.. вся загвоздка с тем же..
добавил > private static MarketDepth _depth;
и> // подписываемся на событие обновления стакана
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);
}
}
}
}