← Назад

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

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

Для создания простого привода нам понадобится:

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

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

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

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

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

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

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

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

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

Открываем 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
using System.Windows;
using StockSharp.Quik;
using Ecng.Xaml;
using StockSharp.BusinessEntities;

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

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

Прописываем код под кнопку подключения. Это простой код демонстрирующий подключение и выгрузку данных из Quik в асинхронном режиме. Теперь осталось дополнить код выводом информации на главную форму, то есть сделать вывод в наши выпадающие списки "Портфели" и "Инструменты".

//обьявляем переменную
        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();

        }

Дописываем графический вывод на нашу форму в выпадающие списки:

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 и через некоторое время мы получаем заполненные выпадающие списки в нашем проекте.

Остается дописать функционал под две оставшиеся кнопки "Купить", "Снять все заявки":

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

Код для снятия всех заявок:

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

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

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

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

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

Комментарии (53)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Zyanov
Zyanov

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

nni
nni

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

StockSharp
StockSharp

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

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

Smelov
Smelov

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

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

Smelov: Здравствуйте! Как можно программно узнать текущие средства по портфелю? http://stocksharp.com/doc/html/Methods_T_StockSharp_BusinessEntities_Portfolio.htm

Smelov
Smelov

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

Smelov: Здравствуйте! Как можно программно узнать текущие средства по портфелю? http://stocksharp.com/doc/html/Methods_T_StockSharp_BusinessEntities_Portfolio.htm Ок, понятно. А если портфели находятся в _trader.Portfolios, как в текущем примере? Как вывести текущие средства по выбранному портфелю?

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

Smelov:

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

Smelov: Здравствуйте! Как можно программно узнать текущие средства по портфелю? http://stocksharp.com/doc/html/Methods_T_StockSharp_BusinessEntities_Portfolio.htm Ок, понятно. А если портфели находятся в _trader.Portfolios, как в текущем примере? Как вывести текущие средства по выбранному портфелю? Пример не смотрел, с Квиком не работаю))) _trader.Portfolios передает список всех имеющихся портфелей, перебирая каждый можно получить сумму средств на них. Примерно так: foreach (var portfolio in _trader.Portfolios) и, например, так: sum += portfolio.GetFreeMoney(false).Value;

Smelov
Smelov

Кот Матроскин: Пример не смотрел, с Квиком не работаю))) _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. и все-таки было бы удобнее, если бы к конкретному портфелю можно было обращаться по индексу

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

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

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

Smelov
Smelov

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

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


 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();
        }

Sergey Masyura
Sergey Masyura

Smelov:

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

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

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();
    }


Algo/TradeHelper


		/// <summary>
		/// Получить размер свободных денежных средств в портфеле.
		/// </summary>
		/// <param name="portfolio">Портфель</param>
		/// <param name="useLeverage">Использовать ли для рассчета размер плеча.</param>
		/// <returns>Размер свободных денежных средств.</returns>
		public static Currency GetFreeMoney(this Portfolio portfolio, bool useLeverage = false)

Подключите StockSharp.Algo , чтобы был виден extension.
Кот Матроскин
Кот Матроскин

Действительно, на все сборки подписаны? На StockSharp.Algo?

sum должно быть decimal

Smelov
Smelov

StockSharp.Algo в ссылках была, добавлял как в видеоролике. decimal исправил.

Smelov
Smelov

Оказывается тупо забыл using прописать :) И все-таки что насчет доступа по индексу? В принципе можно реализовать через создание нового массива, но должен же быть более правильный вариант.

Sergey Masyura
Sergey Masyura

Smelov: Оказывается тупо забыл using прописать :) И все-таки что насчет доступа по индексу? В принципе можно реализовать через создание нового массива, но должен же быть более правильный вариант.

Доступ по индексу - это потенциальная ошибка. Используйте имя портфеля, оно уникально


Trader.Portfolios.First(p => p.Name == "SPBFUT00451")

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

Smelov: Оказывается тупо забыл using прописать :) И все-таки что насчет доступа по индексу? В принципе можно реализовать через создание нового массива, но должен же быть более правильный вариант. Попробуй добавить обработчик примерно так:

private Portfolio SelectedPortfolio
{
	get { return (Portfolio)Portfolios.SelectedValue; }
}
decimal sum = 0m;
private void Portfolio_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
	if (SelectedPortfolio != null)
	{
		sum = SelectedPortfolio.GetFreeMoney(false).Value;
	}
}

А в xaml-файле в <ComboBox x:Name="Portfolios" добавь ```csharp SelectionChanged="Portfolio_SelectionChanged"

Smelov
Smelov

Sergey Masyura:

Smelov: Оказывается тупо забыл using прописать :) И все-таки что насчет доступа по индексу? В принципе можно реализовать через создание нового массива, но должен же быть более правильный вариант.

Доступ по индексу - это потенциальная ошибка. Используйте имя портфеля, оно уникально

Trader.Portfolios.First(p => p.Name == "SPBFUT00451")


sum = _trader.Portfolios.First(p => p.Name == "NL0011100043").GetFreeMoney(false).Value;

Ошибка: Последовательность не содержит соответствующий элемент.
Smelov
Smelov

Спасибо! Возник еще вопрос. Если этот же код реализовать не в wpf проекте, а в windoes forms, работать будет?

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

Smelov: Спасибо! Возник еще вопрос. Если этот же код реализовать не в wpf проекте, а в windoes forms, работать будет? Теоретически да, но как - не помогу)))

Alexander
Alexander

У вас значит нет такого портфеля либо он не успел придти. Используйте FirstOrDefault и проверяйте на нал.

Smelov
Smelov
Smelov

Создал кнопку для выставления заявки по рыночной цене


            if (_trader != null)
            {
                var order = new Order
                {
                    Trader = _trader,
                    Portfolio = (Portfolio)Portfolios.SelectedItem,
                    Security = (Security)Securities.SelectedItem,
                    Volume = decimal.Parse(Amount.Text),
                    Price = ((Security)Securities.SelectedItem).GetMarketPrice(OrderDirections.Buy),
                    Direction = OrderDirections.Buy
                };
                //регистрируем орде
                _trader.RegisterOrder(order);
            }

GetMarketPrice всегда возвращает 0 и система не может регистрировать заявки

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

Smelov: GetMarketPrice всегда возвращает 0 и система не может регистрировать заявки Это? Советую сначала основательно проштудировать сей Форум, найдете ответы практически на все подобные вопросы

Smelov
Smelov

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

Smelov: GetMarketPrice всегда возвращает 0 и система не может регистрировать заявки Это? Советую сначала основательно проштудировать сей Форум, найдете ответы практически на все подобные вопросы

Попробовал по-разному

decimal Price = ((Security)Securities.SelectedItem).GetCurrentPrice(OrderDirections.Buy).Value;
decimal Price2 = ((Security)Securities.SelectedItem).GetMarketPrice(OrderDirections.Buy);

В обеих случаях получается 0. Причем на нескольких инструментах.

esper
esper

Smelov: Создал кнопку для выставления заявки по рыночной цене

        if (_trader != null)
        {
            var order = new Order
            {
                Trader = _trader,
                Portfolio = (Portfolio)Portfolios.SelectedItem,
                Security = (Security)Securities.SelectedItem,
                Volume = decimal.Parse(Amount.Text),
                Price = ((Security)Securities.SelectedItem).GetMarketPrice(OrderDirections.Buy),
                Direction = OrderDirections.Buy
            };
            //регистрируем орде
            _trader.RegisterOrder(order);
        }
> GetMarketPrice всегда возвращает 0 и система не может регистрировать заявки

Если торгуете акциями, то 0 и есть рыночная цена. Просто надо выставить тип заявки в Market, а не Limit.
Smelov
Smelov

esper: Если торгуете акциями, то 0 и есть рыночная цена. Просто надо выставить тип заявки в Market, а не Limit.

Все, наконец-то получилось. Всем спасибо! покопался в справке и просто добавил Type = OrderTypes.Market в order. Скажите пожалуйста, а где можно почитать про то, как создавать заявки других типов (например conditional)?

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

Smelov:

esper: Если торгуете акциями, то 0 и есть рыночная цена. Просто надо выставить тип заявки в Market, а не Limit.

Все, наконец-то получилось. Всем спасибо! покопался в справке и просто добавил Type = OrderTypes.Market в order. Скажите пожалуйста, а где можно почитать про то, как создавать заявки других типов (например conditional)? http://stocksharp.com/doc/html/a82865dd-98ed-4579-8f48-dd8f806c39e7.htm

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

А попробуй закрываться не Trader.RegisterOrder(order), а с помощью MarketQuotingStrategy

_marketQuotingStrategy = new MarketQuotingStrategy(direction, this.Volume) ChildStrategies.Add(_marketQuotingStrategy);

Smelov
Smelov

Кот Матроскин: А попробуй закрываться не Trader.RegisterOrder(order), а с помощью MarketQuotingStrategy

_marketQuotingStrategy = new MarketQuotingStrategy(direction, this.Volume) ChildStrategies.Add(_marketQuotingStrategy);

простите, немного не понял. а как в таком случае указывать портфель, инструмент и _trader?

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

Smelov: простите, немного не понял. а как в таком случае указывать портфель, инструмент и _trader? Это используется внутри стратегии, и данные о портфеле, инструменте и шлюзе берутся из нее же. Если класс стратегий не используете, то попробуйте следующее (сам ни разу не использовал, но может сработать):

var _marketQuotingStrategy = new MarketQuotingStrategy(_order, new Unit(), new Unit()); _marketQuotingStrategy.Start();

где в _order указываете портфель, инструмент и шлюз. Цену не указываете

Smelov
Smelov

Кот Матроскин: Это используется внутри стратегии, и данные о портфеле, инструменте и шлюзе берутся из нее же. Если класс стратегий не используете, то попробуйте следующее (сам ни разу не использовал, но может сработать):

var _marketQuotingStrategy = new MarketQuotingStrategy(_order, new Unit(), new Unit()); _marketQuotingStrategy.Start();

где в _order указываете портфель, инструмент и шлюз. Цену не указываете А как указывать шлюз? В коде ниже как раз ругается на отсутствие шлюза.


            if (_trader != null)
            {
                var order = new Order
                {
                    Trader = _trader,
                    Portfolio = (Portfolio)Portfolios.SelectedItem,
                    Security = (Security)Securities.SelectedItem,
                    Volume = decimal.Parse(Amount.Text),
                    //Price = ((Security)Securities.SelectedItem).GetCurrentPrice(OrderDirections.Buy).Value,
                    Direction = OrderDirections.Buy
                };
                var _marketQuotingStrategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
                _marketQuotingStrategy.Start();
                //регистрируем ордера
                //_trader.RegisterOrder(order);
            }

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

Smelov: У коде ниже как раз ругается на отсутствие шлюза. Да вроде правильно указали шлюз...

esper
esper

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

Smelov: У коде ниже как раз ругается на отсутствие шлюза. Да вроде правильно указали шлюз... Надо не csharp _marketQuotingStrategy.Start(); а ```csharp ChildStrategies.Add(marketQuotingStrategy);


