Advertisement
bitwise_gamgee

Untitled

Aug 31st, 2023
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. import os
  2. import struct
  3. import logging
  4.  
  5. # Logging setup
  6. logger = logging.getLogger(__name__)
  7.  
  8. class Header:
  9. """Header data in file"""
  10.  
  11. def __init__(self, file):
  12. header_fmt = '<4s2I2HI36s'
  13. header_size = struct.calcsize(header_fmt)
  14.  
  15. try:
  16. header_data = file.read(header_size)
  17. except OSError as e:
  18. logger.critical("Could not read header")
  19. raise
  20.  
  21. self.id, self.size, self.record_size, self.version, self.utc_start, self.reserve = struct.unpack(header_fmt, header_data)
  22.  
  23. self.validate()
  24.  
  25. def validate(self):
  26. # Validate header fields
  27. assert self.size == 56, "Invalid header size"
  28. assert self.id == b'SCID', "Invalid header id"
  29.  
  30. class Record:
  31. """Single record from file"""
  32.  
  33. def __init__(self, file, record_size):
  34. self.record_size = record_size
  35. self.datetime = None # Populate later
  36. # ...
  37.  
  38.  
  39. def read_records(filename):
  40.  
  41. with open(filename, 'rb') as file:
  42.  
  43. header = Header(file)
  44. record_size = header.record_size
  45.  
  46. while True:
  47. record = Record(file, record_size)
  48.  
  49. yield (record.datetime, record.open, record.high,
  50. record.low, record.close, record.num_trades,
  51. record.total_volume, record.bid_volume,
  52. record.ask_volume)
  53.  
  54. # Keep reading records
  55. file.read(record_size)
  56.  
  57. # Reading Header Data
  58. def read_header(filename):
  59. header_format = '<4s2I2HI36s'
  60. header_size = struct.calcsize(header_format)
  61.  
  62. with open(filename, 'rb') as f:
  63. header_data = f.read(header_size)
  64. (
  65. header_id,
  66. header_size,
  67. record_size,
  68. version,
  69. unused1,
  70. utc_start,
  71. reserve
  72. ) = struct.unpack(header_format, header_data)
  73.  
  74. # Validate header_id and header_size here if needed
  75.  
  76. return header_id, header_size, record_size, version, unused1, utc_start, reserve
  77.  
  78. # Process real-time quote
  79. def process_real_time_quote(record_data):
  80. # Process the real-time quote here
  81. pass
  82.  
  83. # Read real-time quotes
  84. def read_real_time_quotes(filename, header_size, record_size):
  85. with open(filename, 'rb') as f:
  86. num_records = get_num_records(filename, header_size, record_size)
  87. record_start = num_records
  88. while True:
  89. seek_to_record(f, header_size, record_size, record_start)
  90. record_data = f.read(record_size)
  91. while len(record_data) == 0:
  92. record_data = f.read(record_size)
  93. process_real_time_quote(record_data)
  94.  
  95. # Sample usage
  96. if __name__ == "__main__":
  97. filename = '/mnt/c/SierraChart/Data/ESU23-CME.scid'
  98.  
  99. for (datetime, open, high, low, close, num_trades,
  100. total_volume, bid_volume, ask_volume) in read_records(filename):
  101. print(f"DateTime: {datetime}, Open: {open}, High: {high}, Low: {low}, Close: {close}, "
  102. f"NumTrades: {num_trades}, TotalVolume: {total_volume}, "
  103. f"BidVolume: {bid_volume}, AskVolume: {ask_volume}")
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement