Урок 7. Сохранение и накопление данных


Урок 7. Сохранение и накопление данных
Atom
6/18/2013


Видео-уроки:
Hydra (S#.Data) основные моменты

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

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


    • Работа с Гидрой (S#.Data)
    • Получение данных через Гидру
    • Использование полученных данных в своем проекте



Полезные ссылки:
Документация по S#.Data
Создание своего источника для S#.Data,

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



Thanks:


1 2 3  > >>
Prival

Avatar
Date: 7/17/2013
Reply


Осталась куча вопросов.
1. Почему в видео шаг RIM3 установлен 1, и автора это устраивает …. а меня нет, не устраивает шаг вроде бы 10. Почему для лектора это нормально ? За что отвечает этот параметр ? если я введу туда 5134675912, это тоже устроит ?
2. Если качать с финама склеенный фьючерс РТС, какой шаг устанавливать ? до сентября 2012 был 5, сейчас 10
3. Есть куча источников. Поясните все равно откуда качать или есть разница ? К примеру фьючерс РТС (могу качать через Quik, финам, RTS и плазу). Через что лучше это делать ?
4. Как правильно настроить серверный режим….(что куда писать, прописывать и т.д.) + как потом этим пользоваться ?
5. Что такое Анонимно – что за настройка ? что она делает ? анонимно деньги тырит с моего счета или еще что-то ?
6. Как правильно склеивать фьючерс, покажите пример. Их склеивать можно по разному, как сделано это в программе ?
7. В настройке источника финама есть игнорировать ошибки ? что это за ошибки ? их целая куча там идет, зачем Вы все время приводите финам…неужели FTP сервер биржи еще хуже ?
8. В хелпе http://stocksharp.com/do...e-86e2-bcec2e0bc55f.htm где склеивание есть столбец (…. Ласты) что это такое (мы не экстрасенсы… )? чем они отличаются от сделок ? откуда они качаются ? как выглядят и т.д.
9. Что за источник S#.Data Server ?
10. Есть ли сервер который уже давно собирает эти данные (не вериться что никто это не делает), где есть ордер лог, стаканы и т.д. Обязательно всем нужно собирать самим ?
11. У меня есть знакомый который торгует через плазу. Могу ли я настроить гидру у него (как это сделать)? Будет ли она (гидра) мешать его работе ? как мне подключаться к его компьютеру для получения скачанных данных ?
Thanks:

Самунджян Артем

Avatar
Date: 7/17/2013
Reply


Prival Go to
Осталась куча вопросов.

Спасибо за Ваши вопросы! Пишите, мы только за то, чтобы убрать все пробелы.

Prival Go to

1. Почему в видео шаг RIM3 установлен 1, и автора это устраивает …. а меня нет, не устраивает шаг вроде бы 10. Почему для лектора это нормально ? За что отвечает этот параметр ? если я введу туда 5134675912, это тоже устроит ?


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

проект данных

Когда мы качаем данные с финама, то финам не предоставляет данных о минимальном шаге, поэтому автоматически подставляется единица.
Prival Go to

2. Если качать с финама склеенный фьючерс РТС, какой шаг устанавливать ? до сентября 2012 был 5, сейчас 10


Да, тут нужно очень осторожно подходить к решению этого вопроса. Можно поставить шаг 10 и пожертвовать результатами тестирования, хотя если система долгосрочная, то это не так сильно повлияет на её результаты. Второй вариант - разделить склеенный фьюч на два 1) Где шаг равен 5 и 2) где шаг равен 10. В дальнейшем делать раздельный тестинг
Prival Go to

3. Есть куча источников. Поясните все равно откуда качать или есть разница ? К примеру фьючерс РТС (могу качать через Quik, финам, RTS и плазу). Через что лучше это делать ?

Дело в том, что качать легче всего через самый простой и надежный источник. Таковым является финам. Я рассмотрю здесь нюансы каждого источника:
1)Quik -> Если сохранять стаканы, в таком случае гидра должна работать постоянно + не получиться запустить робота, потому что Quik поддерживает только одно подключение (особенности DDE сервера). Если сохранять сделки, то гидру (S#.Data) нужно будет запускать один раз в день (в конце дня), так как квик сам сохраняет сделки на один день. Не очень удобно, потому что постоянно должно что-то работать.

2)Финам -> Можно качать сделки, когда угодно. То есть один раз включили, она ни с кем не конфликтует. Не хранит стаканы, можно закачивать готовые свечки. По сути самый удобный источник. РТС источник также работает, но там, чтобы получить список инструментов придется скачивать по каждой сделки с каждого инструмента (опять же не совсем удобно, а данные точно такие же).

3)Плаза-> Неплохой вариант, не конфликтует с роботом. Может одновременно и то и то работать. Плазу имеет смысл
использовать, только если Вы собираетесь сохранять то, чего нет у финама (Ордер лог, стаканы к примеру).

Prival Go to

4. Как правильно настроить серверный режим….(что куда писать, прописывать и т.д.) + как потом этим пользоваться ?


Серверный режим Гидры, это когда одна программа запущена как сервер (скачивает данные с источников), а другие экземпляры Гидры подключаются к серверу и тянут из нее загруженные данные. Чтобы это работало надо сделать следующее:

Меню Дополнительно -> Настройки… здесь выставить галочку Серверный режим. Это будет Сервер.

Запускаем на другом ПК гидру и настраиваем ее как клиент, для этого находим источник S#.Data Server, переходим в его настройки и там указываем параметры для подключения к серверной Гидре: адрес к серверу, при необходимости логин и пароль.

Это основные настройки, необходимые для создания схемы Сервер-Клиент на Гидре.

Prival Go to

5. Что такое Анонимно – что за настройка ? что она делает ? анонимно деньги тырит с моего счета или еще что-то ?

Если бы...(деньги тырит) [biggrin]

Если выставлена опция Анонимно, то к этому серверу для доступа не нужно указывать логин/пароль, в противном случае, необходимо указывать логин/пароль учетной записи Windows, где запущен Сервер Гидры.

Prival Go to

6. Как правильно склеивать фьючерс, покажите пример. Их склеивать можно по разному, как сделано это в программе ?

Тут нам можем помочь документация

Prival Go to

7. В настройке источника финама есть игнорировать ошибки ? что это за ошибки ? их целая куча там идет, зачем Вы все время приводите финам…неужели FTP сервер биржи еще хуже ?

В третьем вопросе пояснил. В сохранении данных должен признаться, что финам лучше всех. Поэтому его все и используют.

В логах отображаются не только ошибки, но и предупреждения, информационные сообщения.
Опция Игнорировать ошибки заставляет Гидру не обращать внимание на ошибки и выполнять следующие действия.

Prival Go to

8. В хелпе http://stocksharp.com/do...e-86e2-bcec2e0bc55f.htm где склеивание есть столбец (…. Ласты) что это такое (мы не экстрасенсы… )? чем они отличаются от сделок ? откуда они качаются ? как выглядят и т.д.

Ласты – это Top of book, т.е. лучшие цены (bestask и bestbid стакана). Это совсем не сделки. Скачиваются из источника данных.
Prival Go to

9. Что за источник S#.Data Server ?

Источник – серверный вариант гидры на другом ПК.

Prival Go to

10. Есть ли сервер который уже давно собирает эти данные (не вериться что никто это не делает), где есть ордер лог, стаканы и т.д. Обязательно всем нужно собирать самим ?

Есть, но он предоставляет только демо данные. Сервер, который будет сохранять данные планируем настроить (ол, стаканы, сделки).
Prival Go to

11. У меня есть знакомый который торгует через плазу. Могу ли я настроить гидру у него (как это сделать)? Будет ли она (гидра) мешать его работе ? как мне подключаться к его компьютеру для получения скачанных данных ?


Да, все верно. Можно поставить её, она совсем не будет конфликтовать с роботом.

Но для этого необходимо иметь соответствующие технические возможности, как минимум надо чтобы у ПК где стоит Гидра-сервер был белый IP адрес, а также настроены сетефой экран и т.п. Вы же хотите через интернет подключаться, если я правильно понял.
Снимок.PNG 7 KB (860)
Thanks:

Prival

Avatar
Date: 7/20/2013
Reply


Поясните тогда эти ошибки (приведены на скринах). Поясняю свои действия
1. Дата начала скачивания во всех случаях одинакова 17.09.2012
2. Начинаю скачивать с Финам дает ошибки и останавливается рис.1

3. Начинаю качать с RTS работает без ошибок (лог чистый) рис.2.

Что требует пояснения. Исхожу из вашего заявления что все одинаково, разницы нет....
1. Что означает ошибка не соответствие шагу цены ? Неужели сделки по RIH3 могут быть не кратны 10…
2. Почему при скачивании РТС этих ошибок нету ? (Варианты - либо разные данные, либо Гидра их обрабатывает по разному(надеюсь одинаково)). Оба варианта плохи, первый это как в Форексе у каждой кухни свои котировки, что на бирже вроде не возможно ( я до сего момента был уверен в этом ^-)) либо одно из двух…либо стог сена, либо вилы … ^-)
3. Количество сделок к одному и тому же моменту времени (12/14/2012 последняя сделка) отличается в разы. Финам 600 тыс (рис.1), RTS 5 мил (рис.2). Это как ? Поясните что означает последняя сделка, то что все до этого момента закачано…или еще что то ?
4. А это как и почему рис.2

RIH3-3.13 сделок 5 323 тыс. RIU3-9.13 сделок 10 949 тыс – это что по ближнему контракту сделок в 2 раза меньше чем по дальнему ? Это как ….так не бывает

З.Ы. Заранее спасибо за ответы. Прежде чем тестировать всегда нужно решить вопрос данных. Вы великолепно постарались решить этот вопрос, хранить самые подробные данные. Но есть еще вопрос качества этих данных, зашумленная синусойда, реальные данные в которых есть шпильки по 10 000 пунктов (или как в MetaTrader 5 (минутки,а внутри минутки все имитируется ( моделируются)) и т.д. и т.п.
Thanks:

pft_man

Avatar
Date: 7/21/2013
Reply


Добрый день. Я хочу, чтобы при следующем запуске приложения (например, на следующий день) в стратегию загрузились все сделки, совершённые раньше, и рассчиталась текущая позиция по стратегии. В связи с этим возникли два вопроса.

1. Это можно сделать через метод стратегии ProcessNewOrders, но в него подаются ордера. Можно ли сделать хранилище ордеров? Я нашёл GetOrderTraceStorage, но он сохраняет историю изменений по ордеру. Можно ли как-то потом эту историю изменений превратить в ордера, которые потом передать в метод ProcessNewOrders?

2. Попробовал реализовать это через хранилище сделок, в которое я сохраняю только свои сделки. Но возникает ошибка.

Code

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                                            _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades)); 



error.jpg 38 KB (381)
Thanks:

IvanB

Avatar
Date: 7/22/2013
Reply


pft_man Go to
Добрый день. Я хочу, чтобы при следующем запуске приложения (например, на следующий день) в стратегию загрузились все сделки, совершённые раньше, и рассчиталась текущая позиция по стратегии. В связи с этим возникли два вопроса.

1. Это можно сделать через метод стратегии ProcessNewOrders, но в него подаются ордера. Можно ли сделать хранилище ордеров? Я нашёл GetOrderTraceStorage, но он сохраняет историю изменений по ордеру. Можно ли как-то потом эту историю изменений превратить в ордера, которые потом передать в метод ProcessNewOrders?

Те ордера, которые Вы сохраняете через метод Save, будут доступны через метод Load. Вы пишите, что Вам надо сохранять сделки, то, думаю, этот вариант Вам не подходит, в данном случае следует воспользоваться хранилищем сделок, которое возвращается по методу GetTradeStorage(), что Вы и делали в пункте 2.
pft_man Go to

2. Попробовал реализовать это через хранилище сделок, в которое я сохраняю только свои сделки. Но возникает ошибка.

Code

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                                            _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades)); 


Массив mytrades надо привести к интерфейсу IEnumerable, этот интерфейс реализовывается в классе List<>, поэтому можно через метод ToList() преобразовать массив в список List<>. В результате будет выглядеть так:
Code

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                                            _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades.ToList())); 
Thanks:

Самунджян Артем

Avatar
Date: 7/22/2013
Reply


Prival Go to
Поясните тогда эти ошибки (приведены на скринах).
1. Что означает ошибка не соответствие шагу цены ? Неужели сделки по RIH3 могут быть не кратны 10…

Скорее всего там что-то напутали с различными инструментами. То есть одни скачаны с ртс, другие с финама и Вы не заметили с каким именно Вы работаете. Поэтому я советую сделать так
  1. Скопировать скачанные Вами данные (забекапить их)
  2. Почистить папку Мои документы/StockSharp/Hydra (там все настройки лежат)
  3. Запустить гидру и поработать только с одним источником
  4. Проверить все ли нормально -> если нет, то пришлите нам логи, мы уже по ним более подробно разберемся


Prival Go to

2. Почему при скачивании РТС этих ошибок нету ? (Варианты - либо разные данные, либо Гидра их обрабатывает по разному(надеюсь одинаково)). Оба варианта плохи, первый это как в Форексе у каждой кухни свои котировки, что на бирже вроде не возможно ( я до сего момента был уверен в этом ^-)) либо одно из двух…либо стог сена, либо вилы … ^-)


Разных данных там точно нет. За исключением только того, как оба эти источника сохраняют рыночные данные. К примеру, в одном источнике могут быть внебиржевые сделки, а в другом нет.


Prival Go to

3.Количество сделок к одному и тому же моменту времени (12/14/2012 последняя сделка) отличается в разы. Финам 600 тыс (рис.1), RTS 5 мил (рис.2). Это как ? Поясните что означает последняя сделка, то что все до этого момента закачано…или еще что то ?

«Последняя сделка», содержит дату последней полученной сделки, не гарантируется, что данные поступают последовательно по значению времени.

Prival Go to

RIH3-3.13 сделок 5 323 тыс. RIU3-9.13 сделок 10 949 тыс – это что по ближнему контракту сделок в 2 раза меньше чем по дальнему ? Это как ….так не бывает

В Вашем случае, по RIH3 не все данные загружены.

В любом случае я советую разобраться с одним источником.
Thanks:

pft_man

Avatar
Date: 7/22/2013
Reply


Спасибо. На самом деле задача - сделать так, чтобы при запуске приложения стратегия знала своё состояние на момент последней работы (например, при выключении на ночь). То есть, чтобы текущая позиция, сделки, PnL попали в запускаемую стратегию.
В документации я нашёл метод ProcessNewOrders, который и показался мне оптимальным для этой цели - загружаем в стратегию ордера, а всё остальное рассчитывается автоматически. Но этот метод принимает на вход ордера, а хранилище можно сделать только из OrderTraceItem. Можно ли как-то потом OrderTraceItem превратить в Order? Или всё-же как-то можно сделать хранилище ордеров Order?

Code

protected virtual IEnumerable<Order> ProcessNewOrders(
	IEnumerable<Order> newOrders,
	bool isStopOrders

Code

IMarketDataStorage<OrderTraceItem> GetOrderTraceStorage(
	Security security
)



Thanks:

pft_man

Avatar
Date: 7/22/2013
Reply


А, кажется, нашёл. У класса OrderTraceItem есть свойство Order. Попробую вечером.
Thanks:

Moadip

Avatar
Date: 7/22/2013
Reply


Prival Go to
Поясните тогда эти ошибки (приведены на скринах). Поясняю свои действия
1. Дата начала скачивания во всех случаях одинакова 17.09.2012
2. Начинаю скачивать с Финам дает ошибки и останавливается рис.1

3. Начинаю качать с RTS работает без ошибок (лог чистый) рис.2.

Что требует пояснения. Исхожу из вашего заявления что все одинаково, разницы нет....
1. Что означает ошибка не соответствие шагу цены ? Неужели сделки по RIH3 могут быть не кратны 10…
2. Почему при скачивании РТС этих ошибок нету ? (Варианты - либо разные данные, либо Гидра их обрабатывает по разному(надеюсь одинаково)). Оба варианта плохи, первый это как в Форексе у каждой кухни свои котировки, что на бирже вроде не возможно ( я до сего момента был уверен в этом ^-)) либо одно из двух…либо стог сена, либо вилы … ^-)
3. Количество сделок к одному и тому же моменту времени (12/14/2012 последняя сделка) отличается в разы. Финам 600 тыс (рис.1), RTS 5 мил (рис.2). Это как ? Поясните что означает последняя сделка, то что все до этого момента закачано…или еще что то ?
4. А это как и почему рис.2

RIH3-3.13 сделок 5 323 тыс. RIU3-9.13 сделок 10 949 тыс – это что по ближнему контракту сделок в 2 раза меньше чем по дальнему ? Это как ….так не бывает

З.Ы. Заранее спасибо за ответы. Прежде чем тестировать всегда нужно решить вопрос данных. Вы великолепно постарались решить этот вопрос, хранить самые подробные данные. Но есть еще вопрос качества этих данных, зашумленная синусойда, реальные данные в которых есть шпильки по 10 000 пунктов (или как в MetaTrader 5 (минутки,а внутри минутки все имитируется ( моделируются)) и т.д. и т.п.


1. То и значит, может и не быть, все зависит от того какие данные пришли. Нормальные или кривые. Финам это не эталон, и бывает приходят битые данные.
2. Не факт, может и на РТС такая же ошибка быть. Почему? п.1. Данные от любого источника обрабатываются одинаково.
3. По финаму выкачивается конкретный инструмент. Соответственно и цифра выкачанных сделок будет соответствующая. С РТС нет возможности выкачать конкретный инструмент. Выкачиваются все данные за день. Поэтому и цифры в разы больше.
Последняя сделка(как и последний стакан, последнее изменение и т.д.) это последнее значение которое сохранено. Допустим включал гидру неделю назад, включил сегодня, и сразу видно, до какого числа(времени) есть данные.
4.
Quote:
Это как ….так не бывает
Бывает. Цифры, это не сколько сохранено, а сколько выкачено.
Допустим по какому то инструменту было выкачано 100к сделок. Они сохранились. Потом опять выкачиваются эти данные. Так вот цифры будут показывать сколько было выкачено, но сохранено будет по прежнему 100к сделок, дублей не будет.
Thanks:

pft_man

Avatar
Date: 7/23/2013
Reply


IvanB Go to

Массив mytrades надо привести к интерфейсу IEnumerable, этот интерфейс реализовывается в классе List<>, поэтому можно через метод ToList() преобразовать массив в список List<>. В результате будет выглядеть так:
Code

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                                            _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades.ToList())); 


На самом деле, MyTrades содержит Order и Trade, а метод Save принимает только Trade. Правильнее будет вот так.

Code

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                    {
                        _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades.Select(t => t.Trade).ToList());
                    });


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

Code

((LocalMarketDataDrive)_storageRegistry.DefaultDrive).Path = @"С:\History"; // изменяем путь, используемый по умолчанию
((LocalMarketDataDrive)_storageRegistry.DefaultDrive).UseAlphabeticPath = true; // используем алфавитное хранилище


Помогите, пожалуйста, добить эту тему, а то никак не получается загрузить прошлую информацию в стратегию.
error.jpg 41 KB (396)
Thanks:
1 2 3  > >>

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy