Light Style© by Fisana

Перейти к содержимому


Инвестиционные фонды NordFx: профессиональное управление и прозрачность


NordFX

Фотография

Работа с базами данных FireBird


  • Эта тема закрыта Тема закрыта
15 ответов в этой теме

#1 odin.aleksey

odin.aleksey

    прописался

  • Пользователи ST test (off)
  • PipPipPip
  • 81 сообщений

Опубликовано 17 Декабрь 2009 - 09:59

Уже давно не секрет, что работа с большими объемами данных стала обыденностью для большинства людей. И понятное дело, что эти данные необходимо где-то хранить, как-то извлекать из хранилища, фильтровать, как-то анализировать и т.д.

Профессия трейдера, так или иначе, тесно связана с обработкой огромного количества статистических данных и без умения автоматизировать значительную часть рутинной работы (которая порой "съедает" до 80% всего времени - закон Парето) человек рано или поздно выматывается и/или совсем оставляет свои идеи, наработки, .... (которые зачастую имеют рациональное зерно)!

Так вот весь необходимый инструментарий для работы с большими объемами данных имеют, так называемые, Сервера Управления Базами Данных ( или кратко СУБД )

В этой теме мы будем разбирать работу с Базами Данных от простого к сложному (на примере абсолютно бесплатной СУБД Firebird 1.5)

Результатом нашей работы в этой ветке будет создание базы данных для работы с MT4.
Обновленная версия базы будет периодически выкладываться здесь
"Либо Вы планируете Вашу жизнь сами, либо другие сделают это за Вас!"

#2 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 28 Ноябрь 2010 - 03:23

Программное обеспечение

Для управления базами данных нам понадобится программное обеспечение:


Firebird 1.5
IBExpert
Delphi 7 или старше с пакетом FBLib

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

#3 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 28 Ноябрь 2010 - 05:15

Создание базы данных

Для работы с базой данных необходимо ее сначала создать.

  • Запустите IBExpert. Для простоты работы переключитесь на русский язык (Options\Environment Options - Interface language)
  • Пункт меню База данных\Создать базу ...
  • На форме указываем:

    сервер - локальный
    файл БД - путь к файлу (имя файла укажите MT4.fdb)
    имя пользователя - SYSDBA
    пароль - masterkey
    кодировка - Windows-1251
    зарегистрировать после создания - установлено
    диалект - 3
    все остальные поля ввода оставьте как они введены по-умолчанию

2811.png

после этого нажмите на кнопку ОК

в открывшемся далее окне IBExpert предложит вам выбрать версию сервера. Укажите из выпадающего списка Firebird 1.5 и нажмите ОК

28111.png

База данных после этого должна быть зарегистрирована слева в дереве баз:

2811.png

Делаем двойной клик мышью на нашей базе. После этого надпись базы должна быть подсвеченной жирным шрифтом. Теперь можно приступать к редактированию состава базы данных.

#4 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 02:46

Создание доменов

При разработке базы данных у вас может возникнуть потребность создания доменов. Домен по своей сути - шаблон, в котором будут определены параметры создаваемого поля в таблице базы данных. Если у вас в разных таблицах будут создаваться однотипные поля, то достаточно один раз содать домен с параметрами колонки таблицы и вместо того, чтобы каждый раз задавать вручную параметры колонки - вы просто указываете ранее созданный домен.

1. Выбираем в дереве базы данных Домен, правая кнопка мыши - Новый домен

05.12.png

Далее в правом открывшемся окне указываем:
Имя домена - DATA_CANDLE
Тип - NUMERIC
Длина - 10
Точность - 5
все остальные поля - по-умолчанию.

Параметры введены, делаем запись в базу данных. Любая запись в базе данных - кнопка с желтой молнией на панели инструметов формы:

05.12.png

В появившемся окне жмем на кнопку в правом нижнем углу (Commit). Домен создан.

Таким же образом создаем еще два домена:

Имя домена - SYMBOL
Тип - CHAR
Длина - 6
Не пусто - Истина (т.е. крестик в этом поле)
Кодировка - Win 1251
Колпате (кто-то поленился поискать аналог слова на русском :biggrin: ) - Win 1251

Имя домена - TIMEFRAMES
Тип - CHAR
Длина - 3
Кодировка - Win 1251
Колпате - Win 1251

не забываем делать запись в базу.

#5 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 02:59

Создание таблиц

Теперь наша задача - подготовить таблицы для хранения данных.

Слева в дереве ищем Таблицы - правая кнопка мыши Новая таблица.

05.12.png

В новом откврывшемся окне в поле сверху (отмечено стрелкой) указываем название таблицы - SYMBOLS. В этой таблице будут храниться названия валютных пар.
В табличном поле (выделено прямоугольником)
добавляем новое поле:
название - NAME
домен - SYMBOL (помните, создавали ранее).

Выполняем запись в базу данных.

остальные записи в табличном поле удаляем (например, запись с названием NEW_FIELD).

Аналогично создаем следующие таблицы:
TIMEFRAMES (таймфреймы), в таблицу добавляем два поля:
- Название - NAME, домен - TIMEFRAMES (создавали ранее)
- Название - INTERVAL, тип INTEGER, Не пустое - Истина (крестик в поле)

QUOTATIONS (котировки), в таблицу добавляем поля:
- Название - SYMBOL, домен - SYMBOLS (создавали ранее)
- Название - TIMEFRAME, домен - TIMEFRAMES (создавали ранее)
- Название - DATE_TIME, тип - TIMESTAMP, не пустое - Истина
- Название - C_VOLUME, тип - INTEGER
- Название - C_HIGH, домен - DATA_CANDLE
- Название - C_LOW, домен - DATA_CANDLE
- Название - C_OPEN, домен - DATA_CANDLE
- Название - C_CLOSE, домен - DATA_CANDLE

#6 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 03:54

Создание индексов

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

Например, самой большой по объему таблице будет наша таблица котировок. В таблице будут храниться информативные поля такие как объемы, хай, лоу свечей, цены открытия и закрытия. При этом поля, по которым будет осуществляться поиск - валютная пара, таймфрейм и период.

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

Создаем новый ключ в базе.

Слева в дереве ищем нашу созданную таблицу QUOTATIONS. Двойной клик, закладка Ограничения, на закладке Первичный ключ ПКМ - Новый первичный ключ.
Выбираем поле На поле, указываем значения так, как показано на рисунке.

05.12.png

Нажимаем зеленую "галочку" на панели формы. При закрытии окна с таблицей IBExpert попросит нас подтвердить транзакцию но уже на англиском, соглашаемся, закрываем окно, выходим.

#7 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 04:36

Добавление данных

Данные вручную с базу заполнять долго и не интересно - ведь мы хотим наоборот автоматизировать этот процесс. Так что заполняет котировки за нас это программа, которую мы пишем в другой ветке. Эта программа будет находиться в теле библиотеки, которую мы будем подключать к MT4 и к нашей базе данных.

Но на практике нужно обязательно знать, как при помощи IBExpert можно править данные в базе.

Заполним два наших справочникаа-классификатора, которые очень редко будут менять данные, а точнее это будут справочник валютных пар (SYMBOLS) и таймфреймов (TIMEFRAMES).

В дереве разворачиваем ветку Таблицы, находим таблицу SYMBOLS. Делаем двойной клик мышью. Ищем закладку Данные.
Для управления записями в таблице можно воспользоваться контекстным меню (по правой кнопке) мыши, кнопками, которые расположены на верхней панели формы или горячими клавишами (INS, DEL, ENTER - больше нам не понадобится).

Нажимаем кнопку INS (добавление записи), в поле NAME вводим большими английскими буквами EURUSD. Нажимаем Enter. Все - данные записаны :biggrin:. Просто?
Можете добавить еще те валютные пары, с которыми собираетесь работать. Пусть это будут фунт, йена и франк. В конечном итоге таблица должна принять вот такой вид:

05.12.png

Таким же образом заполняем таблицу таймфреймов, только здесь в поле NAME будем заносить информацию о названии таймфрейма, в поле INTERVAL - числовое значение в минутах. В конечном итоге таблица примет следующий вид:

05.12.png

готовую базу данных можно скачать в начале данной ветки.

Вложенные файлы



#8 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 05:05

Немного о языке запросов

Я не буду Вам рассказывать обо всех тонкостях работы с языком запросов, да Вам это и не нужно. Передо мной стоит немного другая задача - научить вас как быстро и правильно пользоваться механизмами языка не залезая при этом в очень глубокие дебри.

Итак, первое:
- любая база данных, поддерживающая язык запросов всегда работает в режиме обмена информацией с клиентом, т.е. нашим клиенским приложением. Перевожу с русского на понятный: мы ее о чем-то спрашиваем, она нам чего-то отвечает. Как и любая другая база данных наша (т.е. которую мы с вами проектируем) "общаться" будет с нами только на том языке, который она понимает. Таким образом, для того чтобы от базы получить интересующую нас информацию, мы должны знать тот минимум языка запросов, чтобы база нас понимала, ну а мы - ее.