Хотя да, Кот Матроскин правильно сказал, первый вариант в случае отсутствия стратегии. Но тогда, для marketQuotingStrategy тоже надо шлюз устанавливать.
Memory
Memory

А о каком трейдере идет речь? Не о QUIKTrader? Сервера QUIK частенько выключаются в не рабочее время. Может стоит просто подождать начала работы площадок?

Smelov
Smelov

Memory: А о каком трейдере идет речь? Не о QUIKTrader? Сервера QUIK частенько выключаются в не рабочее время. Может стоит просто подождать начала работы площадок?

private QuikTrader _trader; как в примере. для экспериментов используется quik-junior (работает и на выходных)

Memory
Memory

Там вроде от площадок зависит. Какие инструменты?

Smelov
Smelov

Memory: Там вроде от площадок зависит. Какие инструменты? Акции 1-го уровня (эмулятор). Так обычные-то заявки проходят (с указанием цены и количества). Я просто хочу научиться совершать рыночные заявки. И еще странно, что GetCurrentPrice и GetMarketPrice возвращают нули.

Smelov
Smelov

Возвращаясь к вопросу о windows forms.

Создал WinFroms проект, прицепил библиотеки: все нормально коннектится/дисконнектится. Но вот с получением портфелей и списка активов возникли проблемы:


            _trader.NewSecurities += securities => this.GuiAsync(() =>//GuiASync используется чтобы выводить графику из другого потока
            {
                //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                Securities.ItemsSource = _trader.Securities;
            });
            //подписываемся на событие появления новых портфелей
            //сработает после запуска экспорта
            _trader.NewPortfolios += portfolios => this.GuiAsync(() =>
            {
                //заполняем коллекцию у нашего выпадающего списка (ComboBox)
                Portfolios.ItemsSource = _trader.Portfolios;
            });

ругается на GuiAsync. Пробовал написать "в лоб":


            //создаём квик трейдера , передавая ему сразу место расположения нашего терминала
            _trader = new QuikTrader(QuikTerminal.GetDefaultPath());
            //StartExport- получение он-лайн данных из квика Инструменты,Заявки , Портфели и так далее
            _trader.Connected += () => _trader.StartExport();
            // подключаем квик 
            _trader.Connect();

            foreach (var portfolio in _trader.Portfolios)
                Portfolios.Items.Add(portfolio.Name.ToString());

получаю пустой список. Можно ли вообще в WinForms проектах реализовать подобное?

esper
esper

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

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

Совет про изучения Форума остается в силе))) http://stocksharp.com/posts/m/15374/

Smelov
Smelov
Smelov

Еще один вопрос. Вряд ли на него есть ответ на форуме:) Я создаю datagridview, в котором создаю столбец с comboox'ами. Пытаюсь передать в combobox данные об активах (чтобы можно было выбрать из выпадающего списка)


                DataGridViewComboBoxColumn dgvColumn = new DataGridViewComboBoxColumn();
                dgvColumn.Name = "A1";
                dgvColumn.HeaderText = "A5";
                dgvColumn.DefaultCellStyle = dataGridView1.DefaultCellStyle;
                dgvColumn.DataSource = _trader.Securities;
                dataGridView1.Columns.Add(dgvColumn);
                dataGridView1.Rows.Add();

Приложение запускается и даже в Combobox вижу список всех активов. Но когда пытаюсь что-то выбрать из этого списка, то datagridview выдает ошибку: недопустимое значение ячейки. В списке находятся значения типа SBER@QJSIM

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

Smelov: В списке находятся значения типа SBER@QJSIM А что это за тип такой QJSIM? В марте делал список доступных инструментов, такого типа и в помине не было...

Smelov
Smelov

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

Smelov: В списке находятся значения типа SBER@QJSIM А что это за тип такой QJSIM? В марте делал список доступных инструментов, такого типа и в помине не было... Это класс инструмента. строка в combobox выглядит следующим образом: код_инструмента@класс_инструмента

p.s. имхо, QJSIM это quik junior simulator p.p.s в примере wpf-проекта combobox заполняется таким же образом

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

Честно говоря, не с WinForms не дружу

Smelov
Smelov

Кот Матроскин: Честно говоря, не с WinForms не дружу Да здесь больше дело в DataGridView

Творог
Творог

Почему у меня такая ошибка в строке private QuikTrader _trader; ? Вроде бы все требуемые ссылки добавил.

Moadip
Moadip

Судя по скрину у вас не добавлена StockSharp.Logging.dll и не прописано соответсвующее namespace. Раньше классы для работы с логами были в StockSharp.Algo.dll. Сейчас вынесены в отдельную dll.

Творог
Творог
Творог

Ага, StockSharp.Logging.dll и Ecng.Serialization.dll надо добавить. В статье про это не сказано, устарела.

fly2k
fly2k

у меня у одного нет файла Samples/info.wnd ? :o

boev_a@bk.ru
boev_a@bk.ru

Подскажите что делать если, в комбобоксах не выдаётся список, где находятся лог файлы ?

Mercury13
Mercury13

Добрый день!

Заинтересовала платформа, видно, что имеется много полезных возможностей. Однако, пример из коробки у меня не пошел, выдает ошибку в отроке

_trader.RegisterOrder(order);

Ошибка следующего вида "System.ArgumentNullException" в StockSharp.Algo.dll {"Значение не может быть неопределенным.\r\nИмя параметра: classCode"}

Возможно что-то изменилось в библиотеке, за это время, у меня стоит сейчас последняя версия. Буду благодарен за помощь.

Заранее спасибо.

Igorewka
Igorewka

Добрый вечер! Подскажите, а можно ли как-то сделать возможность выбора сразу 3-х инструментов и одновременной отправки заявки по ним на покупку/продажу?

orphan
orphan

Igorewka: Добрый вечер! Подскажите, а можно ли как-то сделать возможность выбора сразу 3-х инструментов и одновременной отправки заявки по ним на покупку/продажу?

А почему нельзя? Один инструмент на стратегию, 3 инструмента - 3 стратегии?

Владимир
Владимир

Вот как вы себе это представляете? 3 инструмента у всех у них какая цена на покупку? Не плодите сущностей там где не надо. Пошлите по очереди все три заявки.