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


Урок 7. Сохранение и накопление данных
Atom
18.06.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,

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

Теги:


Спасибо:


1 2 3  > >>
Prival

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


Осталась куча вопросов.
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. У меня есть знакомый который торгует через плазу. Могу ли я настроить гидру у него (как это сделать)? Будет ли она (гидра) мешать его работе ? как мне подключаться к его компьютеру для получения скачанных данных ?
Спасибо:

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

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


Prival Перейти
Осталась куча вопросов.

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

Prival Перейти

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


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

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

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

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


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

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

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

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

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

Prival Перейти

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


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

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

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

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

Prival Перейти

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

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

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

Prival Перейти

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

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

Prival Перейти

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

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

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

Prival Перейти

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

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

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

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

Prival Перейти

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

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

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


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

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

Prival

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


Поясните тогда эти ошибки (приведены на скринах). Поясняю свои действия
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 (минутки,а внутри минутки все имитируется ( моделируются)) и т.д. и т.п.
Спасибо:

pft_man

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


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

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

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

Код

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



error.jpg 38 KB (381)
Спасибо:

IvanB

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


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

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

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

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

Код

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


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

Connection.SafeConnection.Trader.NewMyTrades += mytrades => this.GuiAsync(() =>
                                            _storageRegistry.GetTradeStorage(Connection.SelectedSecurity).Save(mytrades.ToList())); 
Спасибо:

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

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


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

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


Prival Перейти

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


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


Prival Перейти

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

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

Prival Перейти

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

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

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

pft_man

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


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

Код

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

Код

IMarketDataStorage<OrderTraceItem> GetOrderTraceStorage(
	Security security
)



Спасибо:

pft_man

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


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

Moadip

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


Prival Перейти
Поясните тогда эти ошибки (приведены на скринах). Поясняю свои действия
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.
Цитата:
Это как ….так не бывает
Бывает. Цифры, это не сколько сохранено, а сколько выкачено.
Допустим по какому то инструменту было выкачано 100к сделок. Они сохранились. Потом опять выкачиваются эти данные. Так вот цифры будут показывать сколько было выкачено, но сохранено будет по прежнему 100к сделок, дублей не будет.
Спасибо:

pft_man

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


IvanB Перейти

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

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


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

Код

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


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

Код

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


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

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

loading
clippy