Перейти к содержимому


Фото

Smarttrader (s#)


  • Please log in to reply
51 ответов в этой теме

#1 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 12 May 2010 - 10:50 AM

Добавил в S# поддержку SmartCOM. Называется SmartTrader - http://stockmarketdo...5/stock-20.html . Что такое S# писать не буду здесь - не хочу делать рекламу. А вот хочу критики по поводу сделанного. Сам сделал на Смарте только одно боевое приложение - поэтому досконально не тестировал и не использовал.

Вкратце, что есть SmartTrader:

1. Удобная и высокоуровневая обертка над SmartCOM для тех, кто прогает на .NET (C# VB).
2. Автоматическая отписка от событий.
3. Постарался устранить и спрятать все недочеты SmartCOM собственной реализацией. Получилось не все - отписал в доке, что именно.
4. Ну и плюс S# уже содержит некоторые торговые алго, которые можно теперь использовать и для Смарта.

#2 Craft

Craft

    Новичок

  • Трейдеры
  • Pip
  • 85 сообщений

Отправлено 13 May 2010 - 10:03 AM

racot, добрый день!
Можно попросить адаптировать пример из StockSharp_2.0 пересечения SMA под SmartCOM?

Возможно Вашу ветку для большего числа потенциальных пользователей лучше продублировать/перенести в раздел: МТС и торговые роботы.

#3 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 13 May 2010 - 12:37 PM

Цитата(Craft @ 13.5.2010, 11:03) <{POST_SNAPBACK}>
racot, добрый день!
Можно попросить адаптировать пример из StockSharp_2.0 пересечения SMA под SmartCOM?

Возможно Вашу ветку для большего числа потенциальных пользователей лучше продублировать/перенести в раздел: МТС и торговые роботы.


1. У меня не готовый робот. Это примеры, демонстрирующие как работать. Если Вам нужно это алго, пишите, я расскажу, что на что менять, чтобы максимально использовать Смарт. Например, уже к Финаму обращатся не нужно за историей. Но у самого пока нет времени.

2. Пока не особо сильно понимаю разницу в этих форумах. В МТС обсуждают СмартКОМ?

#4 Craft

Craft

    Новичок

  • Трейдеры
  • Pip
  • 85 сообщений

Отправлено 13 May 2010 - 12:43 PM

1. Да, интересен пример под СмартСОМ, демонстрирующий работу (а здесь ещё и визуальное оформление) от начала (получения котировок) до конца (выставления ордера).
2. Предложение было сделано из лучших побуждений. В названной ветке активно обсуждалась робототорговля и часто появляются анонсы программ помогающих в этом. Хотя, Ваш продукт нацелен на людей с уровнем умения программировать выше начального и возможно Вы правы.

#5 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 13 May 2010 - 01:08 PM

Есть такой пример. Их даже два. SampleSmart - визуальный. SampleConsole - простой пример робота.

Насчет умения программировать. Никуда не деться. Аналитические проги (Велс, Квант, РайтЭйдж) предлагают свой функционал только для тех, кто умеет прогать под .NET. Собственно, и раньше так было. А для пользователей СмартКОМ это вообще не проблема.

#6 Kardinal_m

Kardinal_m

    Новичок

  • Трейдеры
  • Pip
  • 1 сообщений

Отправлено 17 May 2010 - 11:16 AM

Добрый день всем! Вот здесь я буквально на днях задавал вопрос о преимуществах SmartCom http://www.itinvest....showtopic=63152 на что получил достаточно подробный ответ от Андрея. В свет появившегося по предложению Racot еще одного варианта. Хотелось бы узнать от Андрея и от Racot о преимуществах S# уже перед SmartCom в чистом виде. Если я правильно понимаю при работе с S# все те возможности, что описал Андрей остаются, но в то же время появляются какие-то преимущества?

#7 Андрей Осташов

Андрей Осташов

    Активный участник

  • Трейдеры
  • PipPipPip
  • 935 сообщений

Отправлено 17 May 2010 - 02:54 PM

Я вижу ситуацию следующим образом.
SmartCOM по своей природе достаточно низкоуровневый. Т.е. требует глубоких знаний программирования.
Racot в своем продукте делает SmartCOM более понятным конечному пользователю.
Т.е. для использования S# можно быть "меньше программистом", чем для SmartCOM.
Отсюда вывод - если Вы только начинаете разработку своей МТС, целесообразно использовать #S.
В последующем, если возникнет потребность в реализации специфических вещей, возможно придется перейти на "чистый" SmartCOM.

Подчеркну, что сам я S# не тестировал. С продуктом знакомился описательно.
Но по-моему, идея в нем заложена именно такая.




#8 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 17 May 2010 - 04:30 PM

Примеру в начале два куска кода. Первый - SmartTrader. Второй - голый SmartCOM. Пример - получить бумагу Лукойл и выставить 2 заявки по краю спреда.

Вот как выглядит такой пример на S#:

Код
using (var trader = new SmartTrader(login, password))
{
    trader.NewPortfolios += portfolios => portfolios.ForEach(trader.ListenPortfolio);

    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 void OnAddSymbo(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 = position;
}

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.Buy : StOrder_Action.Cover, StOrder_Type.Limit, StOrder_Validity.Day, bid, 1, 0, buyCookie);

    server.PlaceOrder(portfolio, lkohSymbol, lkohPosition > 0 ? StOrder_Action.Sell : StOrder_Action.Short, StOrder_Type.Limit, StOrder_Validity.Day, ask, 1, 0, sellCookie);
}

private void OnConnected()
{
    server.GetSymbol();
    server.GetPortfolioList();
    server.PlaceOrder();
}

private List<Portfolio> _listenPortfolios;

private void OnAddPortfolio(int row, int nrows, string portfolioName, string portfolioExch)
{
    server.ListenPortfolio(portfolioName);
    _listenPortfolios.Add(portfolioName);
}

var 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 _listenPortolios)
        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);
}


#9 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 17 May 2010 - 04:46 PM

Комментарий к коду (aka преимущества перез SmartCOM). SmartTrader:

1. умеет отписываться от событий сам.
2. отслеживает позицию. Тоесть, нет необходимости писать проверки на Short и Cover
3. не показал в примере. В событиях SmartTrader можно выполнять долгую работу (что приведет к зависанию SmartCOM, если прога начнет что-то вычислять около минуты в событиях типа AddSymbol, UpdatePosition)
4. выдает событие последовательно. Тоесть, нет такой чехарды как UpdateOrder вызвался раньше чем OrderFailed (хотя, тут все зависит от глюков SmartCOM laugh.gif . У меня же обертка).
5. сохраняет заявки между сессиями. Что устраняет ошибку, когда при перезапуске SmartCOM теряет эту информацию.
6. предоставляет объектную модель. Тоесть, получив событие об успешной регистрации заявки не нужно где-то рыскать по cookie для того чтобы определить инструмент, а достаточно вызвать Order.Security.
7. тоже не показал в примере. SmartTrader предотвращает дублирование информацию. NewSecurities для каждого инструмента вызывается только один раз, даже если Start/StopExport вызывается многократно.

Андрей Осташов,

Цитата
Отсюда вывод - если Вы только начинаете разработку своей МТС, целесообразно использовать #S.
В последующем, если возникнет потребность в реализации специфических вещей, возможно придется перейти на "чистый" SmartCOM.


Правильно, только все наоборот. Как однажды в форуме правильно ответил пользователь SmartCOM, ДДЕ - это устаревшее, а COM новее. Фактически, все правильно. Но COM для .NET такая же древняя технология, а следовательно и сам SmartCOM. SmartTrader, как обертка, естесственно, этого в корне не устраняет, но делает жизнь, скажем, приятнее и красочнее.

Ну и плюс, если завтра время будет, покажу как тот же самый пример, исправив буквально пару строчек кода, заставить работать с Quik. Так сказать, робот под Квик - хорошо. Робот под Смарт - лучше. А вот Квик и Смарт - просто замечательно. cool.gif

#10 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 17 May 2010 - 09:12 PM

Продублировал, исправив некоторые ошибки в примерах - http://stockmarketdo...s-smartcom.html. Плюс, код разукрасил, чего здесь, к сожалению, нельзя сделать. Сложновато без раскраски читать.

#11 Craft

Craft

    Новичок

  • Трейдеры
  • Pip
  • 85 сообщений

Отправлено 17 May 2010 - 09:37 PM

Цитата(racot @ 17.5.2010, 22:12) <{POST_SNAPBACK}>
Продублировал, исправив некоторые ошибки в примерах - http://stockmarketdo...s-smartcom.html. Плюс, код разукрасил, чего здесь, к сожалению, нельзя сделать. Сложновато без раскраски читать.

Михаил, не терзайте душу (пытающихся оторваться от начального уровня C#/S#), найдите время создать пример для SmartTrader простенькой стратегии (хоть пересечение SMA, с получением котировок по инструменту и выставлением позиции), но не в консоли, а с простейшим интерфейсом и отображением графика.

#12 noober

noober

    Новичок

  • Трейдеры
  • Pip
  • 17 сообщений

Отправлено 19 May 2010 - 11:23 AM

Цитата(Craft @ 17.5.2010, 21:37) <{POST_SNAPBACK}>
Михаил, не терзайте душу (пытающихся оторваться от начального уровня C#/S#), найдите время создать пример для SmartTrader простенькой стратегии (хоть пересечение SMA, с получением котировок по инструменту и выставлением позиции), но не в консоли, а с простейшим интерфейсом и отображением графика.

Присоединяюсь.

#13 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 19 May 2010 - 12:07 PM

Постараюсь к релизу 2.0 переделать пример под Квик на Смарт.

#14 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 08 June 2010 - 02:59 PM

Цитата(racot @ 19.5.2010, 13:07) <{POST_SNAPBACK}>
Постараюсь к релизу 2.0 переделать пример под Квик на Смарт.


Выпустил новую версию - http://stockmarketdo.../stock-201.html По Смарту мало, но зато показал как делать независимый от торгового терминала робот - http://stocksharp.co...53c71d1e628.htm Как раз скользящие средние.

#15 Craft

Craft

    Новичок

  • Трейдеры
  • Pip
  • 85 сообщений

Отправлено 09 June 2010 - 01:31 AM

racot, спасибо за пример.

#16 alexm028

alexm028

    Новичок

  • Трейдеры
  • Pip
  • 0 сообщений

Отправлено 29 June 2010 - 11:17 AM

Вопрос разработчику.
Сделал все по аналогии с SampleSmart не могу понять как получать сделки по инструментам. Событие NewTrades не вызывается. SmartTrader.Trades пустое.

#17 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 29 June 2010 - 01:43 PM

Цитата(Alexwerf @ 29.6.2010, 12:17) <{POST_SNAPBACK}>
Вопрос разработчику.
Сделал все по аналогии с SampleSmart не могу понять как получать сделки по инструментам. Событие NewTrades не вызывается. SmartTrader.Trades пустое.


Думаю все дело в том, что нужно вызывать RegisterTrades:

Код
smartTrader.RegisterTrades(mySecurity);


#18 Alexwerf

Alexwerf

    Новичок

  • Трейдеры
  • Pip
  • 10 сообщений

Отправлено 05 July 2010 - 11:19 AM

Спасибо, вроде все получилось.
Подскажите тогда еще, а можно получать волатильность опционного контракта?
Кстати про волатильности в терминале отображаются какие-то сумасшедшие значения (100 с лишним процентов), некоторые опционные контракты в доске опционов не отображаются вообще (доска пустая)
Хотя в личном кабинете все нормально.

#19 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 05 July 2010 - 01:07 PM

Спасибо, вроде все получилось.
Подскажите тогда еще, а можно получать волатильность опционного контракта?


СмартКОМ пока не предназначен для написание программ, работающих с деривативами - нет инфы необходимой. Торговать можно, анализировать не получится (тоесть, в слепую). Как вариант обхода, работать в паре с Квик - http://stocksharp.co...0e0f881479d.htm Тоесть брать инфу из QuikTrader, а сделки делать через SmartTrader.

Кстати про волатильности в терминале отображаются какие-то сумасшедшие значения (100 с лишним процентов), некоторые опционные контракты в доске опционов не отображаются вообще (доска пустая)


А вот это интересный вопрос. Ждем ответа от оф поддержки. У меня так SmartTrade вообще не запускается. :lol:

#20 racot

racot

    Знаток Stock#

  • Вольные разработчики
  • PipPip
  • 151 сообщений

Отправлено 06 July 2010 - 12:14 PM

Выпустил новую версию Stock# 2.1. Для Смарта (тоесть, SmartTrader) добавил возможность работы котирования (до этого был доступен только QuikTrader). Фактически то, что есть в Квике под названием алго заявки теперь доступно и через SmartCOM. B)




Rambler's Top100 Яндекс.Метрика