Ivan
Ivan личный блог
27 ноября 2018, 18:05

Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Здравствуйте, я алготрейдер и очень давно использую продукты StockSharp в реальной торговле. В последнее время я перевёл всех своих роботов на обновленный S#.Shell. И в данной статье я покажу как с помощью S#.API самостоятельно создать полноценное приложения уровня S#.Shell
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Я не буду использовать сложные конструкции и паттерны проектирования, понятные только профессиональным программистам. Наоборот, цель статьи показать, что порог вхождения в создание своих приложений торговли с помощью S#.API очень низкий.
Если вы работаете в компании, и делаете свой уникальный софт (например, вы работает в проп или брокерской компании), вам так же будет интересно. В этой статье вы сможете узнать практику создания подобных систем (особенно, если вы только приступили к своим обязанностям).

Что понадобиться

1) Visual Studio 2017 (Community, бесплатная версия), в ней мы будем программировать.
2) Бесплатное подключение к тестовым торгам на бирже, я буду использовать QUIK.

Создание проекта

Создадим новое WPF приложение в Visual Studio
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
После чего необходимо добавить S#.API библиотеки в как это сделать описано здесь . Я предпочитаю установку при помощи Nuget.
Так как все графические элементы S#.API созданы на базе DevExpress, а библиотеки DevExpress идут вместе с S#.API, глупо будет ими не воспользоваться. Всю информацию по графическим элементам DevExpress можно найти в Google.
Перейдем в редактор окна MainWindow.xaml
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Заменим Window на DXWindow, это нам понадобиться для использования разных цветовых схем
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Visual Studio нам сама предложит вставить необходимые библиотеки.
Разобьем окно на три части в верху будет полоса с кнопками настройки подключений и подключения. В низу окно с логами. В середине все остальные панели. Проще всего так разбить окно с помощью LayoutControl от DevExpress.
В получившиеся три части мы и будем добавлять необходимые нам элементы.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Настройка подключения к коннектору

Добавим две кнопки, одна кнопка настройки подключения, а вторая кнопка подключения. Для этого воспользуемся кнопкой SimpleButton от DevExpress. Кнопки будут расположены в верхней части приложения. В каждую кнопку поместим картинку привычные по S#.Designer, S#.Data или S#.Terminal.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В верхнем правом углу экранной экранной формы увидим такую картину
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Двойным нажатием на каждую кнопку создадим обработчики событий нажатия на кнопку.
В коде MainWindow необходимо объявить коннектор, а также место и имя файла в котором будут храниться настройки коннектора.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события нажатия на кнопку настроек коннектора будем открывать окно конфигурации коннектора и сохранять его в файл.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе будем проверять есть ли каталог и файл с настройками коннектора и если он есть будем его загружать в коннектор
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Большинство объектов S#.API имеют методы Save и Load, с помощью которых можно сохранить и загрузить этот объект из XML файла.
В методе обработчике нажатия на кнопку подключения подключаем коннектор.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Теперь можно запустить программу и проверить ее.

Установка темной темы

Я предпочитаю темную тему. Поэтому сразу делаем чтобы тема программы была темной. Для этого в файле App.xaml
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Заменяем Application на charting:ExtendedBaseApplication Visual Studio нам сама предложит вставить необходимые библиотеки. А в файле App.xaml.cs удалить «: Application». Получиться код следующего вида
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе MainWindow пишем ApplicationThemeHelper.ApplicationThemeName = Theme.VS2017DarkName;
Полный код на текущий момент:
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки темной темы.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Создание панели инструментов

Добавим папку, где мы будем хранить все созданные нами контроллы и назовем ее XAML.
Добавим в нее свой первый UserControll, дадим ему имя SecurityGridControl.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В него добавляем один элемент SecurityPicker. В котором будут отображаться имеющиеся инструменты. По аналогии с главным окном будем использовать LayoutControl от DevExpress.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Перейдем в конструктор главного окна и изменим центральную часть в вид закладок. В одной из закладок расположим созданный нами контролл с SecurityPicker
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Теперь, когда у нас есть панель инструментов надо задать ей источник данных, в нашем случае это коннектор. Можно было просто в конструкторе MainWindow написать
SecurityPanel.SecPicker.SecurityProvider = Connector;
Но не стоит засорять код MainWindow кодом, который к нему не относится. Поэтому я создам статическую переменную Instance а в конструкторе MainWindow присвою ему значение MainWindow.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Теперь в любом месте нашей программы мы можем обращаться к свойствам MainWindow через код MainWindow.Instance.XXX.
В конструкторе SecurityGridControl таким образом указываем Connector как источник данных
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запустим для проверки.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Добавление логирования

Работу программы, коннектора или робота необходимо контролировать. Для этого в S#.API есть специальный класс LogManager. Данный класс принимает сообщения от источников и передает их в слушатели. В нашем случае источниками будут Connector, стратегии и т.д., а слушателем будет файл и панель логов.
В коде MainWindow объявляем объект LogManager и место, где он будет храниться
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе MainWindow создаем LogManager, задаем ему источник Connector и задаем слушателя файл
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
По аналогии с панелью инструментов создадим, панель логов в папку XAML добавляем еще один UserControl. Дадим ему имя MonitorControl. В него добавим элемент Monitor.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе MonitorControl зададим в LogManager еще и Monitor как слушателя
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В нижнюю часть MainWindow добавляем созданный MonitorControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Создание панели портфелей

По аналогии с панелью инструментов создадим, панель логов в папку XAML добавляем еще один UserControl. Дадим ему имя PortfolioGridControl. В него добавим элемент PortfolioGrid.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе PortfolioGridControl нам надо подписаться на события появления нового портфеля и событие появления новой позиции у Connector.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Таким образом при появлении нового портфеля он появиться на панели портфелей портфель, а при появлении новой позиции на панели портфелей портфель обновит позицию.
В центральную части MainWindow добавляем созданную панель PortfolioGridControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
У нас появилась вкладка с портфелями.

Создание панели ордеров

Панель ордеров в S#.API имеет возможность выставления заявок, снятия заявок и перерегистрации.
По аналогии с панелью инструментов создадим панель ордеров, в папку XAML добавляем еще один UserControl. Дадим ему имя OrderGridControl. В него добавим элемент OrderGrid.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
OrderGrid имеет событие регистрации заявки OrderRegistering, событие перерегистрации заявки OrderReRegistering и событие отмены заявки OrderCanceling.
Создадим их обработчики
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события регистрации заявки мы создаем окно OrderWindow, в котором необходимо указать источники данных для инструментов, портфелей, и рыночных данных. В нашем случае это все будет Connector.
После чего мы вызываем OrderWindow методом ShowModal если в этом окне было нажата кнопка ОК то мы через коннектор методом RegisterOrder регистрируем заявку.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события перерегистрации заявки мы все делаем тоже самое. Только в этом случае в событие нам приходит объект Order это заявка, которую надо перерегистрировать. Поэтому в OrderWindow мы указываем Order = order.ReRegisterClone(newVolume: order.Balance), чтобы заполнить поля окна OrderWindow.
После чего мы вызываем OrderWindow методом ShowModal если в этом окне было нажата кнопка ОК то мы через коннектор методом ReRegisterClone перерегистрируем заявку. В него мы передаем старую заявку, которую надо отменить и новую которую надо выставить.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события отмены заявки достаточно вызвать метод CancelOrder и передать в него ордер, который необходимо отменить.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Чтобы Ордера отображались в OrderGrid необходимо в конструкторе OrderGridControl подписаться на события появления нового ордера и на событие ошибки регистрации и передавать эти события в OrderGrid.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В центральную части MainWindow добавляем созданную панель OrderGridControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Создание панели собственных сделок

По аналогии с панелью инструментов создадим панель собственных сделок, в папку XAML добавляем еще один UserControl. Дадим ему имя MyTradeGridControl. В него добавим элемент MyTradeGrid.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе MyTradeGridControl нам надо подписаться на события появления новой собственной сделки и передать ее в MyTradeGrid.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В центральную части MainWindow добавляем созданную панель OrderGridControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Создание панели стаканов

По аналогии с предыдущими панелями создадим панель стаканов, в папку XAML добавляем еще один UserControl. Дадим ему имя MarketDepthControl.
В MainWindow мы уже использовали LayoutControl, в этом контроле тоже воспользуемся LayoutControl. Разобьем панель на две части по горизонтали
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В левую часть добавим SecurityPicker с ним мы встречались, когда создавали панель инструментов.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Правую часть разобьем на части по вертикали. Сверху правой части будет стакан
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
У MarketDepthControl необходимо задать какое-нибудь значение MaxHeight иначе приложение не будет запускаться.
Под стаканом расположим элементы задания портфеля, цены, и объёма заявки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь стоит отметить свойство Label у LayoutItem, оно позволяет заладь текст перед элементом. А также элемент SpinEdit от DevExpress в котором удобно задавать численные значения. Выглядят эти элементы следующим образом.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Еще ниже расположим кнопки купить, продать.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Полный код
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе MarketDepthControl зададим источник инструментов для SecurityPicker и источник портфелей для PortfolioComboBox, в нашем случае это будет Connector.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Создадим обработчик события выделения инструмента в SecurityPicker. В нем проверяем не равен ли нулю полученный инструмент. Если он не равен нулю сохраняем полученный инструмент в локальную переменную, нам он пригодиться при обновлении стакана. После чего очищаем регистрируем полученный инструмент в Connector на получение стакана с помощью метода RegisterMarketDepth. С помощь метода GetMarketDepth получаем текущий стакана по инструменту, чтобы им обновить MarketDepthControl.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Чтобы стакан постоянно обновлялся в конструкторе MarketDepthControl подпишемся на событие изменения стакана MarketDepthChanged у коннектора. В обработчике этого события будем проверять какому инструменту принадлежит полученный стакан, и если он принадлежит выделенному инструменту в SecurityPicker то обновляем им MarketDepthControl.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В центральную части MainWindow добавляем созданную панель MarketDepthControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
На данном этапе можно запустить программу и проверить работу обновления стаканов.
Создадим обработчика события нажатия на кнопки купить и продать. В каждом обработчике создаем Order, в нем указываем инструмент выбранный в SecurityPicker, портфель выбранный в PortfolioComboBox, объём и цену из соответствующих SpinEdit. Регистрируем заявку в Connector с помощью метода RegisterOrder.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Оба обработчика отличаются только направлением заявки.
Сделаем чтобы при выделении котировки в стакане значение SpinEditPrice менялось на цену выделенной котировки. Для этого создадим обработчик события SelectionChanged у MarketDepthControl. В котором будем обновлять значение SpinEditPrice ценой выделенной котировки если выделенная котировка не равна нулю.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запускаем для проверки
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Сохранение маркет-данных

Для сохранения портфелей, инструментов, площадок нам необходим класс CsvEntityRegistry. В него надо переделать место хранения сущностей и вызвать метод Init, для их загрузки.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Для сохранения свечей, сделок и т.д. нам понадобиться StorageRegistry
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Также нам понадобиться реестр хранилищ-снэпшотов SnapshotRegistry
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Все это мы передаем в Connector при его создании
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь я также указал что Connector будет переподключаться при разрыве подключения, а также указал сколько дней истории необходимо загружать.
Строка Connector.LookupAll(); запрашивает имеющиеся данные.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
После загрузки приложения перейдя в папку Data мы увидим, что появились новые папки.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
А при повторном подключении панели инструментов и портфелей уже будут заполнены.

Создание панели со стратегией

Панель стратегий я буду создавать также, как и все предыдущие панели.
В папку XAML добавляем еще один UserControl. Дадим ему имя StrategyControl. С помощь LayoutControl разобьём экранную форму на две части.
В левой части будут вкладка с свечным графиком
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
А также вкладка статистикой стратегии,
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь я использую StatisticParameterGrid для отображения статистики стратегии, а также EquityCurveChart для отображения графика прибыли и убытка.
У StatisticParameterGrid необходимо задать какое-нибудь значение MaxHeight иначе приложение не будет запускаться.
В правой части будет проводиться настройка свойств стратегии в PropertyGridEx
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
А также кнопки запуска и остановки стратегии.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Полный код
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В конструкторе StrategyControl задаем Connector как источники данных для PropertyGridEx, почти в каждом контроле мы выполняли подобные действия.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Нам необходимо как-то передать стратегию в наш контрол. Для этого в StrategyControl создам метод BindStraregy в который будет принимать стратегию, сохранять ссылку на нее в локальной переменной, а также задавать стратегию в PropertyGridEx и StatisticParameterGrid.
С помощь метода SetChart в стратегию предаём график свечей Chart, после этого в стратегии Chart можно будет получить с помощью метода GetChart. Также задаем Connector для стратегии.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
При работе с графиком прибыли и убытков надо учесть, что стратегия будем запускать и останавливать и возможно несколько раз, поэму с каждым запуском стратегии график надо очищать. Для это создадим метод ResetEquityCurveChart в котором будем сначала очищать EquityCurveChart. После чего нам необходимо создать графические элементы для EquityCurveChart, им можно указать имя, цвет и тип линии.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
После чего подпишемся на событие изменения PnL у стратегии и в обработчике этого события отрисовываем новое значение на графике прибыли убытков EquityCurveChart.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Полный код метода
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события нажатия на кнопку Старт будем вызвать этот метод. А также будем сбрасывать состояние стратегии и запускать ее.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В обработчике события нажатия на кнопку Стоп будем останавливать стратегию.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В центральную части MainWindow добавляем созданную панель StrategyControl
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Создание стратегии

Для примера рассмотрим создание простой стратегии со свечами. Которая будет покупать если свеча растущая (зеленая) и продавать если свеча убывающая (красная).
Создадим еще одну папку в проекте в ней будем хранить все наши стратегии. В этой папке создаем новый класс и назовем его SimpleStrategy. Все стратегии S# должны наследоваться от базового класса стратегии Strategy.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Так как наша стратегия использует свечи то создадим публичное свойство CandleSeries а в конструкторе нашей стратегии зададим ему значение по умолчанию.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь я указал что свечи в CandleSeries будут TimeFrameCandle, с интервалом 15 секунд (TimeSpan.FromSeconds(15)). Для CandleSeries можно указать режим создания свечей BuildCandlesMode. Я указал что свечи будут построены (MarketDataBuildModes.Build), по умолчанию они будут строиться из тиков, но можно указать и другие типы данных.
Так как CandleSeries мы сделали публичным свойством, то CandleSeries можно будет дополнительно настроить из PropertyGridEx описанном в предыдущем пункте.
Все стратегии имеют методы который можно переопределить, нам понадобиться переопределить метод OnStarted. Который вызывается перед запуском стратегии и позволяет предварительно задать ей стартовое состояние.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь мы для CandleSeries задаем инструмент, который указывается в PropertyGridEx. После чего создаем правило обработки законченной свечи. О работе с правилами можно ознакомиться в документации. В правиле указываем метод, который будет обрабатывать каждую законченную свечу в нашем случае это метод ProcessCandle он будет описан позже. После того как все задано подписываемся на появление свечей по CandleSeries в коннекторе через метод SubscribeCandles.
В нашем случае метод ProcessCandle и содержит основную логику стратегии.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
В первую очередь нам необходимо определить является ли свеча реал тайм или исторической, если свеча историческая, то мы ее игнорируем. Не все стратегии требуют этого, например для стратегий основанные на стаканах не требуют этого так как стаканы идут всегда реал тайм. Нет универсального способа определить является ли свеча реал тайм или исторической, и в каждой стратегии эту проблему придется решать самостоятельно в зависимости от требований стратегии. В данном случае я просто буду сравнивать время закрытие свечи с временем в коннекторе и если оно не превышает определенный лаг, то свечу считаю реал тайм.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Далее смотрим на то какая это свеча и какая текущая позиция у стратегии. Если свеча растущая, то при позиции равной 0 мы откроем позицию рыночным ордером на объём, заданный нами в PropertyGridEx. Если свеча растущая и позиция меньше 0 то мы переворачиваем позицию.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Противоположные действия делаем для убывающей свечи.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
На данный момент наша стратегия готова к работе. Ее необходимо передать в SimpleStrategyControl который мы создали в предыдущем пункте с помощью метода BindStraregy. Это мы делаем в конструкторе MainWindow сразу после инициализации компонентов MainWindow.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запустим для проверки.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Стратегия работает, совершаются сделки, но пока нет свечей и сделок на графике.

Добавление свечей и сделок на график из стратегии

В пункте про панель стратегий с помощь метода SetChart в стратегию мы предали график свечей Chart. В методе OnStarted стратегии проверяем установлен ли График у стратегии и если он установлен, то инициализируем график, а также подписываемся на события появления новой собственной сделки и изменения свечи.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Метод инициализации графика InitChart.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь мы сохраняем ссылку на Сhart в локальной переменной. Очищаем график. А также создаем и передаем на график элементы графика для свечей и сделок.
Конструкция _chart.GuiSync(() =>{… }); нужна для того чтобы инициализация графика выполнилась в главном потоке.
Метод отрисовки свечей на графике CandleSeriesProcessing.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Здесь мы получаем свеча из события CandleSeriesProcessing коннектора, создаем ChartDrawData для отображения его на графике. Указываем время data.Group(candle.OpenTime), указываем что свечу надо добавить в свечной элемент графика .Add(_chartCandleElement, candle);. И указываем что графику надо прорисовать новые данные.
Аналогичные действия выполняем для сделок.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp
Запустим для проверки.
Я сделаю свой торговый терминал, с блекджеком и алго на базе StockSharp

Краткий вывод

Для создание сложного и профессионально выглядящего приложения не нужно тратить массу времени. Мы за несколько часов создали полноценное приложение с возможностью конфигурирование, отображения и непосредственной торговли.
Не бойтесь пробовать и создавать свои программы. Надеюсь, эта статья вам поможет освоиться в этом деле.

Оригинал статьи
91 Комментарий
  • Тарас Громницкий
    27 ноября 2018, 18:14
    Хорошая попытка StockSharp, но слишком сложно, чтобы кто-то этим воспользовался.
    • Lev
      27 ноября 2018, 18:29
      Тарас Громницкий, сейчас придёт главный по тарелочкам алготрейдер и выскажет своё веское мнение
      • Тарас Громницкий
        27 ноября 2018, 19:09
        Lev, хто?
        • Lev
          27 ноября 2018, 21:33
          Тарас Громницкий, ИП Черных Е.В., кто же ещё?
          • Sergey
            28 ноября 2018, 13:24
            Lev, ссылка на резюме?

            Воспользуюсь случаем хайпа. Ищу талантливых C# программистов на удаленную работу. Пишите письма в профайл.
            • Тарас Громницкий
              28 ноября 2018, 13:39

              Sergey, это kbrobot, которого недавно возили лицом по асфальту на смартлабе.

              Какие есть задачи(из какой области) для талантливых программистов ?

              • Sergey
                28 ноября 2018, 13:50
                Тарас Громницкий, ясно.

                Обсуждение работ не веду публично. Пишите в профайл.
                • Тарас Громницкий
                  28 ноября 2018, 13:52

                  Sergey, меня интересует предметная область.

                  Не думаю, что это секретно.

                  • Sergey
                    28 ноября 2018, 13:54
                    Тарас Громницкий, алгоритмы под NYSE, криптовалюты. После падения волатильности возможно возобновление с MOEX.
                    • Тарас Громницкий
                      28 ноября 2018, 13:58

                      Sergey, понял вас.

                      Крипта не сильно интересна(точнее сильно не интересна).

                      А библиотеки у вас свои или стокшарп ?

                      • Sergey
                        28 ноября 2018, 14:00
                        Тарас Громницкий, для дальнейшего обсуждения пишите письма в профайл )) Сразу присылайте CV.
                        • Тарас Громницкий
                          28 ноября 2018, 14:03

                          Sergey, вакансия меня не интересует.

                          Я ищу точки взаимодействия и партнёрства.

            • Mike
              04 декабря 2018, 00:35
              Sergey, нет возможности отправить Вам лс. т.к. только зарегистрировался на смарт-лабе. 
              Ваше сообщение о наличии удалённой работы для C# программистов еще актуально?
              • Sergey
                04 декабря 2018, 00:40
                Mike, да, актуально. Написал сам.
    • Дмитрий К
      27 ноября 2018, 20:20
      Тарас Громницкий не подскажете  для втб квика есть какое нибудь решение, чтоб с кодом не разбираться, какой нибудь конструктор для алго?
      • Тарас Громницкий
        27 ноября 2018, 20:43

        Дмитрий К, Квики у всех брокеров одинаковые.

        В плане алгоритмизации.

        Конструкторов не так много.

        Основным на данный момент является TsLab.

        Он стоит что-то около 4 т.р. в месяц.

        Есть убогий конструктор StockSharp.

        В остальном придётся программировать.

        Больше или меньше.

        Если речь идёт о тестировании идей, то очень многое можно проверить через Excel.

        Без шуток.

         

        Может быть что-то упустил и появились новые продукты.

        Пусть меня дополнят.

  • Cheshirsky Kot
    27 ноября 2018, 18:52
    Я нихрена не понял, но за такой труд однозначно +
    Явно будет кому-то полезно!
    • Авентадор
      27 ноября 2018, 20:25
      пля, я заманался скроллить страницу!

      весь изнемогший и вспотевший, из последних сил жмакнул кнопачку «хорошо» ))
  • Sergey
    27 ноября 2018, 19:38
    Нужно ли отдельно покупать лицензию на DevExpress?
    • dbndbn
      28 ноября 2018, 01:26
      Sergey, на dev же не нужна лицензия (подразумеваю, что продавать свой продукт не планируется)

  • ves2010
    27 ноября 2018, 20:18
    мудрено… и не по русски все...

    толи дело тслаб…
  • Boris Litvinov
    27 ноября 2018, 21:37
    После того как повторите, вас ждет череда красных окон.
    Велком на платный форум!

    хороший труд.
  • SEREGA
    27 ноября 2018, 22:02
    В посте картинки не увеличиваются!!!(((
    Не умеешь!!!
    могу научить!!!(пройди курсы)
  • Niktesla (бывш. Бабёр-Енот)
    27 ноября 2018, 23:55
    порыв здравый, но блин...
    VS2017 это же нездоровое чудище на ~100 гигов… вас на него жизнь заставила пересесть? 

    Кстати, скоко оперативы отжирает терминал, если в нем наоткрывать того чего можно наоткрывать, подписаться на всякую фигню, и дать постоять часок-другой?
      • Niktesla (бывш. Бабёр-Енот)
        29 ноября 2018, 12:33
        Ivan, а я 17-ю глянул и остался на 15-й… в 17-й слишком наверчено всего… начать с того что она у меня вылетала с ошибкой при установке пока я папку TMP/TEMP не перенес с RAM(~1 или 2 гиг) диска на основной… не хватало ей места, видите ли, чтоб компоненты подкачать... 

        я просто хз скоко там стокшарповские аналоги едят, поэтому и спросил… Но если судить по всяким тслабам и OS-ам, то по полгига-гиг при подрублении прослушивания какойнить котировки с небольшой историей?
  • meat
    28 ноября 2018, 00:26
    какую проблему решает данное ПО по сравнению с аналогами? в чем новизна? в чем экономическая обоснованность создания еще одного терминала?
      • Тарас Громницкий
        28 ноября 2018, 11:30

        Ivan, видимо с заскоками Сухова вы ещё не сталкивались.

        Спросите об этом у прошлых участников проекта.

        Например у Муханчикова или парня, который работал на Nokia(не помню фамилии).

        Ну и поговорите с профессиональными трейдерами.

        Которых ещё нужно найти.

        Им не нужно ВСЁ.

        Им необходим минимум, который будет работать стабильно.

        Вместо написания и отладки собственного терминала дешевле и надёжнее купить готовый продукт с отзывами.

        А не сидеть на самодельной пороховой бочке, теряя деньги в самый ответственный момент по причине вылезшего бага.

        Для подключения к разным терминалам/брокерам специалист никогда не будет использовать чужие прослойки вроде стокшарп.

        Потому что код должен быть полностью открыт и максимально управляем/стабилен.

        Для тестов на истории уже есть удобные системы вроде TsLab и пр.

        Даже бесплатность — это минус.

        Потому как сие означает, что где-то вы пытаетесь выкружить деньги.

        А где непонятно.

        В любом случае кто-то за это заплатит.

        Либо внезапно возникнет абонентская плата, а может вы сэкономите на программистах и софт будет работать как попало.

        Короче за всё нужно платить.

        Так лучше сделать это сразу и иметь ответственного за результат или купленные библиотеки.

        • Авентадор
          28 ноября 2018, 12:55
          Тарас Громницкий, ваше недовольство какое-то не вполне адекватное.

          В мире ПО существует такая бизнес-модель, когда базовый функционал предоставляется бесплатно, чтобы набрать популярность и развить сообщество пользователей. А уже дополнительные плюшки, переделки, и воплощение целых проектов выполняется за денежку.

          Я не фанат s#, однако я горячо приветствую те возможности, которые автор выпускает в свет забесплатно. Кому надо — берёт и пользуется.
          А при необходимости — либо дорабатывает своими силами, либо покупает услуги разработчиков (причём необязательно услуги авторов платформы).
          • Тарас Громницкий
            28 ноября 2018, 13:37

            Ave, настоятельно рекомендую попробовать их библиотеку.

            И пообщаться с поддержкой.

            После чего жду вас в наших рядах.

            • Sergey
              28 ноября 2018, 13:53
              Тарас Громницкий, я использую. Отвечают вполне нормально. Там не без ошибок, но в целом больше доволен, чем недоволен. Для меня главное, что идут навстречу, а не как одна известная компания с FX, обвинит сначала в глупости, а затем заблокирует. Можно и доплатить за FEATURE, лишь бы работало. С большими компаниями этого не добится.
              • Тарас Громницкий
                28 ноября 2018, 14:07

                Sergey, может быть что-то и изменилось.

                Но мы в своё время намучились с этими попугаями.

                Сначала Сухов писал проект, потом студент из Томска, который сейчас работает в АТАС, дальше начался распределённый кодинг.

                И всё это время ошибки либо игнорировались, либо устранялись месяцами.

                Ну и закрытость ядра сильно волновала.

                В результате плюнули написали своё и выдохнули наконец.

                А то каждый день как на вулкане.

                Вроде работает, но доверить существенные деньги этому велосипеду страшно.

                • Sergey
                  28 ноября 2018, 14:13
                  Тарас Громницкий, я не знаю таких подробностей. Я пока не сталкивался с игнорированием ошибок.

                  Ядро у них разве не на GITHUB лежит?
                  • Тарас Громницкий
                    28 ноября 2018, 14:14

                    Sergey, теперь может и лежит.

                    После того, как от них ушла пачка народу.

                    Но даже сейчас(если ничего не путаю) там есть закрытые библиотеки.

                    • Sergey
                      28 ноября 2018, 14:20
                      Тарас Громницкий, я не знаю такие подробности. Люди приходят и уходят. Я сам менял работу. Других нанимаю и растаемся (обоюдно или односторонне). Обычное явление для бизнеса.

                      У них много закрытое, они за деньги продают. Но ядро у них открытое, насколько я понимаю. Но я не смотрел глубоко в код. Скачивал для интереса. Я сам мало CODING занимаюсь. Больше RESEARCH интересует и MANAGEMENT.
        • Dio
          28 ноября 2018, 14:34
          Тарас Громницкий, лучше и не скажешь!!+++!!!
          • Тарас Громницкий
            28 ноября 2018, 16:40

            Ivan, о программистах и речи не было.

            Главными вопросами была отсутствующая поддержка, закрытое ядро и неприличное количество ошибок, которое устранялось почти никак.

      • meat
        28 ноября 2018, 14:27
        Ivan, зачем вообще для робота приложение на gui?
        • Тарас Громницкий
          28 ноября 2018, 14:29

          meat, вот !!!

          Это правильный вопрос.

          Точнее зачем для робота навороченный GUI ?

          • meat
            28 ноября 2018, 14:34
            Тарас Громницкий, вообще GUI не нужен для программы, которая что-то делает сама по алгоритму.
            • Тарас Громницкий
              28 ноября 2018, 14:35

              meat, для минимального управления.

              Можно и без интерфейса.

              Тогда придётся подключаться к нему как к сервису.

              • meat
                28 ноября 2018, 14:42
                Тарас Громницкий, управлять можно через интерфейс консоли (есть такой тип пользовательских интерфейсов, но это не gui) Подробнее про типы интерфейсов ru.bmstu.wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F
                • Тарас Громницкий
                  28 ноября 2018, 14:43

                  meat, нуууу да.

                  Но даже минимальным удобством не пахнет.

                  А значит увеличивается вероятность ошибки.

                  Плюс в экстренной ситуации проще и быстрее(что важно) нажать кнопку, а не вводить команду.

                  А ведь её(команду) ещё и помнить нужно, либо извлекать при помощи другой команды.

                  Короче я сторонник минимального интерфейса.

                  • meat
                    28 ноября 2018, 14:57
                    Тарас Громницкий, вероятность ошибки увеличивается при смене пользовательского интерфейса для робота? Сильное заявление, проверять я его, конечно, не буду. Откуда вы такие беретесь в интернете… Мда :(
                    • Тарас Громницкий
                      28 ноября 2018, 15:01

                      meat, я такого не говорил.

                      Вероятность ошибки увеличивается с ростом количества лишних действий.

                      К чему неизбежно ведёт консоль.

                      • meat
                        28 ноября 2018, 16:10
                        Тарас Громницкий, консоль как раз содержит минимум элементов и по вашей логике там лучше протестировать сам интерфейс и работу робота. В самом gui-приложении отдельно еще интерфейс нужно тестировать, чтобы там не было ошибок. А там действий происходит гораздо больше, чем в консоли. Взять хотя бы то, что у вас должен быть отдельный поток для gui, отдельный для робота, различные подписки событий и взаимодействия элементов интерфейса. Получается просто из-за количества элементов gui-приложение сложнее.
                        • Тарас Громницкий
                          28 ноября 2018, 16:42

                          meat, консоль содержит минимум элементов, но требует от пользователя значительно больше действий при работе чем интерфейс.

                          Поэтому я утверждаю, что интерфейс должен быть минимальным.

                          Все остальные аргументы выше smart-lab.ru/blog/507380.php#comment9131942

                          Повторюсь, что небольшое усложнение интерфейсом даёт скорость и точность реакции в экстренных ситуациях.

                          Что окупается многократно.

                          • meat
                            28 ноября 2018, 17:01
                            Тарас Громницкий, какие действия требуются от пользователя, если робот торгует без участия человека? Может вы путаете понятия с советником, который выдает рекомендации на открытие позиции и человек сам принимает решение?
                            • Тарас Громницкий
                              28 ноября 2018, 17:11

                              meat, абсолютно автономных систем не существует.

                              На рынке случаются ситуации, когда нужно срочно крыть позы.

                              Например КРЫМНАШ или 9 апреля.

                              Короче когда цена как бешеная прёт в противоположную позе сторону.

                              А ещё есть ошибки на бирже.

                              И вот представьте, что висит у вас десяток роботов на консолях.

                              Ситуация ахтунговая, шерсть на башке шевелится, руки трясутся.

                              И в таком состоянии нужно быстро и точно набрать 10 команд.

                              Или нажать 10 кнопок в интерфейсе.

                              Что проще ?

                              • meat
                                28 ноября 2018, 17:26
                                Тарас Громницкий, проще 1 команда, которая выполнит те 10 команд.
                                Я недавно деплой на сервер делал, там вообще 1 команда для загрузки кода из репозитория, обновления проекта и зависимостей, проверки кода на ошибки, создание отчетов для QA, метрики кода, запуск тестирования, сборки проекта, накатить миграции БД, прогрев кеша, создание нового релиза, перемещение релиза в новую уникальную папку, смену текущего релиза на последний рабочий (zero-downtime), обновление конфига сервера без его перезагрузки и самое главное в случае ошибки на каком-то из этапов откатить все назад, так что даже пользователь ничего не заметит. Если бы я это делал через gui, то сошел бы с ума.
          • Niktesla (бывш. Бабёр-Енот)
            29 ноября 2018, 12:40
            Тарас Громницкий, имхо чтобы видеть что робот работает, а не висит и не сыплет эксепшенами втихаря… ну и инфу можно вывести какуюнить ))
            UPD: хотя это скорее «просто» GUI, а не «навороченный» 
            • Тарас Громницкий
              29 ноября 2018, 13:00

              Бабёр-Енот, именно так.

              Лично я исповедую принцип функциональной простоты.

              Когда лишнего не наворачиваешь.

              Но и в примитивизм не скатываешься.

              Короче всё для функционала.

              Но и про удобство не забываешь(но без фанатизма).

          • meat
            28 ноября 2018, 16:06
            Ivan, тогда для мосбиржи можно использовать quik в качестве gui, там есть dll для вызова внешних функций
          • meat
            28 ноября 2018, 16:18
            Ivan, еще в метатрейдере можно создавать стратегии. 
              • meat
                28 ноября 2018, 17:16
                Ivan, я же не критикую само ПО из поста. Всем нужно какое-то ПО для торговли, которые облегает жизнь трейдеру. Но никому не нужно универсальное ПО, у каждого есть своя специфическая проблема, которую нужно решить. По этой причине основной недостаток универсального ПО — желание решить все возможные проблемы. Вместо этого, на мой взгляд, лучше сосредоточиться на своей специфичной проблеме и найти для нее решение. Кому-то нужен робот только для Мосбиржи (для нашей страны это актуально). Такой робот будет дешевле в разработке, проще в тестировании и поддержке и решает очень хорошо свою поставленную задачу, так как он изначально спроектирован под эту биржу.
                Не встречал кого-то, кто серьезно торгует криптовалютой.
                Среди моих знакомых алготрейдингом занимаются только на Мосбирже и NYSE (так как по их словам они уперлись в потолок на нашей бирже).

          • Тарас Громницкий
            28 ноября 2018, 16:58
            Ivan, на сколько я знаю в прекрасных терминалах ATAS и Tiger крипта успешно торгуется.
      • Dio
        28 ноября 2018, 14:32
        Ivan, можно купить ИК и просто торговать через стандартный Квик или через другие общедоступные и известные терминалы со все всеми стратегиями, алго и не только.
        Главное МО, чтобы положительное было.))
        Никто кроме бире даже не узнает как вы торгуете, где ставите стопы и т.д. и т.п.
        Все проще гораздо, а вы все усложнили…
        • Тарас Громницкий
          28 ноября 2018, 16:59

          Dio, подписываюсь.

          Трейдинг — это стратегии.

          В части автоматизации нужна простота и стабильность, ибо деньги — это серьёзно.

          • Dio
            28 ноября 2018, 17:16
            Тарас Громницкий, согласен!
    • Niktesla (бывш. Бабёр-Енот)
      29 ноября 2018, 12:35
      meat, ну что за вопросы?
      Очевидно же что данное ПО решает задачу обучения начинающего терминалописателя тому, как можно быстро запилить торговый терминал и что там вообще может/должно быть в базовом комплекте…
      • meat
        29 ноября 2018, 13:02
        Бабёр-Енот, для таких постов есть более подходящие ресурсы
  • atlantic
    28 ноября 2018, 05:23
    Для новичка, мне кажется, действительно будет очень сложно. А если кто знаком с C# то там все на интуитивном уровне будет понятно.  
  • algotrade
    28 ноября 2018, 07:54
    Рано или поздно наступает тот момент, когда текущим софтом недоволен (касается не только алго, а вообще) и ты начинаешь думать, почему бы не написать свое… оно то лучше будет, да? Нет. 
    Если речь идет о мелких скриптах и автоматизации, оно то да. А когда дело дойдет до «а давайте ка аналог метака, да чтоб не лагало», то в середине вас ждет сюрприз (по началу то пойдет с воодушевлением, ага).
    Короче, проходили, знаем как это работает. 
    • Sergey
      28 ноября 2018, 13:58
      algotrade, это не момент, это фазы. Фаза, когда нужно готовое. Затем нужно свой. Затем опять лучше готовое. Затем опять своё. Непрерывно меняется из-за глубины осваивания направлений. Постоянно на готовом или своём невозможно сидеть, согласно собственной практике.
  • Антон Денисков (Fry)
    28 ноября 2018, 08:44
    Это всё замечательно до первого бага. Чем проще юзать награмождённые виджеты, тем больше с ними косяков.
    «Профессионально выглядящее приложение» — очень точно определено =)
    Причём сегодня таких всё больше и больше. Грёбаная виртуализация даёт каждой обезьяне в руку кросс-платформенность, визуальное программирование «мышкой», рюшечки и фишечки, но не даёт главное — ВОЗМОЖНОСТЬ РАЗВИВАТЬ ВАЛИДНЫЕ ПАРАДИГМЫ КОДИРОВАНИЯ!
    Мы всё больше и больше имеем косяков, которые тупо маскируются в этом говно-виртуале… =(
  • Replikant_mih
    28 ноября 2018, 11:42

     Да, S# очень интересный конструктор для алго-трейдинга, очень низкоуровневый конструктор (в смысле огромный набор низкоуровневых элементов), но есть и более высокоуровневые элементы. Такая комбинация позволяет как относительно быстро запилить что-то относительно сложное, так и небыстро запилить сколь угодно специфичные свои хотелки. 

     

    Не знаю, по-моему стандартная эволюция трейдера когда ты понимаешь, чем конкретно тебе не нравится текущий софт, что бы ты изменил и как — тут S# будет очень кстати. 

     

    Но не смотря на то, что это своего рода конструктор, не стоит обольщаться насчет низости порога входа))).

  • SMT
    28 ноября 2018, 12:01
    Наоборот, цель статьи показать, что порог вхождения в создание своих приложений торговли с помощью S#.API очень низкий.
     А если человек, в силу специфики своих умственных способностей, даже при наличии большого желания, не в силах преодолеть этот очень низкий порог?
    То, получается, он дебил тогда?

    • Тарас Громницкий
      28 ноября 2018, 12:02

      smt, порог не низкий.

      Это их галлюцинация.

      Он значительно выше среднего.

      • SMT
        28 ноября 2018, 12:14
        Тарас Громницкий, скорее всего. Низкий порог — это кубики в ТСЛаб. А тут порог — как минимум владение  ООП. 
         А то люди- непрограммеры, почитав данную статью и правда могут подумать плохо о своих умственных способностях и опустить руки.
        • Sergey
          28 ноября 2018, 13:18
          smt, сейчас даже программисты ООП не понимают.
          • SMT
            28 ноября 2018, 13:32
            Sergey, ну, если только что хардкорные ассемблерщики или олдскульные фортранщики)  
            • Sergey
              28 ноября 2018, 14:14
              smt, нет, обычные JAVA и C#.
              • SMT
                28 ноября 2018, 14:22
                Sergey,  Хорошему программеру незнание ООП не -помеха! )
      • SMT
        28 ноября 2018, 17:15
        Ivan, а как понять что не подходит, не попробовав? 
  • Сергей Симонов
    28 ноября 2018, 18:08
    а я на LUA под QUIK пишу и не булькаю)
    • Тарас Громницкий
      28 ноября 2018, 20:52

      Сергей Симонов, как вариант.

      Инструмент зависит от задачи.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн