Создание простого привода на S#

Создание простого привода на S#
Atom
5/25/2012
M.Kovaleva


Бесплатная библиотека StockSharp предоставляет широкие возможности при разработке торговых роботов различной сложности. Но самое трудное для многих пользователей - сделать первые шаги при разработке своего робота. Поэтому представляем вашему вниманию статью-инструкцию по созданию простого привода для терминала QUIK с использованием S#.API.

Для создания простого привода нам понадобится:
1) Quik;
2) Библиотека S#;
3) Visual Studio Express;
4) Немного навыков программирования.

Подготовка рабочего места



После установки Quik, его нужно настроить для работы со S#. Для этого нужно проделать 3 базовых шага:

1) Включить обработку внешних транзакций. "Торговля" → "Внешние Транзакции" → "Начать обработку" и поставить галочку "Запускать процесс обработки внешних транзацкий автоматически"

2) Далее нужно открыть соответствующий Wnd-файл с настройками: "Настройки" → "Загрузить настройки из файла" → выбрать wnd-файл по пути "Разахивированная папка"\Samples\Quik\info.wnd

3) Далее настраиваем счета : "Торговля" → "Настройка счетов" → добавить все счета в выбранные счета депо.

4) В итоге можно настроить окошки - подтянуть их, уменьшить, но названия столбцов менять нельзя, так же как и удалять их. У разных брокеров (квиков) есть особенности , стоят определённые фильтры на таблицах "Мои сделки", "Мои заявки". Нажав правой кнопкой мышки на таблицу "Мои сделки", выделить все. Аналогично и в таблице “Мои заявки”.

Добавьте торгующийся на данный момент инструмент в таблицу "Инструменты"; по нему в дальнейшем мы будем отправлять заявки.

Создание торгового привода

Открываем Visual Studio.
Создаём новый проект → "Приложение Wpf".
Настраиваем наш проект на работу S#:
  • Правой кнопкой мыши на "Проект" → "Свойства" и меняем "Требуемая версия NetFrameWork" (Net FrameWork 4 Client Profile ) на просто Net FrameWork 4(после этого меняется целевая среда разарботки).
  • Добавляем нужные библиотеки в наш проект "Ссылки" → "Добавить ссылку" → "Обзор".
  • Выбираем нужные нам библиотеки, которые лежат в "Разахрихированая папка"\References:
    1)StockSharp.Quik
    2)StockSharp.BusinessEntites
    3)StockSharp.Algo
    4)Ecng.Common
    5)Ecng.ComponentModel
    6)Ecng.Xaml
  • Прописываем соответсвующие using на наши библиотеки в классе MainWindow.xaml.cs

Code
using System.Windows;
using StockSharp.Quik;
using Ecng.Xaml;
using StockSharp.BusinessEntities;

Заходим в MainWindow.Xaml, создаём соответсвующие кнопки и другие элементы на форме нашего приложения, перетягивая их из панели элементов. Получаем следующую форму:

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

Прописываем код под кнопку подключения.
Это простой код демонстрирующий подключение и выгрузку данных из Quik в асинхронном режиме. Теперь осталось дополнить код выводом информации на главную форму, то есть сделать вывод в наши выпадающие списки "Портфели" и "Инструменты".
Code
//обьявляем переменную
        private QuikTrader _trader;
        /// <summary>
        /// Подключение к квику
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            //создаём квик трейдера, передавая ему сразу место расположения нашего терминала
            _trader= new QuikTrader(QuikTerminal.GetDefaultPath());
            //подписываемся на событие подключения, как только подлючимся, сразу запустим Экспорт
            //Connect- просто подключение к потоку
            //StartExport- получение он-лайн данных из квика Инструменты,Заявки , Портфели и так далее
            _trader.Connected += () => _trader.StartExport();
            // подключаем квик 
            _trader.Connect();

        }

Дописываем графический вывод на нашу форму в выпадающие списки:
Code
private void Connect_Click(object sender, RoutedEventArgs e)
        {
            //создаём квик трейдера, передавая ему сразу место расположения нашего терминала
            _trader= new QuikTrader(QuikTerminal.GetDefaultPath());
            //подписываемся на событие появление новых инструментов
            //оно сработает когда включится экспорт 
            _trader.NewSecurities += securities =>this.GuiAsync(()=>//GuiASync используется чтобы выводить графику из другого потока
                                                                    {
                                                                        //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                                                                        Securitites.ItemsSource = _trader.Securities;
                                                                    });
            //подписываемся на событие появления новых портфелей
            //сработает после запуска экспорта
            _trader.NewPortfolios += portfolios =>this.GuiAsync(()=>
                                                                    {
                                                                        //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                                                                        Portfolios.ItemsSource = _trader.Portfolios;
                                                                    });
            
            //подписываемся на событие подключения, как только подлючимся, сразу запустим Экспорт
            //Connect - просто подключение к потоку
            //StartExport- получение онлайн данных из квика Инструменты, Заявки, Портфели и так далее
            _trader.Connected += () => _trader.StartExport();
            // подключаем квик 
            _trader.Connect();

        }

Запускаем проект (F5), нажимаем на кнопку "Подключиться" (в это время у нас уже работает Quik, который подключен к котировкам). После этого наш робот включает эскпорт DDE в Quik и через некоторое время мы получаем заполненные выпадающие списки в нашем проекте.

Остается дописать функционал под две оставшиеся кнопки "Купить", "Снять все заявки":
  • "Купить" - отправляем заявку (портфель и инструмент берется из выпадающих списков) по той цене, которая будет указана в нашем текстовом окне;
  • "Снять все заявки" - снимаем все выставленные нами заявки.

Код для отправки заявки:
Code
private void Buy_Click(object sender, RoutedEventArgs e)
        {
            //создаём ордер
            //заполняем его нужными свойствами
            // портфель и инструмент вынимаем из выпадающих списков
            //цену для отправки заявки вынимаем из тесктового окна
            var order = new Order
                            {
                                Trader = _trader,
                                Portfolio = (Portfolio)Portfolios.SelectedItem,
                                Security = (Security) Securitites.SelectedItem,
                                Volume = 1,
                                Price = decimal.Parse(PRICE.Text),
                                Direction = OrderDirections.Buy
                            };
            //регистрируем ордер
            _trader.RegisterOrder(order);
        }

Код для снятия всех заявок:
Code
private void CancelOrders_Click(object sender, RoutedEventArgs e)
        {
            //отменить все заявки
            _trader.CancelOrders();
        }

Пример работы простого привода:

Скачать исходники также можно здесь.

Видео-урок по созданию простого торгового робота с использованием библиотеки StockSharp:



Автор статьи: Самунджян Артём


1 2 3  > >>
Zyanov

Avatar
Date: 5/24/2012
Reply


а как приделать к приводу BestByPriceQuotingStrategy?
Thanks:

nni

Avatar
Date: 6/6/2012
Reply


Будет такой же материал для Альфы?
Thanks:

StockSharp

Avatar
Date: 6/7/2012
Reply


nni
Будет такой же материал для Альфы?


Для альфы практически тоже самое [biggrin]
Попробуйте для квика сделать, для альфы сами сможете.
Thanks:

Smelov

Avatar
Date: 6/9/2012
Reply


Здравствуйте! Как можно программно узнать текущие средства по портфелю?
Thanks:

Кот Матроскин

Avatar
Date: 6/9/2012
Reply


Smelov
Здравствуйте! Как можно программно узнать текущие средства по портфелю?

http://stocksharp.com/do...ssEntities_Portfolio.htm
Thanks: StockSharp Smelov

Smelov

Avatar
Date: 6/9/2012
Reply


Кот Матроскин
Smelov
Здравствуйте! Как можно программно узнать текущие средства по портфелю?

http://stocksharp.com/do...ssEntities_Portfolio.htm

