Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import struct
- import logging
- # Logging setup
- logger = logging.getLogger(__name__)
- class Header:
- """Header data in file"""
- def __init__(self, file):
- header_fmt = '<4s2I2HI36s'
- header_size = struct.calcsize(header_fmt)
- try:
- header_data = file.read(header_size)
- except OSError as e:
- logger.critical("Could not read header")
- raise
- self.id, self.size, self.record_size, self.version, self.utc_start, self.reserve = struct.unpack(header_fmt, header_data)
- self.validate()
- def validate(self):
- # Validate header fields
- assert self.size == 56, "Invalid header size"
- assert self.id == b'SCID', "Invalid header id"
- class Record:
- """Single record from file"""
- def __init__(self, file, record_size):
- self.record_size = record_size
- self.datetime = None # Populate later
- # ...
- def read_records(filename):
- with open(filename, 'rb') as file:
- header = Header(file)
- record_size = header.record_size
- while True:
- record = Record(file, record_size)
- yield (record.datetime, record.open, record.high,
- record.low, record.close, record.num_trades,
- record.total_volume, record.bid_volume,
- record.ask_volume)
- # Keep reading records
- file.read(record_size)
- # Reading Header Data
- def read_header(filename):
- header_format = '<4s2I2HI36s'
- header_size = struct.calcsize(header_format)
- with open(filename, 'rb') as f:
- header_data = f.read(header_size)
- (
- header_id,
- header_size,
- record_size,
- version,
- unused1,
- utc_start,
- reserve
- ) = struct.unpack(header_format, header_data)
- # Validate header_id and header_size here if needed
- return header_id, header_size, record_size, version, unused1, utc_start, reserve
- # Process real-time quote
- def process_real_time_quote(record_data):
- # Process the real-time quote here
- pass
- # Read real-time quotes
- def read_real_time_quotes(filename, header_size, record_size):
- with open(filename, 'rb') as f:
- num_records = get_num_records(filename, header_size, record_size)
- record_start = num_records
- while True:
- seek_to_record(f, header_size, record_size, record_start)
- record_data = f.read(record_size)
- while len(record_data) == 0:
- record_data = f.read(record_size)
- process_real_time_quote(record_data)
- # Sample usage
- if __name__ == "__main__":
- filename = '/mnt/c/SierraChart/Data/ESU23-CME.scid'
- for (datetime, open, high, low, close, num_trades,
- total_volume, bid_volume, ask_volume) in read_records(filename):
- print(f"DateTime: {datetime}, Open: {open}, High: {high}, Low: {low}, Close: {close}, "
- f"NumTrades: {num_trades}, TotalVolume: {total_volume}, "
- f"BidVolume: {bid_volume}, AskVolume: {ask_volume}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement