Видео-уроки: Создание обертки коннекторов (шаблон для подключений)
[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]
Темы занятия:
Создание безопасной обертки (шаблона) для различных коннекторов
- Создание безопасного варианта универсального подключения
- Создание элемента управления для работы с коннектором (подключение, отключение, инструменты)
Потоковые данные
- Котировки
- Сделки
Создание приложения, отображающего потоковые данные
- Вывод всех сделок в окно
- Создание визуального стакана котировок
Домашнее задание:
- Вывести в окно значение латентности и время последнего обновления стакана.
- Добавить в окно второй стакан глубиной в 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;
}
}
Комментарии (10)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Подскажите пожалуйста, а где взять исходники от уроков?
Приветствую. Помогите, пжл, кто может. Уже два часа бьюсь, над тем чтобы получить корректно значение Latency, показывающую. любая переменная, принимающая значение задержки обновления стакана, например (var ltn = marketdepth.Latency) равна нулю. В чем ошибка??? Другие задания данного урока сделал без проблем, а с этим стопорюсь. Спасибо за ранее. P.S. уважаемый администратор форума, если я не туда написал, то прошу сильно не пинать.
Все вопросы по урокам обсуждаются в соответствующем разделе stocksharp.com/forum/tags/Обучение/
В Вашем случае надо убедиться что стакан приходит. Если используете Quik, то закройте в терминале Quik соответствующий стакан (или все стаканы) и повторите запуск Вашей программы. Проверьте, что стакан приходит, через точку останова. Через оригинальный проект урока значение Latency удается получить?
Со всеми изменениями, для последнего build S#, код для урока должен выглядеть так:
Обратите внимание, что вместо BaseTrader используется Connector, а также добвляется библиотека MoreLinq.dll в References.
Было бы супер, если обновленный код выложила команда Stockshapr, а я не провел весь вечер выискивая, почему код из примера не запускается, как его исправить и общаясь с саппортом (саппорт молодцы, все достаточно быстро подсказали)
При переходе на новую версию АПИ в проекте SafeConnection в строке: Trader.OrdersRegisterFailed += fails => <u>fails.ForEach(f => OnNewException(f.Error));</u>
ошибка:
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
http://stocksharp.com/forum/4346/My-pierieiekhali-v-sots-siet--Vkontaktie/
Михаил, не понял в чем посыл? В Контакт я уже тоже "переехал".
Второе. Примеры обновлены до последней версии.
Введенеие Хочется сделать обертку для коннектора по типу урока 2. Часть 1. Создание обертки коннекторов (https://vk.com/stocksharpedu?z=video-66650972_167470507%2Feb956e23a603a4440c), чтобы было все по-взрослому))) По простому(т.е. без использования класса SafeConnection и графического юзер контрола(wpfconnection)), подключение, c использованием библиотек 4.3.13, работает!
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<Exception> NewException = delegate ;
protected virtual void OnNewException(Exception exeption) { NewException(exeption); }
public bool IsConnected { get {return (Trader != null && Trader.ConnectionState == ConnectionStates.Connected);}
private set
} } }
namespace WpfConnectionInterface { /// <summary> /// Interaction logic for InterFace.xaml /// </summary> 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<Portfolio> obj) { this.GuiAsync(() => ); }
private void TraderNewSecurities(IEnumerable<Security> obj) { this.GuiAsync(() => ); }
private void DisonnectClick(object sender, RoutedEventArgs e) {
} } }