Урок 2. Потоковые данные (сделки, котировки). Шаблон для универсального (безопасного) подключения.

Урок 2. Потоковые данные (сделки, котировки). Шаблон для универсального (безопасного) подключения.
Atom
4/20/2013
IvanB


Видео-уроки: Создание обертки коннекторов (шаблон для подключений)

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470507&hash=5aed0d16f3d8cb3b&hd=3[/vk]

Работа с потоковыми данными

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167477199&hash=974c22b650016bee&hd=3[/vk]

Видео-уроки (экстра): Работа с котировками, отслеживание сигналов

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167477299&hash=130700df674df7af&hd=3[/vk]

Темы занятия:

Создание безопасной обертки (шаблона) для различных коннекторов

  1. Создание безопасного варианта универсального подключения
  2. Создание элемента управления для работы с коннектором (подключение, отключение, инструменты)

Потоковые данные

  1. Котировки
  2. Сделки

Создание приложения, отображающего потоковые данные

  1. Вывод всех сделок в окно
  2. Создание визуального стакана котировок

Домашнее задание:

  1. Вывести в окно значение латентности и время последнего обновления стакана.
  2. Добавить в окно второй стакан глубиной в 5.

Полезные ссылки: Класс MarketDepth Класс Quote Класс Trade

Вложения: Скачать проекты

Изменения в проектах:

Проект StockSharp.TraderConnection Файл SafeConnection.cs

В версии S# 4.1.19.1 настройки переподключения сгруппированы в следующие свойства: Trader.ReConnectionSettings.ConnectionSettings - настройки для подключения Trader.ReConnectionSettings.ExportSettings - настройки для экспорта

В связи с чем, изменен вид указания интервала попыток подключений, теперь он внутри свойства ConnectionSettings. Возобновление экспорта теперь осуществляется автоматически, поэтому строка: Trader.ReConnectionSettings.IsReStartExport = true; более не нужна.

Было:


        /// <summary>
        /// Подключиться безопасно к торговой платформе
        /// </summary>
        public void ConnectSafe()
        {
            //Интервал переподключения
            Trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
            //Когда переподключаться
            Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
            //Запускать ли заново экспрорт после переподключения
            Trader.ReConnectionSettings.IsReStartExport = true;
            //Подписаться на появление ошибки подключения от трейдера
            Trader.ConnectionError += OnNewException;
            //Подписаться на появление ошибок не выставленной заявки
            Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error));
            //Подписаться на событие успешного подключения к торговой платформе
            Trader.Connected += () =>
                                    {
                                        try
                                        {
                                            //Запустить экспорт данных из торговой платформы
                                            Trader.StartExport();
                                        }
                                        catch (Exception ex)
                                        {
                                            //Вызвать событие появления нового исключения
                                            OnNewException(ex);
                                        }
                                    };

            //Подключиться к торговой платформе
            Trader.Connect();
        }

Стало:


        public void ConnectSafe()
        {
            //Интервал переподключения
            Trader.ReConnectionSettings.ConnectionSettings.Interval = TimeSpan.FromSeconds(10);
            //Когда переподключаться
            Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
            //Запускать ли заново экспрорт после переподключения
            //Trader.ReConnectionSettings.IsReStartExport = true;
            //Подписаться на появление ошибки подключения от трейдера
            Trader.ConnectionError += OnNewException;
            //Подписаться на появление ошибок не выставленной заявки
            Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error));
            //Подписаться на событие успешного подключения к торговой платформе
            Trader.Connected += () =>
                                    {
                                        try
                                        {
                                            //Запустить экспорт данных из торговой платформы
                                            Trader.StartExport();
                                        }
                                        catch (Exception ex)
                                        {
                                            //Вызвать событие появления нового исключения
                                            OnNewException(ex);
                                        }
                                    };

            //Подключиться к торговой платформе
            Trader.Connect();
        }

Начиная с версии S# 4.1.19.1 статус подключения коннектора вынесен в специальное свойство ConnectionState, которое может принимать следующие значения: Disconnected - Не активно, Disconnecting - В процессе отключения, Connected - В процессе подключения, Connecting - Подключение активно, Failed - Ошибка подключения

Таким образом, теперь нет свойства IsConnected, а наличие статуса подключения мы можем получать от свойства ConnectionState.

Было:


        public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if (Trader != null && Trader.IsConnected)
            {
                Trader.StopExport();
                Trader.Disconnect();
            }
        }

Стало:


        public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if (Trader != null && Trader.ConnectionState == ConnectionStates.Connected)
            {
                Trader.StopExport();
                Trader.Disconnect();
            }
        }

Было:


        public bool IsConnected
        {
            get
            {
                return Trader != null && Trader.IsConnected;
            }
        }

Стало:


        public bool IsConnected
        {
            get
            {
                return Trader != null && Trader.ConnectionState == ConnectionStates.Connected;
            }
        }




Thanks:


Николай

Avatar
Date: 11/27/2013
Reply


Подскажите пожалуйста, а где взять исходники от уроков?

Thanks:

IvanB

