Урок 4. Свечи, графики, история
Atom
01.05.2013
IvanB


Видео-уроки (основное): Свечи, индикаторы, стратегия, метки, вывод на график

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470235&hash=5354329b0f44e11a&hd=3[/vk]

Исторические свечи, стратегия, вывод на график

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

Видео-уроки (экстра): Создание и работа с кластерными свечками

[vk]http://vk.com/video_ext.php?oid=-66650972&id=167470847&hash=05646cb903828f2e&hd=3[/vk]

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

Свечи (S# документация)

  1. Получение свечей из торгового терминала
  2. Вывод свечного графика Индикаторы (S# документация)
  3. Создание простого собственного индикатора
  4. Вывод графика индикатора Стратегия (S# документация)
  5. Получение заявок и сделок
  6. Вывод меток заявок и сделок на график Работа с графиком (SciChart)
  7. Работа с областями графика
  8. Создание и использование графических элементов Создание модуля для получения исторических данных Создание сборки с получением исторических свечей, отрисовкой графиков и запуском стратегии Выводим свечной график в S#.Studio

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

Полезные ссылки: Свечи, документация

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

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

Проект CandlesDownload Файл History.cs и SimpleSecurityStorage.cs

Было:


using StockSharp.Algo.History.Finam;

Стало:


using StockSharp.Algo.History.Russian.Finam;

Файл SimpleSecurityStorage.cs

В версии S# 4.1.19.1 интерфейс ISecurityStorage содержит свойство Securities, поэтому класс SimpleSecurityStorage, его должен реализовать.

Было:


    /// <summary>
    /// Простое хранилище
    /// </summary>
    class SimpleSecurityStorage:ISecurityStorage 
    {
	private readonly SynchronizedDictionary<long, Security> _cacheByFinamId = new 

SynchronizedDictionary<long, Security>();

	public Security LoadBy(string fieldName, object fieldValue)
		{
			return _cacheByFinamId.TryGetValue((long)fieldValue);
		}

        public IEnumerable<Security> Lookup(Security criteria)
                {
                        throw new NotImplementedException();
                }

        public void Save(Security security)
		{
			TryAddToCache(security);
		}

		private void TryAddToCache(Security security)
		{
			if (security == null)
				throw new ArgumentNullException("security");

			var finamId = security.ExtensionInfo.TryGetValue(FinamHistorySource.FinamSecurityIdField);

			if (finamId != null)
				_cacheByFinamId.SafeAdd((long)finamId, key => security);
		}
    }

Стало:


    /// <summary>
    /// Простое хранилище
    /// </summary>
    class SimpleSecurityStorage:ISecurityStorage 
    {
	private readonly SynchronizedDictionary<long, Security> _cacheByFinamId = new 

SynchronizedDictionary<long, Security>();
        private IEnumerable<Security> _securities;

        public Security LoadBy(string fieldName, object fieldValue)
		{
			return _cacheByFinamId.TryGetValue((long)fieldValue);
		}

        public IEnumerable<Security> Lookup(Security criteria)
        	{
            		throw new NotImplementedException();
        	}

        public IEnumerable<Security> Securities
        {
            get { return _securities; }
        }

        public void Save(Security security)
		{
			TryAddToCache(security);
		}

	private void TryAddToCache(Security security)
		{
			if (security == null)
				throw new ArgumentNullException("security");

			var finamId = security.ExtensionInfo.TryGetValue(FinamHistorySource.FinamSecurityIdField);

			if (finamId != null)
				_cacheByFinamId.SafeAdd((long)finamId, key => security);
		}
    }

Проект CandlesDownloadUsing Файл BollingerStrategy.cs

Теперь класс Strategy не имеет свойства PendingOrders, все Pending заявки можно получить из общей коллекции Orders, поэтому избыточность в библиотеке была устранена, и мы в соем проекте теперь используем коллекцию Orders, и в ней, анализируя свойство State каждой заявки, используя Linq выражение.

Было:



        /// <summary>
        /// Возвращает true если нет активных заявок, а противном случае возвращает false
        /// </summary>
        private bool NoActiveOrders
        {
            get
            {
                return Orders.Count(o => o.State != OrderStates.Done) == 0 && PendingOrders.Count() == 0;
            }
        }

Стало:


        /// <summary>
        /// Возвращает true если нет активных заявок, а противном случае возвращает false
        /// </summary>
        private bool NoActiveOrders
        {
            get
            {
                return Orders.Count(o => o.State != OrderStates.Done) == 0 && Orders.Where(o=>o.State == 

OrderStates.Pending).Count() == 0;
            }
        }

Файл MainWindow.cs

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

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

Было:


        /// <summary>
        /// Обработчик события закрытия окна
        /// </summary>
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (Connection.SafeConnection.Trader != null && Connection.SafeConnection.Trader.IsConnected)
            {
                Connection.SafeConnection.Trader.Dispose();
            }
            Thread.CurrentThread.Abort();
            base.OnClosing(e);
        }

Стало:


        /// <summary>
        /// Обработчик события закрытия окна
        /// </summary>
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (Connection.SafeConnection.Trader != null && Connection.SafeConnection.Trader.ConnectionState == 

ConnectionStates.Connected)
            {
                Connection.SafeConnection.Trader.Dispose();
            }
            Thread.CurrentThread.Abort();
            base.OnClosing(e);
        }


Теги:


Спасибо:


<< < 4 5 6 
IvanB

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


lebedevsrg:

Николай: Присоединяюсь к MenDel,

Выдается ошибка (На видео это время 28:50) :

An unhandled exception of type 'System.ArgumentNullException' occurred in StockSharp.Xaml.dll

Ругается на эту строку: Chart.ProcessCandle(_chartCandleElement, candle)

Присоединяюсь к замечанию Mendel и Николая, уже месяц прошел с даты публикации ошибки , но ошибка все равно не исправлена.

У меня VS2012 более подробную информацию об ошибке - проблема в том что, не найдены символы для библиотеки Abt.Controls.SciChart.Wpf.2.2 (см. детали на скрин-шоте). Надо обновить все библиотеки в проекте (либо в каталоге, откуда подключали dll файлы, либо в каталоге Debug, в зависимости от того как подключали) и все будет работать.

Спасибо:

Maxim

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


Попробуйте так: Код:

_candleManager.Processing += Draw;

при этом заголовок метода Draw нужно изменить: Код:

private void Draw(CandleSeries series, Candle candle)

Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу . Возможно, Вы меня не до конца поняли, но график при подключении через Quik изначально нормально выводился, а через Transaq - проблема какая была, такая и осталась... Я какое-то время планирую пользоваться транзаком, поэтому хотелось бы понять, в чем дело.

Спасибо:

Maxim

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


IvanB:

Maxim: В проекте Transaq > Sample тоже не выводится текущая свеча. А вот в проекте Quik > SampleCandles все Ok!

Попробуйте так:

_candleManager.Processing += Draw;

> при этом заголовок метода Draw нужно изменить:
> ```csharp

private void Draw(CandleSeries series, Candle candle)

Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу. Видео подключения по ссылке: http://youtu.be/4OH39uUWuRo

Спасибо:

Maxim

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


Автор: IvanB Перейти к цитате

Автор: Maxim Перейти к цитате В проекте Transaq > Sample тоже не выводится текущая свеча. А вот в проекте Quik > SampleCandles все Ok!

Попробуйте так: Код:

_candleManager.Processing += Draw;

при этом заголовок метода Draw нужно изменить: Код:

private void Draw(CandleSeries series, Candle candle)

Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу. Видео подключения по ссылке:

Может, дело в этом: "Для получения обновлений по выбранному инструменту и тиков необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(Security) соответственно" (п. 6 Примеры работы с Transaq документации по StockSharp)???

Я попробовал добавить методы RegisterSecurity и RegisterTrades в тело метода RunProcessGetCandles() - результат тот же, последней свечи нет!(

Спасибо:

IvanB

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


Автор: IvanB Перейти к цитате

Автор: Maxim Перейти к цитате В проекте Transaq > Sample тоже не выводится текущая свеча. А вот в проекте Quik > SampleCandles все Ok!

Попробуйте так: Код:

_candleManager.Processing += Draw;

при этом заголовок метода Draw нужно изменить: Код:

private void Draw(CandleSeries series, Candle candle)

Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу. Видео подключения по ссылке:

Может, дело в этом: "Для получения обновлений по выбранному инструменту и тиков необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(Security) соответственно" (п. 6 Примеры работы с Transaq документации по StockSharp)???

Я попробовал добавить методы RegisterSecurity и RegisterTrades в тело метода RunProcessGetCandles() - результат тот же, последней свечи нет!(

Возможно баг в коннекторе Transaq, будем разбираться...

Спасибо:

Maxim

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


IvanB: [ Возможно баг в коннекторе Transaq, будем разбираться...

Понял, спасибо! А как можно будет узнать, когда исправите? или теперь придется ждать релиза новой версии StockSharp API?

Спасибо:

IvanB

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


Maxim:

IvanB: [ Возможно баг в коннекторе Transaq, будем разбираться...

Понял, спасибо! А как можно будет узнать, когда исправите? или теперь придется ждать релиза новой версии StockSharp API?

Всего скорее ждать новой версии

Спасибо:

Maxim

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


IvanB: Возможно баг в коннекторе Transaq, будем разбираться...

Еще по поводу транзака: у меня не получилось воспользоваться свойством ServerTimeDiff (всегда возвращается null), насколько я понял из документации, это разница времени сервера транзак и времени системы.


 if (Trader1.ConnectionState == ConnectionStates.Connected)
            {
                var servTimeDiff = Trader1.ServerTimeDiff;

                TbServerTimeDiff.Text = servTimeDiff.ToString();
                if (servTimeDiff == null)
                {
                    TbServerTimeDiff.Text = "разница ноль!";
                }

            }

Спасибо:

JaguarFX

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


Николай: Присоединяюсь к MenDel, Надо обновить все библиотеки в проекте (либо в каталоге, откуда подключали dll файлы, либо в каталоге Debug, в зависимости от того как подключали) и все будет работать.

Иван, ошибка периодически вылезает снова и снова - постоянно удалять и перезагружать библиотеки это не дело.

Можно вас попросить выложить в общий доступ файл "Abt.Controls.SciChart.Wpf.2.2.pdb" который VisualStudio запрашивает при появлении этой ошибки?

Спасибо:
<< < 4 5 6 

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

loading
clippy