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


Теги:


Спасибо:


<< < 2 3 4 5 6  >
Prival

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


Какую версию библиотеки S# используете? немного не понял вопрос. Там же вроде в проект добавлены все библиотеки. Я ничего не добавлял. Запускал какие есть Скажите какие библиотеки (*.dll) мне посмотреть и как у них определить версию ?

Спасибо:

IvanB

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


Какую версию библиотеки S# используете? немного не понял вопрос. Там же вроде в проект добавлены все библиотеки. Я ничего не добавлял. Запускал какие есть Скажите какие библиотеки (*.dll) мне посмотреть и как у них определить версию ?

Я имею в виду библиотеки S#, эти библиотеки имеют префикс StockSharp.* , например StockSharp.Algo.dll. Посмотреть версию можно, либо в обозревателе файлов Windows, для этого выбираем пункт Свойства -> Подробно и смотрим поле Версия продукта. Можно посмотреть версию с VS, для этого нужно выбрать интересующую библиотеку в обозревателе проекта (каталог References) и в окне Свойств (Properties) смотрим поле Version.

Спасибо:

Prival

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


Все равно что то не то... или я делаю что то не так, прилагаю скрин

если выбираю StockShap.Edu.sln то эти проекты в Обозревателе решений не появляются.

  1. Урок CandlesChartProject появился
  2. Версия StockSharp.Algo 4.1.16.1 версия среды выполнения 4.1.16.1
Спасибо:

IvanB

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


Prival: Все равно что то не то... или я делаю что то не так, прилагаю скрин

если выбираю StockShap.Edu.sln то эти проекты в Обозревателе решений не появляются.

  1. Урок CandlesChartProject появился
  2. Версия StockSharp.Algo 4.1.16.1 версия среды выполнения 4.1.16.1

Техническая ошибка, проверьте, теперь проект CandlesChartProject должен быть в уроке 4.

Спасибо:

Bond

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


UsilaDobry: И таким способом

foreach (var candle in GetHistoryCandles()) { ProcessCandle(null, candle); }

> и таким способом
> ```csharp
GetHistoryCandles().ForEach(ProcessCandle);

история выводится корректно, и свечи и индикаторы, но склейка получается неправильная... например при выводе реальной свечи на 10 минутном графике после свечи 12:10 рисуется свеча 12:45, потом после Finished становится свечой 12:20. Также в месте склейки искажаются индикаторы...На истории индикаторы переходят из одного дня в другой плавно, а в месте склейки идёт явный разрыв значений... Что можно придумать...?

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

Спасибо:

MenDel

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


Всем привет! Столкнулся с проблемой, вылетает ошибка. Сделки выводятся на график, но в любой момент вылетает ошибка.

Код такой же как и в примере. Если убрать эту строчку this.GuiAsync(() => Chart.ProcessCandle(_chartCandleEkement, candle)); то ошибка пропадает, следовательно она возникает при выводе.

И такой нюанс. В примере добавлено using StockSharp.Xaml; А у меня так не работает, пришлось написать using StockSharp.Xaml.Charting; Почему так?


<Window x:Class="TestQuik2014.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:stock="clr-namespace:StockSharp.Xaml.Charting;assembly=StockSharp.Xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="WindowLoaded">
    <Grid>
       
        <Button Content="Candle" Height="23" HorizontalAlignment="Left" Margin="12,213,0,0" Name="button_GetCandles" VerticalAlignment="Top" Width="75" Click="button_GetCandles_Click" Loaded="WindowLoaded" />

        <stock:Chart x:Name="Chart" Margin="104,0,0,0" />
    </Grid>
</Window>
using System;
using Ecng.Collections;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using Ecng.Xaml;
using StockSharp.Algo.Candles;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Xaml.Charting;

namespace TestQuik2014
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private QuikTrader _trader;
        private Security MySecurity {get; set;}

      


        private CandleManager _candleManager;
        private CandleSeries _candleSeries;
        private ChartArea _chartArea;
        private ChartCandleElement _chartCandleEkement;

        


        private void button_GetCandles_Click(object sender, RoutedEventArgs e)
        {
            _chartCandleEkement = new ChartCandleElement();
            _chartArea.Elements.Add(_chartCandleEkement);
            RunProcessGetCandles();

        }

        private void RunProcessGetCandles()
        {
            _candleManager = new CandleManager(_trader);
            var timeFrame = TimeSpan.FromMinutes(1);
            _candleSeries = new CandleSeries(typeof (TimeFrameCandle), MySecurity, timeFrame);

            _candleSeries.ProcessCandle += Draw;
            _candleManager.Start(_candleSeries);
            
        }
       
        private void Draw(Candle candle)
        {
            var candleBounce = ((TimeSpan) candle.Arg).GetCandleBounds(_candleSeries.Security);

            if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounce.Min)
            {            
                this.GuiAsync(() => Chart.ProcessCandle(_chartCandleEkement, candle));
            }
        }

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

        }

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

       
    }
}

И еще вопрос, почему в примере одно окно со свечками, а у меня получилось два, а свечки в нижнем

Спасибо:

Николай

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


Присоединяюсь к MenDel,

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

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

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




P.S. 

При попытке запустить скаченный оригинал, также выдается ошибка: An unhandled exception of type 'System.ArgumentNullException' occurred in mscorlib.dll

И ругается на код: 

```csharp
Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                    {
                        {_chartCandleElement, candle},
                        {_chartIndicatorSmaElement, chartValueSma},
                        {_chartIndicatorMyElement, chartValueMy}
                    })
Спасибо:

IvanB

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


Все должно работать: http://gyazo.com/3702a3a815cdf7cef566ad0f27113aed

Попробуйте следующее: в контекстном меню (прав кнопкой мыши) каталога StockSharp.Edu на tfs выбираем Advanced -> Get Specific Version... и там как на скриншоте, затем Get. http://gyazo.com/ed9dcb73299268e01a446292db534aec

Таким образом мы загрузим последнюю версию файлов с сервера.

Спасибо:

Николай

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


Иван, спасибо за комментарий.

Начал разбираться в своей ошибке, и обнаружил следующее:

        private void GetCandlesClick(object sender, RoutedEventArgs e)
        {
            _chartCandleElement = new ChartCandleElement();
            _chartArea.Elements.Add(_chartCandleElement);
            RunProcessGetCandles();
        }

Это так как должно быть, однако в видео был пропущен момент написания кода:

       
            _chartCandleElement = new ChartCandleElement();
            _chartArea.Elements.Add(_chartCandleElement);         

Т.е. те кто будет писать по уроку код получит следующее:

        private void GetCandlesClick(object sender, RoutedEventArgs e)
        {
                       RunProcessGetCandles();
        }

Возможно это нужно будет пометить в тексте самого урока для пользователей.

Также хотел задать вопрос по коду ConnectionInterFace.Main Можешь скинуть код функции Main, т.к. ты ее применяешь в уроках, для отсоединения, однако в References StockSharp.WpfConnectionInterface не могу найти.

Спасибо:

IvanB

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


Спасибо за замечание. Свойство Main в ConnectionInterFace нам не нужно более, т.к. мы сделали следующее:


        /// <summary>
        /// Событие завершения загрузки данного контрола
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="routedEventArgs"></param>
        void InterFace_Loaded(object sender, RoutedEventArgs routedEventArgs)
        {
            //Получить родительское окно
            var window = Window.GetWindow(Parent);
            if (window != null)
                window.Closed += delegate
                    {
                        if (_safeConnection != null)
                            _safeConnection.DisConnectSafe();
                    };
        }

Тем самым избавились от необходимости идентификации дополнительного свойства.

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

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

loading
clippy