Avatar
Date: 11/27/2013
Reply


Николай: Подскажите пожалуйста, а где взять исходники от уроков? Исходники находятся на сервере, подробнее описано в следующем посте: http://stocksharp.com/forum/313/Khranilishchie-stratieghii/

Thanks:

FireSpirit

Avatar
Date: 1/15/2014
Reply


Приветствую. Помогите, пжл, кто может. Уже два часа бьюсь, над тем чтобы получить корректно значение Latency, показывающую. любая переменная, принимающая значение задержки обновления стакана, например (var ltn = marketdepth.Latency) равна нулю. В чем ошибка??? Другие задания данного урока сделал без проблем, а с этим стопорюсь. Спасибо за ранее. P.S. уважаемый администратор форума, если я не туда написал, то прошу сильно не пинать.

Thanks:

IvanB

Avatar
Date: 1/16/2014
Reply


FireSpirit: Приветствую. Помогите, пжл, кто может. Уже два часа бьюсь, над тем чтобы получить корректно значение Latency, показывающую. любая переменная, принимающая значение задержки обновления стакана, например (var ltn = marketdepth.Latency) равна нулю. В чем ошибка??? Другие задания данного урока сделал без проблем, а с этим стопорюсь. Спасибо за ранее. P.S. уважаемый администратор форума, если я не туда написал, то прошу сильно не пинать.

Все вопросы по урокам обсуждаются в соответствующем разделе stocksharp.com/forum/tags/Обучение/

В Вашем случае надо убедиться что стакан приходит. Если используете Quik, то закройте в терминале Quik соответствующий стакан (или все стаканы) и повторите запуск Вашей программы. Проверьте, что стакан приходит, через точку останова. Через оригинальный проект урока значение Latency удается получить?

Thanks:

devruss

Avatar
Date: 1/24/2014
Reply


Со всеми изменениями, для последнего build S#, код для урока должен выглядеть так:


using System;
using MoreLinq;
using StockSharp.Algo;
using StockSharp.BusinessEntities;
using Ecng.Collections;



namespace TraderConnection
{
    public class SafeConnection
    {
        /// Коннектор к торговой платформе
        public Connector Trader { get; private set; }

        /// Событие появления нового исключения
        public Action<Exception> NewException = delegate { };

        /// Конструктор. Создать безопасное подключение
        /// <param name="trader">Коннектор к торговой платформе</param>
        public SafeConnection(Connector trader)
        {
            Trader = trader;
        }

        /// Вызвать событие появления нового исключения
        /// <param name="exception">Исключение</param>
        protected virtual void OnNewException(Exception exception)
        {
            //Вызвать событие появления нового исключения
            NewException(exception);
        }
        
        public void ConnectSafe()
        {
            //Интервал переподключения
            Trader.ReConnectionSettings.ConnectionSettings.Interval = TimeSpan.FromSeconds(10);
            //Когда переподключаться
            Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
            //Подписаться на появление ошибки подключения от трейдера
            Trader.ConnectionError += NewException;
            //Подписаться на событие успешного подключения к торговой платформе
            Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error));

            Trader.Connected += () =>
            {
                try
                {
                    //Запустить экспорт данных из торговой платформы
                    Trader.StartExport();
                }
                catch (Exception ex)
                {
                    //Вызвать событие появления нового исключения
                    OnNewException(ex);
                }
            };

            //Подключиться к торговой платформе
            Trader.Connect();
         


        }

        public void DisconnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if (Trader != null && Trader.ConnectionState == ConnectionStates.Connected)
            {
                Trader.StopExport();
                Trader.Disconnect();
            }
        }

        public bool IsConnected
        {
            get { return Trader != null && Trader.ConnectionState == ConnectionStates.Connected; }
        }
    }
}


Обратите внимание, что вместо BaseTrader используется Connector, а также добвляется библиотека MoreLinq.dll в References.

Было бы супер, если обновленный код выложила команда Stockshapr, а я не провел весь вечер выискивая, почему код из примера не запускается, как его исправить и общаясь с саппортом (саппорт молодцы, все достаточно быстро подсказали)

Thanks:

Sid

Avatar
Date: 3/12/2014
Reply


При переходе на новую версию АПИ в проекте SafeConnection в строке: Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error));

ошибка:

Error 1 The type 'System.Windows.FrameworkElement' is defined in an assembly that is not referenced. You must add a reference to assembly 'PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. D:\PROJ\02_lesson (Quotes, Connection pattern) T\StockSharp.TraderConnection\SafeConnection.cs 69 53 StockSharp.TraderConnection

Error 2 'System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.OrderFail>' does not contain a definition for 'ForEach' and no extension method 'ForEach' accepting a first argument of type 'System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.OrderFail>' could be found (are you missing a using directive or an assembly reference?) D:\PROJ\02_lesson (Quotes, Connection pattern) T\StockSharp.TraderConnection\SafeConnection.cs 69 59 StockSharp.TraderConnection

API 4.2.2.16

Thanks:

Mikhail Sukhov

Avatar
Date: 3/12/2014
Reply


Thanks:

Sid

Avatar
Date: 3/12/2014
Reply


Михаил Сухов:

Vadimka:

http://stocksharp.com/forum/4346/My-pierieiekhali-v-sots-siet--Vkontaktie/

Михаил, не понял в чем посыл? В Контакт я уже тоже "переехал".

  1. В Контакте есть обсуждени уроков ?
  2. Или в Контакте есть последняя исправленеая версия примера ?
  3. Или мне нужно сделать отдельный пост здесь на форуме в разделе обучения ?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/12/2014
Reply


Второе. Примеры обновлены до последней версии.

Thanks:

titan

Avatar
Date: 12/9/2015
Reply


Введенеие Хочется сделать обертку для коннектора по типу урока 2. Часть 1. Создание обертки коннекторов (https://vk.com/stocksharpedu?z=video-66650972_167470507%2Feb956e23a603a4440c), чтобы было все по-взрослому))) По простому(т.е. без использования класса SafeConnection и графического юзер контрола(wpfconnection)), подключение, c использованием библиотек 4.3.13, работает!

  1. Анализ работы кода позволил найти проблему:
namespace TraderConnection { public class SafeConnection {

private Timer timer_sc; public Connector Trader { get; set; }

public SafeConnection(Connector trader) { Trader = trader;

}

public void ConnectSafe() {

Trader.ReConnectionSettings.Interval=TimeSpan.FromSeconds(10); Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime; Trader.ConnectionError += OnNewException; Trader.OrdersRegisterFailed += fails => fails.ForEach(f => OnNewException(f.Error)); Trader.Connect(); // !!!! В ЭТОМ МЕСТЕ Trader ИЗМЕНЯЕТ ЗНАЧЕНИЕ ПОЛЯ ConnectionState ИЗ Disconnected В Connecting....

// if (Trader!=null && Trader.ConnectionState==ConnectionStates.Connected) // { // try // { // IsConnected = true; // } // catch (Exception ex) // { // OnNewException(ex); // } // } }

public void DisconnectSafe() { if (Trader != null && Trader.ConnectionState == ConnectionStates.Connected) {Trader.Disconnect();} }

public event Action NewException = delegate ;

protected virtual void OnNewException(Exception exeption) { NewException(exeption); }

public bool IsConnected { get {return (Trader != null && Trader.ConnectionState == ConnectionStates.Connected);}

private set

} } }

  1. Поскольку ConnectionState находится в состоянии Connecting, события Connected в классе WpfConnection не происходит:

namespace WpfConnectionInterface { ///

/// Interaction logic for InterFace.xaml /// public partial class InterFace : UserControl { private SafeConnection _safeConnection; public SafeConnection SafeConnection { set { _safeConnection = value; btnConnect.IsEnabled = _safeConnection != null; } get { return _safeConnection; } }

public InterFace() { InitializeComponent(); Loaded += InterfaceLoaded; btnConnect.IsEnabled = false; }

private void InterfaceLoaded(object sender, RoutedEventArgs e) { var window = Window.GetWindow(this.Parent); if (window != null) window.Closed += delegate { if (_safeConnection != null) _safeConnection.DisconnectSafe(); }; }

private void ConnectClick(object sender, RoutedEventArgs e) {

if (_safeConnection == null) return; if (_safeConnection.IsConnected) { //кнопка содержит контент "Disconnect", после щелчка по ней:...-> btnConnect.Content = "Connect"; btnConnect.IsEnabled = false; _safeConnection.Trader.NewSecurities -= TraderNewSecurities; _safeConnection.Trader.NewPortfolios -= TraderNewPortfolios; _safeConnection.DisconnectSafe(); Action disconnected = null; disconnected = () => { _safeConnection.Trader.Disconnected -= disconnected; this.GuiAsync(() => ); }; _safeConnection.Trader.Disconnected += disconnected; } else { //кнопка содержит контент "Connect", после щелчка по ней:...-> btnConnect.Content = "Disconnect"; btnConnect.IsEnabled = false;

_safeConnection.Trader.NewSecurities += TraderNewSecurities; _safeConnection.Trader.NewPortfolios += TraderNewPortfolios; Action connected = null; connected = () => { _safeConnection.Trader.Connected -= connected; this.GuiAsync(() => ); };

//Здесь событием Connected соответственно и не пахнет _safeConnection.Trader.Connected += connected; _safeConnection.ConnectSafe();

}

}

public Security SelectedSecurity { get { return (Security) cbSecurities.SelectedItem; } }

public Portfolio SelectedPortfolio { get { return (Portfolio)cbPortfolios.SelectedItem; } }

private void TraderNewPortfolios(IEnumerable obj) { this.GuiAsync(() => ); }

private void TraderNewSecurities(IEnumerable obj) { this.GuiAsync(() => ); }

private void DisonnectClick(object sender, RoutedEventArgs e) {

} } }

  1. События NewSecurities и NewPortfolios не происходят. Поезда не едут)))квадроцикл не мопед.
Thanks:


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

loading
clippy