Видео-уроки (основное): Свечи, индикаторы, стратегия, метки, вывод на график
[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# документация)
- Получение свечей из торгового терминала
- Вывод свечного графика Индикаторы (S# документация)
- Создание простого собственного индикатора
- Вывод графика индикатора Стратегия (S# документация)
- Получение заявок и сделок
- Вывод меток заявок и сделок на график Работа с графиком (SciChart)
- Работа с областями графика
- Создание и использование графических элементов Создание модуля для получения исторических данных Создание сборки с получением исторических свечей, отрисовкой графиков и запуском стратегии Выводим свечной график в 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);
}
Comentarios (59)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Увидел в Вас в примере код свойства:
Я бы его написал вот так
А в чем замысел?
Что-то я не пойму, как мне коллекцию свечей из метода GetHistoryCandles(); передать в метод ProcessCandle(CandleSeries series, Candle candle)?.. В уроке метод Draw(Candle), принимает только свечи, а у меня при выводе на график ProcessCandle(CandleSeries series, Candle candle) принимает еще и серию свечей... В моем варианте использовать метод GetHistoryCandles() не получится?
Можно сделать так:
В методе ProcessCandle Вы не используете аргумент CandleSeries series, можно подписаться на получение свечей так: series.ProcessCandle += ProcessCandle; в место этого: _candleManager.Processing += ProcessCandle; и изменить заголовок метода: private void ProcessCandle(Candle candle)
тогда получать свечи можно так:
foreach (var candle in GetHistoryCandles()) { ProcessCandle(candle); }
но я не могу этого сейчас испробовать, поскольку срок на демосервер истек, а новые ключи вчера получил, но они не прокатывают. Написал письмо в техподдержку Квика, пока молчат... Процесс остановился 😀 Наконец-то подключили... Проверил, такой вариант работает, но график индикаторов выводит не корректно...
И таким способом
и таким способом
история выводится корректно, и свечи и индикаторы, но склейка получается неправильная... например при выводе реальной свечи на 10 минутном графике после свечи 12:10 рисуется свеча 12:45, потом после Finished становится свечой 12:20. Также в месте склейки искажаются индикаторы...На истории индикаторы переходят из одного дня в другой плавно, а в месте склейки идёт явный разрыв значений... Что можно придумать...?
foreach (var candle in GetHistoryCandles()) { ProcessCandle(null, candle); }
Если учесть то, что в демо квике данные поступают со сдвигом во времени, и учесть что исторические данные мы качаем реальные, которые были, то тогда становится понятно почему склейка получается "кривая". Т.е. причина в демо данных, которые никак не состыкуются с реальной историей.
foreach (var candle in GetHistoryCandles()) { ProcessCandle(null, candle); }
Добрый день UsilaDobry! Обратил внимание на ваш скриншот. Любопытная реализация приложения. Тестер и работа в риалтайме одновременно. Плюс выделение графика в отдельную вкладку. Очень интересно как вы реализовали очистку графика и отображение подсказок и меток на графике! Если это не большой секрет будет здорово, если вы поделитесь опытом реализации и по возможности фрагментами кода. Спасибо!
А какие ещё темы есть в SciChart.ChartTheme, кроме ExpressionDark? Я искал в документации и на форуме, но ничего не нашёл.
Доступные темы: ExpressionLight, ExpressionDark, BlackSteel, BrightSpark, Chrome, Electric, Oscilloscope
Спасибо.
А как нарисовать на графике свой трейлинг-стоп так, чтобы он ещё и на истории показывался? В Wealth-Lab для этого существует метод PlotStops(), который просто рисует стопы, а я рассчитываю сами значения стопов.
Единственный вариант - сделать свой индикатор, рассчитывающий трейлинг-стоп, так? Такой индикатор будет иметь значение IsFormed, когда есть позиция. То есть он привязан к стратегии. Как лучше это в коде организовать?
И есть ли свойство у ChartIndicatorElement, позволяющее рисовать не линии, а точки, например. Если нет, то как можно это сделать?
Можно использовать метки заявок и сделок. Для отрисовки индикатора можно выбирать стиль, свойство ChartIndicatorElement.DrawStyle, можно попробовать использовать тип ChartIndicatorDrawStyles.Dot для Вашей цели. Можно создать свой графический элемент (метка, аналог метке-заявке или метке-сделке)
Ещё один вопрос. Cледующий код по событию изменения свечки:
Когда придёт новая цена, которая закроет текущую свечку (возвратит ей статуc finished), какая свечка будет считаться текущей: которая получила статус finished или следующая с первой ценой. Ведь по сути эта цена должна уже начать формировать следующую свечку. То есть обращаться к завершившейся свечке нужно будет через индекс 0 (как у меня в коде) или уже через 1? В общем, мне нужно, чтобы как только свечка завершится, её High сравнивался с High предыдущей свечки. Мой код будет правильно работать?
if ((candle.State == CandleStates.Finished) && (_series.GetCandle<Candle>(0).HighPrice > _series.GetCandle<Candle>(1).HighPrice))
Доброго вечера Иван. Столкнулся с такой ошибкой при закачке истории с Финама "Элемент с таким ключом уже был запущен". Такая ошибка у меня появляется, когда я запускаю два графика с историей с разными таймфреймами. Первый график выводит историю и реал корректно, а второй график выдает такую ошибку и выводит только реал... Почему, ведь происходит обращение к сайту Финама для получения свечек с разным таймфреймом...?
Измените класс History на это:
Еще вопрос по обработке исторических свечей. Для того, чтобы обработать свечи с начала торговой сессии и до времени запуска стратегии я использую вот такое условие:
Необходимо получить исторические свечи + свечи с начала торговой сессии и до времени старта стратегии для обработки и определения торговых моделей. А как передать исторические свечи в стратегию?
if (candle.CloseTime <= StartedTime && _parabolic.IsFormed && candle.State == CandleStates.Finished)
Доброго дня!
Пробую добавить вывод реальных свечей от Альфа-коннектора, появляется ошибка "Параметр свечки 00-10-00 неправильный" в строке _candleManager.Start(series); Причем здесь параметр свечки, если в менеджер свечей передается серия свечей, и почему параметр серии 10 минут неправильный?..
Если Вы используете свечи типа TimeFrameCandle, то подобное сообщение говорит о том, что параметр Arg свечи (для типа TimeFrameCandle) имеет тип отличный от TimeSpan.
Действительно, поменял тип серии свечей, вместо TimeFrameCandle указал AlfaTimeFrames в строке
ошибка пропала, но выводятся только исторические свечи, реальные не хотят...
_series = new CandleSeries(typeof(AlfaTimeFrames), security, timeFrame);
Я именно этот пример и пытаюсь доработать. В этом примере выводятся только исторические свечи. А я хочу притулить туда candleManager, но почитав ветку форума AlfaDirect понял, что Аlfa не дружит с candleManager. Видимо по этой причине и пример сделан только с историческими свечами. Я работаю сейчас с библиотекой 4.1.13.2, скачал 4.1.14.1, там пример SampleAlfaCandles нисколько не изменился. Кстати, пример из предыдущей библиотеки работает корректно, а сейчас запустил из новой библиотеки, выдает ошибку обработки данных, при этом код идентичный. Не знаю чем это объяснить... Ну да ладно, меня интересуют больше реальные свечи из Alfa. Я взял вот этот блок вывода исторических свечей
И добавил к нему блок обработки реальных свечей через candleManager
Вроде бы все как учили, но появляется ошибка
Доброго вечера Иван! Может Вы мне подскажете, а то разработчики на форуме заняты более серьезными задачами или мои вопросы слишком глупы...:-) К примеру в Quik мы выводили реальные свечи вот так..., причем реальные свечи получаем с 10-00, а историю можно было получить только за прошлые дни
Из терминала AlfaDirect реальные свечи получаются гораздо проще, при этом историю можно получить вплоть до предпоследней завершенной свечки торговой сессии ```csharp _candleManager = new CandleManager(_trader);
На картинке в начале урока цвета свечей должны быть в точности наоборот. Или поменяйте местами цены открытия и закрытия свечи.
Благодарим за информацию.
Урок №4 если назначить CandlesDownloadUsing запускаемым проектом, то выдается ошибка Ошибка 2 Имя "PendingOrders" отсутствует в текущем контексте ...\StockSharp Lessons\StockSharp.Edu\04_lesson (Candles, Charts, Historical data)\CandlesDownloadUsing\BollingerStrategy.cs 29 79 CandlesDownloadUsing
если строку
return Orders.Count(o => o.State != OrderStates.Done) == 0 && PendingOrders.Count() == 0;
записать вот так return Orders.Count(o => o.State != OrderStates.Done) == 0; // && PendingOrders.Count() == 0;
то запускается.
Причем это единственное что смог запустить в 4-ом уроке. Ни одно решение не запускается. Прикладываю скрин
Какую версию библиотеки S# используете?
Я имею в виду библиотеки S#, эти библиотеки имеют префикс StockSharp.* , например StockSharp.Algo.dll. Посмотреть версию можно, либо в обозревателе файлов Windows, для этого выбираем пункт Свойства -> Подробно и смотрим поле Версия продукта. Можно посмотреть версию с VS, для этого нужно выбрать интересующую библиотеку в обозревателе проекта (каталог References) и в окне Свойств (Properties) смотрим поле Version.
На видео создается проект CandlesChartProject но его нет в исходном коде, там что то другое
Благодарим за замечание, в ближайший день проект появится в доступе.
Все равно что то не то... или я делаю что то не так, прилагаю скрин
если выбираю StockShap.Edu.sln то эти проекты в Обозревателе решений не появляются.
Техническая ошибка, проверьте, теперь проект CandlesChartProject должен быть в уроке 4.
Всем привет! Столкнулся с проблемой, вылетает ошибка. Сделки выводятся на график, но в любой момент вылетает ошибка.
Код такой же как и в примере. Если убрать эту строчку this.GuiAsync(() => Chart.ProcessCandle(_chartCandleEkement, candle)); то ошибка пропадает, следовательно она возникает при выводе.
И такой нюанс. В примере добавлено using StockSharp.Xaml; А у меня так не работает, пришлось написать using StockSharp.Xaml.Charting; Почему так?
И еще вопрос, почему в примере одно окно со свечками, а у меня получилось два, а свечки в нижнем
Присоединяюсь к MenDel,
Выдается ошибка (На видео это время 28:50) :
An unhandled exception of type 'System.ArgumentNullException' occurred in StockSharp.Xaml.dll
Ругается на эту строку: ```csharp Chart.ProcessCandle(_chartCandleElement, candle)
Присоединяюсь к замечанию Mendel и Николая, уже месяц прошел с даты публикации ошибки , но ошибка все равно не исправлена.
У меня VS2012 более подробную информацию об ошибке - проблема в том что, не найдены символы для библиотеки Abt.Controls.SciChart.Wpf.2.2 (см. детали на скрин-шоте).
Иван, ошибка периодически вылезает снова и снова - постоянно удалять и перезагружать библиотеки это не дело.
Можно вас попросить выложить в общий доступ файл "Abt.Controls.SciChart.Wpf.2.2.pdb" который VisualStudio запрашивает при появлении этой ошибки?
Все должно работать: http://gyazo.com/3702a3a815cdf7cef566ad0f27113aed
Попробуйте следующее: в контекстном меню (прав кнопкой мыши) каталога StockSharp.Edu на tfs выбираем Advanced -> Get Specific Version... и там как на скриншоте, затем Get. http://gyazo.com/ed9dcb73299268e01a446292db534aec
Таким образом мы загрузим последнюю версию файлов с сервера.
Иван, спасибо за комментарий.
Начал разбираться в своей ошибке, и обнаружил следующее:
Это так как должно быть, однако в видео был пропущен момент написания кода:
Т.е. те кто будет писать по уроку код получит следующее:
Возможно это нужно будет пометить в тексте самого урока для пользователей.
Также хотел задать вопрос по коду ConnectionInterFace.Main Можешь скинуть код функции Main, т.к. ты ее применяешь в уроках, для отсоединения, однако в References StockSharp.WpfConnectionInterface не могу найти.
Спасибо за замечание. Свойство Main в ConnectionInterFace нам не нужно более, т.к. мы сделали следующее:
Тем самым избавились от необходимости идентификации дополнительного свойства.
Здравствуйте. Не отображается последняя свеча текущего дня и ее изменения (подключение через TransaqConnector). Я использую StockSharp API 4.2.1.7. Подскажите, пожалуйста, что делать...
Код:
Попробуйте обновить время через интернет на вашем компьютере
Не помогло. Пробовал также время на пару минут раньше устанавливать. Черная стрелка с ценой последней сделки вообще отсутствует в области графика.
Тогда попробуйте сделать так:
код выводит абсолютно все свечи, если заработает, то проблема с расхождением времени приходящих свечей и вашего ПК.
То же самое...Не отображается
В проекте Transaq > Sample тоже не выводится текущая свеча. А вот в проекте Quik > SampleCandles все Ok!
Попробуйте так:
при этом заголовок метода Draw нужно изменить:
_candleManager.Processing += Draw;
Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу. Видео подключения по ссылке: http://youtu.be/4OH39uUWuRo
Могу, если надо, видео с экрана куда-нибудь выложить...
Судя по всему в библиотеке StockSharp.Xaml версии 4.1.2.7 уже нет компонента SciChart, о котором рассказывается в видео-уроке. Прошу подсказать какой компонент теперь его заменил, и внести эту информацию в раздел "Изменения в проектах".
Разобрался: необходимо подключать библиотеку StockSharp.Xaml.Charting и использовать элемент Chart.
Один и тот же код нормально работает при подключении через QuikTrader, a при подключении через TransaqTrader не отображает текущую (последнюю) свечу . Возможно, Вы меня не до конца поняли, но график при подключении через Quik изначально нормально выводился, а через Transaq - проблема какая была, такая и осталась... Я какое-то время планирую пользоваться транзаком, поэтому хотелось бы понять, в чем дело.
Может, дело в этом: "Для получения обновлений по выбранному инструменту и тиков необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(Security) соответственно" (п. 6 Примеры работы с Transaq документации по StockSharp)???
Я попробовал добавить методы RegisterSecurity и RegisterTrades в тело метода RunProcessGetCandles() - результат тот же, последней свечи нет!(
Может, дело в этом: "Для получения обновлений по выбранному инструменту и тиков необходимо воспользоваться методами RegisterSecurity(Security) и RegisterTrades(Security) соответственно" (п. 6 Примеры работы с Transaq документации по StockSharp)???
Я попробовал добавить методы RegisterSecurity и RegisterTrades в тело метода RunProcessGetCandles() - результат тот же, последней свечи нет!(
Возможно баг в коннекторе Transaq, будем разбираться...
Понял, спасибо! А как можно будет узнать, когда исправите? или теперь придется ждать релиза новой версии StockSharp API?
Всего скорее ждать новой версии
Еще по поводу транзака: у меня не получилось воспользоваться свойством ServerTimeDiff (всегда возвращается null), насколько я понял из документации, это разница времени сервера транзак и времени системы.