Як зберігає свої дані Metastock 7.0.
Існує така програма розроблена фірмою Equis називається Metastock. Основна ідея програми полягає в тому, що вона отримує з інтернету дані по котируваннях будь-якого інструменту (валюти, акції або індексу) і відображає їх у спеціалізованому вигляді (біржовому графіку). Причому треба зауважити, що сам Метасток з інтернетівських сервером не зв'язується (цього в ньому не закладено), за нього це роблять інші програми (downloader 'и, vendor' и), а пов'язано це з тим, що люди працюють з різними брокерами, а кожен брокер "віддає" інформацію по котируваннях по-своєму.
Ну а оскільки Метасток у всіх один, то все Лоудер повинні зберігати цю інформацію так як це треба Метасток.
Зберігаються ці дані, як правило, в окремій папці (за замовчуванням c: \ metastock data).
Якщо в ній щось зберігатися, то відкривши цю папку ми побачимо три види файлів:
- файл master
- файл emaster
- файли виду 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.
Для ясності умовно розділимо файл на записи, тобто на рядки довжиною в 28 байт якщо він наприклад денний, а якщо інтрадей то по 32 тому в ньому є додаткове поле "час" - 4 байта. Далі ці відмінності буду писати як 28 (32), що означає 28 - це для денних (тижневих, місячних) інструментів, 32 - для внутредневних відповідно.
Тепер для зручності розуміння представимо F? .dat у вигляді таблиці, в якій кожен рядок (запис) містить 28 (32) байт, а в кожному рядку 4 (5) колонки по 4 байта кожна. Виглядати все це буде приблизно так:
Перший запис винесена наверх невипадково, справа в тому, що вона не містить даних про свічках. І складається з усіх нулів, крім 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 набір байтів відповідає десяткової одиниці. Якщо старший байт залишити порожнім (нульовим), то неважливо що буде написано в інших трьох, все одно в десятковому вигляді це нуль.
Чому 81 це одиниця? Так ось чому:
81 в десятковому це 129
де d1 - десяткове значення першого (старшого байта), тобто 129
D - кінцеве десяткове значення всього поля, тобто в даному випадку ціна відкриття, як така.
Отже 2 певною мірою (129-129) дорівнює 1.
Якби стояли не 81 а 83, то тоді:
83 в десятковому це 131.
2 певною мірою (131-129) дорівнює 8
І т.д. але цей розрахунок вірний якщо молодші три байта порожні.
Якщо ж в поле прописані значення як в таблиці 5.
Тоді цей вислів одно 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.
Т.ч. третій байт показує скільки двестіпятьдесятшестих частин від однієї стодвадцатьвосьмой першого байта потрібно додати до остаточного результату.
А четвертий байт показує скільки потрібно додати двестіпятьдесятшестих частин від однієї двестіпятьдесятшестой стодвадцітівосьмой першого байта.
Для повного розуміння останнього абзацу рекомендую прочитати кілька разів з олівчиком в руках.
А ще можна скористатися екселевскім файлом, де всі ці формули мною вже прописані тільки встигай забивати вихідні дані. Пропонуються два варіанти конвертації:
- З Метасток в десятковий формат
- Навпаки.
Представлені в файлі алгоритми не претендують на досконалість і працюють тільки з позитивними числами (тому що негативних цін і дат не буває) і зі збільшенням точність падає, тобто зміна молодшого (4) байта на одиницю при великому першому байті може змінювати кінцевий результат на десятки, а то і на одиниці. Але при малих значеннях, наприклад до тисячі, мінімальна зміна молодшого байта викличе зміна максимум шостий цифри після коми, тобто цілком можна працювати. Хочу зауважити, що цей недолік відноситься не до мого алгоритму, а до метастоковскому формату.
Тепер ми розібралися як записувати числа в поля (Open, High, Low, Close, Volume, Open int).
Трошки хитріше ситуація з датою і часом.
Якщо байти з поля дата перевести (за вищевказаною методикою) в десятковий вигляд, то вийде ціле число. Його розряди будуть в форматі 1 YYMMDD. Одиниця на початку означає століття 1 мовляв 20, 0 -19).
Що б отримати метастоковскую дату потрібно перевести (за вищевказаною методикою) число розряди якого відповідають HHMMSS. Наприклад десяткове число 235900, записане в поле час, означає 23 години 59 хвилин 00 секунд, як у наведеному прикладі (таблиця 1).
Бажаючим розібратися в метастоковском форматі доведеться гарненько попрацювати з прілагаеми файлом. FILE
Ось такі пироги товариші молдавани.
Опис файлу Master.
Розібравшись з попередньою главою перейдемо до розгляду файлу майстер. Тут я буду більш лаконічним.
Цей файл містить записи довжиною в 54 байта. Кожен запис містить інформацію на один файл графіка, тобто F? .dat. Всі записи містять, але тільки не перша. Перший запис складається з нулів, крім перших чотирьох і останніх чотирьох байтів записи. Перші це щось на кшталт кількості записів (але я не впевнений), а останні значення не мають, вони змінюються Метасток при кожному зверненні до файлу, тому їх можна записати будь-якими.
Тепер розберемо приклад другий ( "значущою") записи. Усі наступні записи подібні їй.
Приклад байтів із запису