Итак:
1. Запрос (т.е. обращение к базе данных) имеет текст. Текст представляет собой набор параметров и директив на английском языке. Не пугайтесь названий: директива - это специальная команда, которая понятна базе, параметр (он и в Африке параметр :biggrin: ) - значения, которые будут использованы в запросе. В начале запроса будет стоять главная директива, т.е. команда, которую будет выполнять база данных. Мы будем использовать четыре:

SELECT - обращение к базе данных с целью получения выборки, т.е. данных из базы
INSERT - добавление записей в таблицу
UPDATE - обновление существующих записей таблицы
DELETE - удаление записей из таблиц

2. В случае выполнения запроса база данных всегда нам должна что-то вернуть. В случае ошибки выполнения запроса база данных нам вернет код ошибки, в случае если запрос корректен база данных вернет количество записей в выборке и/или таблицу с данными (recordset - в случае использования директивы SELECT) или количество записей, над которыми база данных совершила действие (в случае выполнения остальных трех директив).

3. После директивы в запросе указывается для какой таблицы и каких полей выполняется обращение к базе данных, можно задать дополнительные фильтры).

Ниже мы подробно рассмотрим несколько примеров.
Советую воспользоваться открытым IBExpert, для того чтобы увидеть как это работает. Для этого в главном меню выбираем Инструменты - SQL Редактор. В результате открывается окно редактора, после ввода текста запроса не забываем нажимать кнопочку на панели инструментов формы редактора - она обозначена зеленым треугольником (или кнопку F9, что означает одно и тоже - Выполнить запрос).

#9 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 05:23

Язык запросов, пример №1

Переходим в окно редактора, набираем следующий текст:

select NAME from SYMBOLS

Жмем F9, в результате нас IBExpert отправит на закладку "Результаты":

05.12.png

О чем мы попоросили базу данных?
Выбери (SELECT) поле названий валютных пар (Name) из таблицы (FROM) SYMBOLS.
В случае, если нам необходимо обратиться к таблице и получить значения не одного а некскольких полей таблицы - то эти поля указываются через запятую, например:

select SYMBOL, VOLUME from QUOTATIONS

Таким образом можно получать необходимые данные из базы - проще некуда:
после SELECT указываем названия полей через запятую,
после FROM - название таблицы, где хранятся данные.

При этом необязательно указывать все поля, которые требуется через запятую.
Возвращаемся на закладку "Редактор", стираем старый запрос. Пишем новый:

select * from quotations

F9

в результате на закладке Результат наблюдаем в выборке все поля, которые мы создавали в таблице истории котировок:

05.12.png

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

#10 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 05:39

Язык запросов, пример №2

Создаем запрос с условием:

select * from timeframes
where name = 'M1'

F9

Во как! в запросе появилась новая директива WHERE (если на русский перевести - "когда"). То есть выборка из таблицы таймреймов произошла по условию, где в возвращаемую таблицу должны попасть только те записи, у которых поле NAME должно быть равно 'M1'.

Обращаю ваше внимание: что вы у базы попросите, то она вам и вернет. Слудующие моменты в синтаксисе запросов:
- на примере 'M1' - строковый параметр, должен быть заключен в апострофы, то же самое касается и параметров типа DATE (т.е. дата)
- при вводе строковых параметров не забывайте о регистре в котором вы вводите значение фильтра, т.е. например при изменении строки условия на:
where name = 'm1'
база данных вам вернет пустую выборку (можете убедиться самостоятельно). То же самое касается еще и кодировки (RU/EN), на которой вы вводите строковые параметры.
- числовые параметры вводятся без дополнительных символов, в следующем примере это будет продемонстрировано:

select * from timeframes
where interval > 1 and interval <= 10800

F9

вот результат работы запроса:

05.12.png

почти все то же самое, только условие усложнилось и добавилась новая директива and (по-русски - логическое И). Эта директива сообщает базе, что выборку по таблице таймфреймов записи которой удовлетворяют условию: больше 1 и меньше либо равно 10800.

#11 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 05:57

Язык запросов, пример №3

Усложняю SELECT и на этом пока остановлюсь.

select * from quotations
where date_time > '2010.01.01'
order by symbol, date_time

F9

Ничего нового мы для себя на закладке Результат не увидим, но это только пока. Нам важно другое: в запросе появилась новая директива order. Директива выполняет функцию упорядочивания записей в выборке, так как возвращать база данных будет записи как бог на душу положит, и не факт - что в нужном нам порядке. После применения директивы order в таблице будет упорядочивание запесей по содержимому полей symbol, date_time (т.е. валютной паре и дате в истории котировок).
На то что в запросе указана фильтрация данных - уже не заостряю ваше внимание, тут и так все понятно. Если нет - задавайте вопросы.

#12 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 06:30

Язык запросов, пример №3

С выборкой данных разобрались. Учимся добавлять данные.

insert into quotations(symbol, c_volume, c_high, c_low, c_open, c_close, date_time, timeframe)
values ('EURUSD', 10195, 1.37748, 1.36442, 1.36690, 1.37541, '2010.02.16 16:00', 'H4')

F9

я думаю, комментарии излишни - в таблицу истории котировок добавлены данные по свече на H4 на 16 февраля 2010 16:00. Снизу в окне мелкими буквами по-английски видим:

1 record(s) was(were) inserted into QUOTATIONS ...

и чего-то там еще ниже. Нам дальше-то и не нужно - главное, что запись добавилась! Перед тем как проверить, что запись действительно уже есть в таблице нажимаем подтверждение транзакции (вот же название :biggrin: ) - зеленую "галочку", а то иначе ничего не выйдет. Далее соглашаемся над тем, что мы действительно отдаем себе отчет в том что делаем, жмем Да в маленьком окошке.
Находим в дереве слева нашу таблицу Quotations, двойной клик, закладка Данные - запись в наличии. Если записи не видно - и такое бывает. Закрываем все окна, открываем снова - должно появиться.

Возвращаемся в окно редактора запросов, нажимаем снова на F9. А вот теперь ошибку выдает нам IBExpert. К чему бы это :blink:? А это - результат работы нашего первичного ключа PK_QUOTATIONS который мы для таблицы создавали - не дает нам база данных создать такую же запись для валютной пары за тот же период. И это хорошо - и даже теперь если мы ошибемся, то база данных вовремя об этом скажет.

#13 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 06:54

Язык запросов, пример №4

Добавлять научились, а теперь редактируем существующую запись.

update quotations set   c_volume = 10185,
                        c_high = 1.37748,
                        c_low = 1.36442,
                        c_open = 1.36690,
                        c_close = 1.37541
where symbol = 'EURUSD' and timeframe = 'H4' and date_time='2010.02.16 16:00'

F9, зеленая "галочка", подтверждаем транзакцию, смотрим результаты работы запроса на закладке Данные (если до этого форма была открыта - Refresh на панели инструментов с данными). Обновились данные, отлично (в данном случае -изменился объем на свече).

#14 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 07:02

Язык запросов, пример №5

Добавлять умеем, редактировать тоже, а теперь удаляем.

delete from quotations
where symbol = 'EURUSD'

F9, .....

Комментирую работу запроса: удаление из истории котировок всех данных по евро.

Рекомендую очень аккуратно пользоваться запросом DELETE т.к. в случае ошибочного условия фильтрации данных запрос вам удалит лишние данные из таблицы, а восстанавливать удаленное - всегда сложно, а иногда и невозможно.

#15 joe2009

joe2009

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 127 сообщений

Опубликовано 05 Декабрь 2010 - 07:28

Процедуры

Пользоваться запросами очень удобно, но только иногда слишком длинные и неудобные они бывают, и при этом их читать не всегда удобно. Чего было-бы проще - сказал базе данных какое-нибудь коротенько слово и передал туда несколько параметров. Такая возможность есть - объявить процедуру, добавить в нее длинный текст запроса, а потом ее вызывать.

Создаем новую процедуру. В дереве в левом окне выделяем Процедуры ПКМ - Новая процедура.

Справа вверху указываем имя DELETE_HISTORY_BYSYMBOL.

в таблице параметров процедуры добавляем новый параметр D_SYMBOL в качестве типа указываем домен SYMBOL.

в теле процедуры пишем код:

begin

    delete from quotations
    where symbol = :D_SYMBOL;

end

нажимаем на CTRL+F9 (или кнопка с желтой молнией), при выходе на экран сообщения нажимаем Commit:

05.12.png

Теперь процедура есть, осталось ее использовать. Открываем окно с редактором запросов, пишем:

execute procedure DELETE_HISTORY_BYSYMBOL 'EURUSD'

F9, ....

Данные в таблице истории котировок по евро удалены.
С этого момента мы начинаем нарабатывать нашу базу данных на пример наполнения ее нужного нам для использования в дальнейшем функционала. В начале данной ветки будет выложена конечная версия используемой нами база данных.




Посетителей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных пользователей

Рейтинг брокеров форекс: кто лидер, кто аутсайдер и почему?




Masterforex-V NordFX

Rambler's Top100

Принимаем Z-Payment