Как хранит свои данные Metastock 7.0 .

Существует такая программа разработанная фирмой Equis называется Metastock. Основная идея программы заключается в том, что она получает из интернета данные по котировкам какого-либо инструмента (валюты, акции или индекса) и отображает их в специализированном виде (биржевом графике). Причем надо заметить, что сам метасток с интернетовским сервером не связывается (этого в нем не заложено), за него это делают другие программы (downloader’ы, vendor’ы), а связано это с тем, что люди работают с разными брокерами, а каждый брокер “отдает” информацию по котировкам по-своему.

Ну а поскольку метасток у всех один, то все лоудеры должны сохранять эту информацию так как это надо метастоку.

Хранятся эти данные, как правило, в отдельной папке (по умолчанию c:\metastock data).

Если в ней что-то храниться, то открыв эту папку мы увидим три вида файлов:

  1. файл master
  2. файл emaster
  3. файлы вида F?.dat

Файл master содержит информацию о том, сколько инструментов хранится, какие инструменты хранятся, их имена, символы, даты.

Когда в метастоке открывается новый график (security), то метасток выводит в диалоговом окне список инструментов именно из этого файла. А если этого файла нет, то метасток ничего не увидит.

Файл Emaster создается метастоком самостоятельно при каждом обращении к папке. Присутствие или отсутствие этого файла никак не сказывается на работоспособности программы. Поэтому в этом описании я его рассматривать не буду. Он нафиг не нужен!

Файлы вида F?.dat содержат данные по графикам конкретного инструмента. По количеству этих файлов можно сразу определить сколько инструментов хранит метасток. Следует заметить, что без файла master узнать какой инструмент содержиться в файле F?.dat нельзя.

Лично я работаю на рынке форекс поэтому рассматривать данные метасток именно с форексовских позиций.

 

Описание файлов F?.dat

Файл F?.dat в папке данных метасток содержит в себе данные по одному из инструментов. По какому именно это указано в файле master в этой же папке. Знак вопроса заменяется числом (обычно от 1 до последнего инструмента). Т.е. если вы качаете только EUR (10 min) и EUR (1hour), то у Вас в папке будет только два файла F1.dat и F2.dat.

Чтобы понять внутренности F?.dat потребуется двоичный редактор.

Для ясности условно разделим файл на записи, т.е. на строки длинной в 28 байт если он например дневной, а если интрадэй то по 32 т.к. в нем есть дополнительное поле “время” - 4 байта. Далее эти различия буду писать как 28(32), что означает 28 - это для дневных (недельных, месячных) инструментов, 32 - для внутредневных соответственно.

Теперь для удобства понимания представим F?.dat в виде таблицы, в которой каждая строка (запись) содержит 28(32) байт, а в каждой строке 4(5) колонки по 4 байта каждая. Выглядеть все это будет примерно так:

Таблица 1

00

00

02

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

90

83

7B

94

00

5F

66

92

00

00

00

81

00

00

00

82

00

00

40

80

00

00

60

80

00

00

00

83

00

00

00

00

Байты в ячейках представлены в шестнадцатеричном виде (как в hex редакторе), каждая ячейка один байт. Если в файл F?.dat вставить только вышеуказанные строки и больше ничего, то этот файл будет содержать данные только на одну свечу со следующими характеристиками:

Дата – 1 фев 2003

Время – 23.59.00

Open – 1.0000

High – 2.0000

Low – 0.7500

Close – 0.8750

Volume – 4.0000

Open interest – 0.0000

Обозначим теперь строки (записи) и колонки в этой таблице.

Таблица 2

1

00

00

02

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

Date

Time

Open

High

Low

Close

Volume

Open int.

2

90

83

7B

94

00

5F

66

92

00

00

00

81

00

00

00

82

00

00

40

80

00

00

60

80

00

00

00

83

00

00

00

00

Первая запись вынесена наверх неслучайно, дело в том, что она не содержит данных о свечках. И состоит из всех нолей, кроме 3 и 4 байта, в которых записано количество записей (по 28(32) байта) в файле. В нашем случае стоит шестнадцатеричное число 2 в третьем байте – это означает, что в файле всего две записи: (первая где и стоит двойка и вторая где данные о свечке). Если записей 256 то число будет FF, а если 257 то в третьем байте будет стоять 01 и в четвертом 01. Это означает, что записей в файле = 256*число из 4 байта + число из третьего байта. Усекли? Т.о. максимально в этих двух байтах можно указать 256*256= 65536 записей. Пробовал указать больше, начал ругаться Downloader (это программка метастоковская такая). Если указать кол-во записей меньше, чем на самом деле в файле, то метасток прочитает только то, что указано. Т.е. если написали 2 (как в примере), то с третей строки можете начать писать письмо бабушке.

Теперь рассмотрим вторую запись из таблицы 2. Здесь указаны данные по свече (в каждой записи расписывается только одна свеча). В первых четырех байтах, как Вы поняли, указывается дата, в следующих время т.д. Поскольку я работаю на форексе, то поле open interest всегда равно нулю (все байты поля = 0). Если бы было две свечи в файле, то добавилась бы третья строка по образу и подобию второй и т.д.

Вот здесь начинается самое интересное. Т.е. то над чем мне пришлось попотеть два дня. Дело в том, что для того чтобы понять какое число указано например в поле Open (цена открытия) совсем недостаточно перевести его из шестн. формата в десятичный. Метасток записывает числа в своем формате, созданном, как мне кажется, для того чтобы быстро переводить значения в дробный вид (видели наверно на фондовом рынке числа типа 1/8, 2/3 и т.п.). Но я как человек патриотически настроенный понимаю только десятичные числа и все дальнейшее описание нацелено на них.

Для наглядности выпишем поле Open из таблицы 2.

Таблца 3

Open

00

00

00

81

Счет происходит от крайне правого байта (там где 81), давайте назовем его за это старшим или первым, а крайний левый пусть будет младшим или четвертым. Т.е. все, что касается байтов внутри поля, будет читаться справа налево.

Представленный в таблице 3 набор байтов соответствует десятичной единице. Если старший байт оставить пустым (нулевым), то неважно что будет написано в остальных трех, все равно в десятичном виде это ноль.

Почему 81 это единица? Да вот почему:

81 в десятичном это 129

где d1 – десятичное значение первого(старшего байта), т.е. 129

D – конечное десятичное значение всего поля, т.е. в данном случае цена открытия, как таковая.

Следовательно 2 в степени (129-129) равно 1.

Если бы стояла не 81 а 83, то тогда:

83 в десятичном это 131.

2 в степени (131-129) равно 8

Примеры:

Таблица 4

d1

D

128

0,5

127

0,25

130

2

И т.д. но этот расчет верен если младшие три байта пустые.

Если же в поле прописаны значения как в таблице 5.

Таблца 5

Open

00

00

40

81

Тогда это выражение равно 1,5000.

Почему?

Если бы вместо 40 стояли нули, то D было бы равно 1.

Заметим, что 40 в десятичном виде это 64 или 128/2, а

1-0,5=1/2. Т.о. число сорок означает, что к 1 надо прибавить 64/128 (шестьдесятчетыре стодвадцативосьмых) от 1. Круто, да?

Примеры:

а) Если первый байт 82 т.е. D=2

А второй 20 т.е десятичное 32, то к 2 надо добавить 32/128 от 2.

Т.о D(окончательное)= 2+(2*32/128)=2,5.

б) Если первый байт 85 (D=16), второй 40, то

D(окончательное)= 16+(16*64/128)=24.

Точно такая же ситуация с третьим и четвертым байтом.

Правда там делитель не 128, а 256.

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

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

Для полного понимания последнего абзаца рекомендую прочитать несколько раз с карандашиком в руках.

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

  1. Из метастока в десятичный формат
  2. Наоборот.

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

Теперь мы разобрались как записывать числа в поля (Open, High, Low, Close, Volume, Open int).

Немножко похитрее ситуация с датой и временем.

Если байты из поля дата перевести (по вышеуказанной методике) в десятичный вид, то получится целое число. Его разряды будут в формате 1YYMMDD. Единица в начале означает столетие 1 мол 20, 0 –19).

Т.о. если вы хотите записать в файл дату 1 фев 2003, то необходимо конвертировать в метастоковский формат (по вышеуказанной методике) десятичное число 1030201.

Что бы получить метастоковскую дату нужно перевести (по вышеуказанной методике) число разряды которого соответствуют HHMMSS. Например десятичное число 235900, записанное в поле время, означает 23 часа 59 минут 00 секунд, как в приведенном примере (таблица 1).

Желающим разобраться в метастоковском формате придется хорошенько поработать с прилагаемы файлом. FILE

Вот такие пироги товарищи молдаване.

 

Описание файла Master.

Разобравшись с предыдущей главой перейдем к рассмотрению файла мастер. Здесь я буду более краток.

Этот файл содержит записи длиной в 54 байта. Каждая запись содержит информацию на один файл графика, т.е. F?.dat. Все записи содержат, но только не первая. Первая запись состоит из нулей, кроме первых четырех и последних четырех байтов записи. Первые это нечто вроде количества записей (но я не уверен), а последние значения не имеют, они меняются метастоком при каждом обращении к файлу, поэтому их можно записать любыми.

Теперь разберем пример второй (“значащей”) записи. Все последующие записи подобны ей.

 

Пример байтов из записи

Их описание

01

номер файла, т.е. число после F

65 00 20 08 00 00

Стандартный набор байтов, по нему можно ориентироваться на записи. Он в каждой записи одинаковый.

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

16 байтов на символ. Если символ состоит из трех букв, то в первые три байта надо записать эти буквы, а в остальных 13 оставить 20

00 00

Стандартный набор байтов, своего рода разделитель внутри записи.

B0 25 79 94

4 байта отведено для записи характеристики графика Last date (конечная дата). Никак не влияет на сам график, поэтому можно вписывать везде один и ту же дату. Записывается в формате метасток (см. главу выше).

B0 25 79 94

4 байта отводится для записи характеристики графика First date в формате метасток. Тоже можно оставлять любой.

49

Периодичность графика (I,D,W,M)

0A

Если предыдущий байт I (Intraday) то здесь нужно указать минуты (10, 30, 60 и т.п.), а если D, W или M, то байт надо оставить нулевым.

00

Стандартный байт-разделитель, хотя возможно и продолжения предыдущего байта

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

16 байтов на имя графика, подобен записи символа

00

Завершающий стандартный байт

 

 

Письма с предложениями и по обмену опытом прошу направлять лично мне xelay@narod.ru .


После того как была написана эта статья, мне прислали файл, где все вышеописанное излагается более официально, но на английском языке. Спасибо Юрию. Описание здесь. Computrac and MetaStock File Formats

Hosted by uCoz