- Умеет отписываться от событий сам.
- Отслеживает позицию. Тоесть, нет необходимости писать проверки на Short и Cover
- Не показал в примере, но оно есть. В событиях SmartTrader можно выполнять долгую работу (что приведет к зависанию SmartCOM, если прога начнет что-то вычислять около минуты в событиях типа AddSymbol, UpdatePosition)
- Выдает событие последовательно. Тоесть, нет такой чехарды как UpdateOrder вызвался раньше чем OrderFailed (хотя, тут все зависит от глюков SmartCOM. У меня же обертка).
- Cохраняет заявки между сессиями. Что устраняет ошибку, когда при перезапуске SmartCOM теряет эту информацию.
- Предоставляет объектную модель. Тоесть, получив событие об успешной регистрации заявки, не нужно где-то рыскать по cookie для того чтобы определить инструмент, а достаточно вызвать Order.Security.
- Тоже не показал в примере. SmartTrader предотвращает дублирование информацию. NewSecurities для каждого инструмента вызывается только один раз, даже если Start/StopExport вызывается многократно.
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_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); } }
Разница в количестве кода уже сама за себя говорит, и готова дополнить список преимуществ. Хотя на самом деле, это всего лишь преимущество использования объектной модели.