Ок, понятно. А если портфели находятся в _trader.Portfolios, как в текущем примере? Как вывести текущие средства по выбранному портфелю?
Thanks:

Кот Матроскин

Avatar
Date: 6/9/2012
Reply


Smelov
Кот Матроскин
Smelov
Здравствуйте! Как можно программно узнать текущие средства по портфелю?

http://stocksharp.com/do...ssEntities_Portfolio.htm

Ок, понятно. А если портфели находятся в _trader.Portfolios, как в текущем примере? Как вывести текущие средства по выбранному портфелю?

Пример не смотрел, с Квиком не работаю)))
_trader.Portfolios передает список всех имеющихся портфелей, перебирая каждый можно получить сумму средств на них. Примерно так:
foreach (var portfolio in _trader.Portfolios)
и, например, так:
sum += portfolio.GetFreeMoney(false).Value;
Thanks: Smelov

Smelov

Avatar
Date: 6/9/2012
Reply


Кот Матроскин

Пример не смотрел, с Квиком не работаю)))
_trader.Portfolios передает список всех имеющихся портфелей, перебирая каждый можно получить сумму средств на них. Примерно так:
foreach (var portfolio in _trader.Portfolios)
и, например, так:
sum += portfolio.GetFreeMoney(false).Value;


Ошибка 1 "StockSharp.BusinessEntities.Portfolio" не содержит определения для "GetFreeMoney" и не был найден метод расширения "GetFreeMoney", принимающий тип "StockSharp.BusinessEntities.Portfolio" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\....\Desktop\QuikStockSharp\QuikStockSharp\MainWindow.xaml.cs 45 38 QuikStockSharp

p.s. и все-таки было бы удобнее, если бы к конкретному портфелю можно было обращаться по индексу
Thanks:

Кот Матроскин

Avatar
Date: 6/9/2012
Reply


Smelov
Ошибка 1 "StockSharp.BusinessEntities.Portfolio" не содержит определения для "GetFreeMoney" и не был найден метод расширения "GetFreeMoney", принимающий тип "StockSharp.BusinessEntities.Portfolio" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку) C:\Users\....\Desktop\QuikStockSharp\QuikStockSharp\MainWindow.xaml.cs 45 38 QuikStockSharp

p.s. и все-таки было бы удобнее, если бы к конкретному портфелю можно было обращаться по индексу

Приведите текст программы
А портфели-то регистрировали?
Thanks:

Smelov

Avatar
Date: 6/9/2012
Reply


Кот Матроскин

Приведите текст программы
А портфели-то регистрировали?


чуть-чуть добавил в код из примера

Code

 private void Connect_Click(object sender, RoutedEventArgs e)
        {
            //создаём квик трейдера , передавая ему сразу место расположения нашего терминала
            _trader = new QuikTrader(QuikTerminal.GetDefaultPath());
            //подписываемся на событие появление новых инструментов
            //оно сработает когда включится экспорт 
            _trader.NewSecurities += securities => this.GuiAsync(() =>//GuiASync используется чтобы выводить графику из другого потока
            {
                //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                Securities.ItemsSource = _trader.Securities;
            });
            //подписываемся на событие появления новых портфелей
            //сработает после запуска экспорта
            _trader.NewPortfolios += portfolios => this.GuiAsync(() =>
            {
                //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                Portfolios.ItemsSource = _trader.Portfolios;
                
                double sum;
                sum = 0.0;
                foreach (var portfolio in _trader.Portfolios)
                    sum += portfolio.GetFreeMoney(false).Value;

                SumLabel.Content = sum.ToString();
            });

            //подписываемся на событие подключения, как только подлючимся, сразу запустим Экспорт
            //Connect- просто подключение к потоку
            //StartExport- получение он-лайн данных из квика Инструменты,Заявки , Портфели и так далее
            _trader.Connected += () => _trader.StartExport();
            // подключаем квик 
            _trader.Connect();
        }
Thanks:
1 2 3  > >>

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy