понедельник, 17 мая 2010 г.

SmartTrader vs SmartCOM

Решил продублировать (+ разукрасить код) сообщение на форуме SmartCOM, где я показал основные преимущества SmartTrader перед SmartCOM. Вот список преимуществ (естественно, убрал преимущества самого S#, иначе получилось бы больше!):

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

Разница в количестве кода уже сама за себя говорит, и готова дополнить список преимуществ. Хотя на самом деле, это всего лишь преимущество использования объектной модели.

5 комментариев:

  1. А они планируют SmartCOM улучшать?

    ОтветитьУдалить
  2. to 9
    Нет, оставят как есть. Сейчас занимаются новым терминалом.
    Если и будут что править, то только баги.

    ОтветитьУдалить
  3. Как обычно. Планов много, рук мало. Явный пример того, что покупное ПО обходится дешевле.

    ОтветитьУдалить
  4. будьте добры, поправьте ссылки в посте пожалуйста.
    а то все на localhost ведут.
    Со SmartCOM действительно что-то надо делать - стабильность на уровне альфы - больше времени уходит на написание всяких хитрых проверок и перезапуск сервиса чем на стратегию.
    Завтра постараюсь посмотреть Вашу библиотеку и напишу впечатления

    ОтветитьУдалить
  5. valenock,

    Спасибо за ссылки. Явный сигнал, что пользователей под СмартКОМ не так много - никто не полез по ссылкам!

    Думаю, стабильность выравняется, когда они откажутся от своей разработки SmartTrade. Освободившийся ресурс переправят на SmartCOM. Надеюсь, от него то они не будут отказываться, потому что это явно лишит их всех преимуществ перед другими брокерами.

    ОтветитьУдалить