Как создать объект Security?
Atom Ответить
07.03.2013


Ранее делал так:

Код
_trader.NewSecurities += securities => this.GuiAsync(() =>
{
    Securitites.ItemsSource = _trader.Securities;

    if (_security == null)
    {
        _security = securities.FirstOrDefault(sec => sec.Code == secCode);
    }
});


Но инструмент один и хочу задать константным образом.
Пытаюсь так:

Код
Security _security = new Security
{
    Code = "RIH3",
};


не работает Sad

Теги:


Спасибо:




20 Ответов
Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 08.03.2013
Ответить


Здравствуйте! Я делаю так.
Код
Security _securityDefault = new Security()
        {
            Id = "SPFB.RTS@RTS",
            Code = "RTS",
            Class = "SPFB",
            MinStepSize = 5,
            MinStepPrice = 2,
            ExchangeBoard = ExchangeBoard.Forts,
        };
Спасибо: MyNick

MyNick

Фотография
Дата: 08.03.2013
Ответить


Спасибо, так только я еще и не пробовал - в понедельник попробую.
Автор топика
Спасибо:

MyNick

Фотография
Дата: 11.03.2013
Ответить


Попробовал,- к сожалению и ваш вариант у меня не работает.

Далее при попытке запустить экспорт стакана if (_security != null) _trader.RegisterMarketDepth(_security);

Выдает что-то типа "Ссылка на объект не указывает на экземпляр объекта.
Для создания экземпляров объектов воспользуйтесь зарезервированным словом new" :-(
Автор топика
Спасибо:

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 12.03.2013
Ответить


Здравствуйте! Прочитал ваш пост внимательнее, и понял, что ввел вас в заблуждение. Изначально посчитал что вам нужен инструмент для тестирования, и тот вариант, что я написал вполне подойдет для тестирования без подключения к терминалу (конечно зависит от того что и как тестировать). При работе с подключением к терминалу лучше воспользоваться вашим первым вариантом, либо если вам нужен только один заранее известный инструмент, то можно еще сделать, так как показано в SampleRealTimeTesting
Код
_trader.NewSecurities += securities => this.GuiAsync(() =>
						{
							// находим нужную бумагу
							var lkoh = securities.FirstOrDefault(s => s.Code == "LKOH");

							if (lkoh != null)
							{
								_lkoh = lkoh;
							}
						});

При таком варианте у вас будет вся информация о инструменте полученная из терминала. Если инструмент создавать вручную, то легко ошибиться. Либо изменяться параметры инструмента, например шаг цены как уже было с фьючерсном на индекс РТС.

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

Код
private Security _securityDefault = new Security()
        {
            Id = "SPFB.RTS@RTS",
            Code = "RTS",
            Class = "SPFB",
            MinStepSize = 5,
            MinStepPrice = 2,
            ExchangeBoard = ExchangeBoard.Forts,
        };


Если вас интересовало тестирование на исторических данных то, посмотрите здесь https://stocksharp.ru/do...4a-a699-da47b666194a.htm в пункте №4 про инструмент написано, в пункте №6 описано получение стакана.
Спасибо:

MenDel

Фотография
Дата: 12.03.2013
Ответить


MyNick Перейти
Попробовал,- к сожалению и ваш вариант у меня не работает.

Далее при попытке запустить экспорт стакана if (_security != null) _trader.RegisterMarketDepth(_security);

Выдает что-то типа "Ссылка на объект не указывает на экземпляр объекта.
Для создания экземпляров объектов воспользуйтесь зарезервированным словом new" :-(


Я так пишу
Код

public Security MySecurity { get; set; }

_trader.NewSecurities += sec => this.GuiAsync(() => sec.ForEach(s => { if (s.Code == "RIH3") MySecurity = s; }));


а
_trader.RegisterMarketDepth(MySecurity);
_trader.RegisterSecurity(MySecurity);
_trader.RegisterTrades(MySecurity);
я запускаю только тогда, когда экспорт будет работать на 100%.
Потому что когда вы запускаете экспорт, проходит еще какое то время прежде чем, вы получите нужный портфель, инструмент, позиции.
Спасибо:

MyNick

Фотография
Дата: 12.03.2013
Ответить


Спасибо за ответы.

Тестированием я не занимаюсь, а торгую на реальном счете.

Вот как раз делать "так как показано в SampleRealTimeTesting" я и не хочу.
От этой _trader.NewSecurities += securities => this.GuiAsync(() => хренотени я и пытаюсь избавиться.
Я не хочу получать инструменты из квика, а хочу просто задавать у себя в программе, создав объект Security.

>По поводу ошибки то, скорее всего вы создаете инструмент в одном методе, а пользоваться пытаетесь в другом
Вот-вот что-то с областью видимости у меня неправильно.
Я создаю объект после:
Код
namespace StockSharpWpf
{
    public partial class MainWindow : Window
    {
        Security _security = new Security
        {
            Code = "RIH3",
        };

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

Кстати объект "Portfolio" я создал точно таким же образом. И он работает!

Код
        Portfolio _portfolio = new Portfolio
        {
            Name = "",
        };
Автор топика
Спасибо:

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 12.03.2013
Ответить


Ну тогда здесь без кода и пол литра не разберешься! BigGrin
Просим код на суд!
Спасибо:

MyNick

Фотография
Дата: 12.03.2013
Ответить


Вот мой гениальный код BigGrin :

Код
private void QuikTraderGo_Click(object sender, RoutedEventArgs e)
        {
            if (terminal == null) terminal = QuikTerminal.Get(QuikPath);

            if (!terminal.IsLaunched) // если QUIK не запущен
            {
                MessageBox.Show("QUIK не запущен");
            }
            else
            {
                if (_trader != null)
                {
                    _trader.Disconnect();
                    QuikTraderGo.Content = "QuikTrader Go";
                }
                else
                {
                    //создаем квик трейдера, передавая ему сразу место расположения нашего терминала
                    _trader = new QuikTrader(QuikPath);

                    if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана

                    // подписываемся на событие обновления стакана
                    _trader.MarketDepthsChanged += depths => this.GuiAsync(() =>
                    {
                        //PRICE.Text = _security.BestBid.Price.ToString();//лучшая цена покупки в стакане
                        if (_depth == null && _security != null)
                        {
                            _depth = depths.FirstOrDefault(d => d.Security == _security);

                            if (_depth != null)
                            {
                                //MessageBox.Show("Стакан " + _security + " появился.");
                            }
                        }
                    });
                    //подписываемся на событие подключения, как только подключимся, сразу запустим Экспорт
                    _trader.Connected += () => this.GuiAsync(() =>
                    {
                        //_trader.StartExport(); //получение он-лайн данных из квика Инструменты, Заявки, Портфели и так далее
                        //MessageBox.Show("Подключение по DDE произведено успешно.");
                    });
                    // подключаем квик
                    _trader.Connect();

                    QuikTraderGo.Content = "QuikTrader Stop";
                }
            }
        }


ошибку указывает на строку "if (_security != null) _trader.RegisterMarketDepth(_security)"
Автор топика
Спасибо:

VassilSanych

Фотография
Дата: 13.03.2013
Ответить


MyNick Перейти
От этой _trader.NewSecurities += securities => this.GuiAsync(() => хренотени я и пытаюсь избавиться.

Боюсь, избавляясь от этой хренотени, вам придётся нагородить намного больше другой инициализирующей хренотени.
GuiAsync, кстати, совсем не обязательно.

Спасибо:

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 13.03.2013
Ответить


Ваш код не последователен, т.е. вы создаете трейдер

Код
                    //создаем квик трейдера, передавая ему сразу место расположения нашего терминала
                    _trader = new QuikTrader(QuikPath);

и сразу же запускаете стакан
Код
                    if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана


а к Quikу подключаетесь потом, как же он запустит экспорт стакана если он еще к Quikу не подключен? Запускайте экспорт стакана тогда когда Quik подключен.

VassilSanych как всегда прав, без этой хренотени ни как.






Спасибо:

MyNick

Фотография
Дата: 13.03.2013
Ответить


Уж не хотите ли вы сказать, что в этом коде:

Код
_trader.NewSecurities += securities => this.GuiAsync(() =>
{
    Securitites.ItemsSource = _trader.Securities;

    if (_security == null)
    {
        _security = securities.FirstOrDefault(sec => sec.Code == secCode);
        if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана
    }
});


происходит подключение к квику?
Почему вы думаете, что к квику я не подключен?
Автор топика
Спасибо:

MenDel

Фотография
Дата: 13.03.2013
Ответить


MyNick Перейти
Уж не хотите ли вы сказать, что в этом коде:

Код
_trader.NewSecurities += securities => this.GuiAsync(() =>
{
    Securitites.ItemsSource = _trader.Securities;

    if (_security == null)
    {
        _security = securities.FirstOrDefault(sec => sec.Code == secCode);
        if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана
    }
});


происходит подключение к квику?
Почему вы думаете, что к квику я не подключен?


В этом коде подключения не происходит, в нем мы получаем инструмент.
А получим мы его тогда когда экспорт заработает.
И стакан регистрируется только после всего этого.
А у вас стакан регистрируется сразу.
К тому же зачем вы закомментировали запуск экспорта в коде?

И кстати почему эта строчка хрень
Код
_trader.NewSecurities += sec => sec.ForEach(s => { if (s.Code == "RIH3") MySecurity = s; });

Вроде выглядит легко и просто, указал код инструмента, а дальше все само.
в этом коде как раз можно и стакан сразу зарегистрировать
Спасибо: MyNick

MyNick

Фотография
Дата: 13.03.2013
Ответить


Сейчас все объясню.

>зачем вы закомментировали запуск экспорта в коде?
экспорт я запуская в отдельном обработчике у меня кнопка есть "DDEConnect_Click"

Я правильно думаю, что этот код:

Код
_security = securities.FirstOrDefault(sec => sec.Code == secCode);
и этот тоже _trader.NewSecurities += sec => sec.ForEach(s => { if (s.Code == "RIH3") MySecurity = s; });


ищет инструмент "RIH3" из таблицы "Инструменты" квика полученные по DDE???

Насчет экспорта я понял, сейчас попробовал так:

Код
                    _trader.Connected += () => this.GuiAsync(() =>
                    {
                        Security _security = new Security
                        {
                            Code = "RIH3",
                        };

                        _trader.StartExport();
                        if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана
                    });


Выдает ту же ошибку "Ссылка на объект не указывает на экземпляр объекта. Для создания экземпляров объектов воспользуйтесь зарезервированным словом new"

Область видимости вроде не при чем. Похоже этот код просто не создает объект.
Тогда что он делает?
Автор топика
Спасибо:

MenDel

Фотография
Дата: 13.03.2013
Ответить


MyNick Перейти


Код
_trader.Connected += () => this.GuiAsync(() =>
{
    Security _security = new Security
    {
        Code = "RIH3",
    };
 
    _trader.StartExport();
    if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана
});


Выдает ту же ошибку "Ссылка на объект не указывает на экземпляр объекта. Для создания экземпляров объектов воспользуйтесь зарезервированным словом new"

Область видимости вроде не при чем. Похоже этот код просто не создает объект.
Тогда что он делает?


Я полагая чтоб создать инструмент одного его кода мало.
Вы же не берете его из квика, а создаете с 0, так что надо все его необходимые параметры заполнить, как Иван З написал выще.

Код
Security _security = new Security
                    {
                        Code = "SBER",
                        Name = "Сбербанк России ОАО ао",
                        Id = "SBER@QJSIM",
                        Class = "QJSIM",
                        MinStepSize = 0.01m,
                        MinStepPrice = 0.01m,
                        ExchangeBoard = ExchangeBoard.Micex,
                    };


Проверил ошибки не вылетело
Путем экспериментов,
я так понял, что стакан регистрируется по Id.
Спасибо:

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 14.03.2013
Ответить


Сначала создадим инструмент
Код

private _security;//создадим инструмент
private void QuikTraderGo_Click(object sender, RoutedEventArgs e)
        {

Потом после создания трейдера, инициализируем инструмент

Код
                    
//создаем квик трейдера, передавая ему сразу место расположения нашего терминала
                    _trader = new QuikTrader(QuikPath);
                    _security = new Security//инициализируем инструмент
                    {
                        Code = "SBER",
                        Name = "Сбербанк России ОАО ао",
                        Id = "SBER@QJSIM",
                        Class = "QJSIM",
                        MinStepSize = 0.01m,
                        MinStepPrice = 0.01m,
                        ExchangeBoard = ExchangeBoard.Micex,
                        Trader=_trader,// Трейдер если не забить будет ругаться на отсутствие шлюза
                    };


ну а экспорт стакана запустить можно и так(хотя что то подсказывает мне что это не совсем корректно)
Код
 _trader.Connected += () => this.GuiAsync(() =>
                    {
                        _trader.StartExport();
                        if (_security != null) _trader.RegisterMarketDepth(_security); // запускаем экспорт стакана
                    });


Quik подключает следующая строка, весь код который выполнен до этой строки выполняется без подключения к Quik.

Код
                    // подключаем квик
                    _trader.Connect();


Я попробовал на SampleSMA таким образом, _trader.RegisterMarketDepth(_security); прошел, вопросов не задал. Приходят ли события по стакану не проверял, но по крайней мере ошибок не выдавал.


Спасибо:

MyNick

Фотография
Дата: 14.03.2013
Ответить


создал и инициализировал так:

Код
Security _security = new Security
{
   Id = "RIH3@RTS",
   Code = "RIH3",
   Name = "RTS-3.13",
   MinStepSize = 10,
   MinStepPrice = 2,
   ExchangeBoard = ExchangeBoard.Forts,
   Trader = _trader,
};


>Я попробовал на SampleSMA таким образом, _trader.RegisterMarketDepth(_security); прошел, вопросов не задал. Приходят ли события по стакану не проверял, но по крайней мере ошибок не выдавал

У меня на этом этапе ошибку тоже не выдал, но далее события НЕ ПРИХОДЯТ и обращение к _security вызывает все ту же "Ссылка на объект не указывает на экземпляр объекта" Sad

Что делает код securities.FirstOrDefault(sec => sec.Code == secCode); ?
Автор топика
Спасибо:

Иван З.

Фотография
Курсы Автор статей Благотворитель
Дата: 14.03.2013
Ответить


http://msdn.microsoft.co...ru/library/bb549039.aspx
Возвращает первый элемент последовательности или значение по умолчанию, если последовательность не содержит элементов.

в пример Sample добавил инструмент
Код
                        var _lkoh = new Security()
                        {
                            Id = "LKOH@EQBR",
                            Code = "LKOH",
                            Class = "EQBR",
                            MinStepSize = 0.1M,
                            MinStepPrice = 0.1M,
                            ExchangeBoard = ExchangeBoard.Micex,
                            Trader = Trader,
                        };

строку
Код
Trader.NewSecurities += securities => this.GuiAsync(() => _securitiesWindow.Securities.AddRange(securities));

заменил на
Код
_securitiesWindow.Securities.Add(_lkoh);

Больше ничего не делал, все работает нормально, экспорт стакана идет. Можете проверить сами.
Sample.rar 4,8MB (0)
Спасибо:

MyNick

Фотография
Дата: 15.03.2013
Ответить


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

Спасибо вам Иван З. за ваш пример - он помог мне решить другую проблему.

Вчера лазая по форуму нашел такой код:
Код
(Security)this.Securitites.SelectedItem;

вроде так кто-то создавал объект Security, но при попытке его использовать получил сообщение об ошибке: "невозможно преобразовать объект SelectedItem в Security", что-то в этом роде.

Главная задача избавиться от _trader.NewSecurities += securities => или найти инструмент в ComboBox.

Возможно VassilSanych был прав и "избавляясь от этой хренотени, придется нагородить намного больше другой инициализирующей хренотени".

Я просто плохо знаю C# и StockSharp, так как раньше на них не программировал, но чувствую, что проблему можно решить.

Ладно не буду больше мучить вас вопросами.
Автор топика
Спасибо:

VassilSanych

Фотография
Дата: 15.03.2013
Ответить


SelectedItem имеет отношение к выпадающему списку Securities на форме. Надо заменить это своей реализацией.
Спасибо:

MyNick

Фотография
Дата: 15.03.2013
Ответить


Можно создать объект Security из ComboBox, который заполняется вручную?
Как?
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy