- Умеет отписываться от событий сам.
- Отслеживает позицию. Тоесть, нет необходимости писать проверки на Short и Cover
- Не показал в примере, но оно есть. В событиях SmartTrader можно выполнять долгую работу (что приведет к зависанию SmartCOM, если прога начнет что-то вычислять около минуты в событиях типа AddSymbol, UpdatePosition)
- Выдает событие последовательно. Тоесть, нет такой чехарды как UpdateOrder вызвался раньше чем OrderFailed (хотя, тут все зависит от глюков SmartCOM. У меня же обертка).
- Cохраняет заявки между сессиями. Что устраняет ошибку, когда при перезапуске SmartCOM теряет эту информацию.
- Предоставляет объектную модель. Тоесть, получив событие об успешной регистрации заявки, не нужно где-то рыскать по cookie для того чтобы определить инструмент, а достаточно вызвать Order.Security.
- Тоже не показал в примере. SmartTrader предотвращает дублирование информацию. NewSecurities для каждого инструмента вызывается только один раз, даже если Start/StopExport вызывается многократно.
Собственно, код на SmartTrader:
using (var trader = new SmartTrader(login, password))
{
trader.NewPortfolios += portfolios => portfolios.ForEach(trader.RegisterPortfolio);
trader.SecuritiesChanged += securities =>
{
if (lkoh == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
lkoh = securities.FirstOrDefault(sec => sec.Code == "LKOH");
if (lkoh != null)
{
buyOrder = trader.RegisterOrder(new Order { Account = account, Price = lkoh.BestBid.Price, Security = lkoh, Volume = 1, Direction = OrderDirections.Buy });
sellOrder = trader.RegisterOrder(new Order { Account = account, Price = lkoh.BestAsk.Price, Security = lkoh, Volume = 1, Direction = OrderDirections.Sell });
}
}
};
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);
}
};
trader.Connected += trader.StartExport;
trader.Connect();
Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
Console.Read();
}
И аналогичный на SmartCOM:
private StServerClass server;
private int lkohPosition;
private string lkohSymbol;
private string portfolio;
private void OnAddSymbol(int row, int nrows, string symbol, string short_name, string long_name, string type, int decimals, int lot_size, double punkt, double step, string sec_ext_id, string sec_exch_name, DateTime expiry_date, double days_before_expiry)
{
if (short_name == "LKOH")
{
lkohSymbol = symbol;
server.ListenQuotes(symbol);
}
}
private void OnAddTrade(string portfolio, string symbol, string orderid, double price, double amount, DateTime datetime, string tradeno)
{
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}",
tradeno, price, symbol, amount, datetime);
}
private void OnUpdatePosition(string portfolio, string symbol, double avprice, double amount, double planned)
{
if (symbol == lkohSymbol)
lkohPosition = (int)amount;
}
private void OnUpdateQuote(string symbol, DateTime datetime, double open, double high, double low, double close, double last, double volume, double size, double bid, double ask, double bidsize, double asksize, double open_int, double go_buy, double go_sell, double go_base, double go_base_backed, double high_limit, double low_limit, int trading_status)
{
server.PlaceOrder(portfolio, lkohSymbol, lkohPosition >= 0 ? StOrder_Action.StOrder_Action_Buy : StOrder_Action.StOrder_Action_Cover, StOrder_Type.StOrder_Type_Limit, StOrder_Validity.StOrder_Validity_Day, bid, 1, 0, buyCookie);
server.PlaceOrder(portfolio, lkohSymbol, lkohPosition > 0 ? StOrder_Action.StOrder_Action_Sell : StOrder_Action.StOrder_Action_Short, StOrder_Type.StOrder_Type_Limit, StOrder_Validity.StOrder_Validity_Day, ask, 1, 0, sellCookie);
}
private void OnConnected()
{
server.GetSymbols();
server.GetPrortfolioList();
}
private List<string> _listenPortfolios;
private void OnAddPortfolio(int row, int nrows, string portfolioName, string portfolioExch)
{
server.ListenPortfolio(portfolioName);
_listenPortfolios.Add(portfolioName);
}
private void Test2()
{
server = new StServerClass();
try
{
server.AddSymbol += OnAddSymbol;
server.AddTrade += OnAddTrade;
server.AddPortfolio += OnAddPortfolio;
server.UpdateQuote += OnUpdateQuote;
server.UpdatePosition += OnUpdatePosition;
server.Connected += OnConnected;
server.connect("ip", login, password);
Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
Console.Read();
}
finally
{
foreach (var pf in _listenPortfolios)
server.CancelPortfolio(pf);
server.CancelQuotes(lkohSymbol);
server.disconnect();
server.AddPortfolio -= OnAddPortfolio;
server.UpdateQuote -= OnUpdateQuote;
server.AddSymbol -= OnAddSymbol;
server.AddTrade -= OnAddTrade;
server.UpdatePosition -= OnUpdatePosition;
server.Connected -= OnConnected;
Marshal.ReleaseComObject(server);
}
}
Разница в количестве кода уже сама за себя говорит, и готова дополнить список преимуществ. Хотя на самом деле, это всего лишь преимущество использования объектной модели.