Всем привет.
Решил выложить в открытый доступ базу данных тиков с CME, которая накапливалась за последние годы, и обновляется по итогу дня.
FTP доступ:
85.25.211.62
login: smartlab
pass: smartlabpass
Ссылки на торрент: http://ge.tt/1Ql8j3Y2
№2: app.box.com/s/h0dhmkif0fhnvlpzdp8ma89c1ysv876t
Формат данных:
seconds (int32) — кол-во секунд с начала суток по Чикаго.
milliseconds (int32)
price (int32)
volume (int32)
bestBidPrice (sbyte) — расстояние в тиках между price и реальной ценой BidPrice
bestAskPrice (sbyte) - расстояние в тиках между price и реальной ценой AskPrice
bestBidSize (int32) — доступно с июня 2015
bestAskSize (int32) - доступно с июня 2015
Ниже код для чтения бинарных файлов (На C#).
Создаем класс Tick:
- public class Tick
- {
- public DateTime Time { get; set; }
- public int Price { get; set; }
- public int Volume { get; set; }
- public int BidPrice { get; set; }
- public int AskPrice { get; set; }
- public int BidSize { get; set; }
- public int AskSize { get; set; }
- public TickSide TickSide { get; set; } //Enum — TickSide.Ask, TickSide.Bid
- }
Далее читаем файл через BinaryReader:
- using(BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)))
- {
-
- while (reader.BaseStream.Position != reader.BaseStream.Length)
- {
- int seconds = reader.ReadInt32();
- DateTime tickTime = currentDate.Date.AddSeconds(seconds);
-
- if (tickTime.Date != currentDate.Date)
- break;
-
- int milliseconds = reader.ReadInt32();
- int price = reader.ReadInt32();
- int volume = reader.ReadInt32();
- sbyte bid = reader.ReadSByte();
- sbyte ask = reader.ReadSByte();
- int bidSize = reader.ReadInt32();
- int askSize = reader.ReadInt32();
- tickTime = tickTime.AddMilliseconds(milliseconds);
-
- Tick tick = new Tick
- {
- Time = tickTime,
- Price = price,
- Volume = volume,
- BidPrice = bid,
- AskPrice = ask,
- BidSize = bidSize,
- AskSize = askSize,
- };
-
- GetTickSide(tick);
- }
- }
Метод GetTickSide:
- private void GetTickSide(Tick tick)
- {
- if (tick.BidPrice <= 0)
- tick.TickSide = TickSide.Bid;
- else if (tick.AskPrice <= 0)
- tick.TickSide = TickSide.Ask;
- }
Чтобы получить читабельные цены bestBidPrice и bestAskPrice:
- int readableAskPrice = tick.price + (tick.AskPrice * priceStep);
- int readableBidPrice = tick.price — (tick.BidPrice * priceStep);
… где priceStep это шаг цены. Например шаг цены для ES = 25 (а не 0.25), Для GC/CL = 1 (а не 0.1/0.01) и так далее.
Все цены хранятся в int32, так как меньше весят, поэтому, чтобы получить цены с точкой, необходимо tick.price / (10 * кол-во знаков после точки).
P/s:
Просьба Тимофею Мартынову — сделайте пожалуйста подсветку кода на смартлабе.
Поставьте пожалуйста плюс чтобы вышло на главную!