Урок 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);
        }


Теги:


Спасибо:


<< < 3 4 5 6  >
Maxim

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


Здравствуйте. Не отображается последняя свеча текущего дня и ее изменения (подключение через TransaqConnector). Я использую StockSharp API 4.2.1.7. Подскажите, пожалуйста, что делать...

Код:

 
private void RunProcessGetCandles()
        {
            _candleManager = new CandleManager(interFace.SafeConnection.Trader);
            var security = interFace.SelectedSecurity;
            var timeFrame = TimeSpan.FromMinutes(5);
            _candleSeries = new CandleSeries(typeof (TimeFrameCandle), security, timeFrame);
            _candleSeries.ProcessCandle += Draw;
            _candleManager.Start(_candleSeries);
        }

        private void Draw(Candle candle)
        {
            var candleBounds = ((TimeSpan) candle.Arg).GetCandleBounds(_candleSeries.Security);
            if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
            {
                this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
            }
            
        }

        private void InitChart()
        {
            Chart.IsAutoScroll = true; 
            _chartArea = new ChartArea();
            Chart.Areas.Add(_chartArea);
            _chartCandleElement = new ChartCandleElement();
            _chartArea.Elements.Add(_chartCandleElement);
        }

        private void WindowLoaded(object sender, RoutedEventArgs e)
        {
            InitChart();
        }

MainWindow.xaml.cs 2 KB (545)
Спасибо:

IvanB

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


Попробуйте обновить время через интернет на вашем компьютере

Спасибо:

Maxim

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


IvanB: Попробуйте обновить время через интернет на вашем компьютере

Не помогло. Пробовал также время на пару минут раньше устанавливать. Черная стрелка с ценой последней сделки вообще отсутствует в области графика.

Спасибо:

IvanB

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


Maxim:

IvanB: Попробуйте обновить время через интернет на вашем компьютере

Не помогло. Пробовал также время на пару минут раньше устанавливать. Черная стрелка с ценой последней сделки вообще отсутствует в области графика.

Тогда попробуйте сделать так:


        private void Draw(Candle candle)
        {
            this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle)); 
        }

код выводит абсолютно все свечи, если заработает, то проблема с расхождением времени приходящих свечей и вашего ПК.

Спасибо:

Maxim

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


Тогда попробуйте сделать так: Код:

    private void Draw(Candle candle)
    {
        this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
    }

код выводит абсолютно все свечи, если заработает, то проблема с расхождением времени приходящих свечей и вашего ПК.

То же самое...Не отображается

Спасибо:

Maxim

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


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

Спасибо:

Maxim

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


Могу, если надо, видео с экрана куда-нибудь выложить...

Спасибо:

IvanB

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


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

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


_candleManager.Processing += Draw;

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


private void Draw(CandleSeries series, Candle candle)

Спасибо:

JaguarFX

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


Судя по всему в библиотеке StockSharp.Xaml версии 4.1.2.7 уже нет компонента SciChart, о котором рассказывается в видео-уроке. Прошу подсказать какой компонент теперь его заменил, и внести эту информацию в раздел "Изменения в проектах".

Разобрался: необходимо подключать библиотеку StockSharp.Xaml.Charting и использовать элемент Chart.

Спасибо:

JaguarFX

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


Николай: Присоединяюсь к 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 (см. детали на скрин-шоте).

S#ChartError-1.jpg 318 KB (596)
Спасибо:
<< < 3 4 5 6  >

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

loading
clippy