-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbinary_generator.py
More file actions
148 lines (114 loc) · 4.27 KB
/
binary_generator.py
File metadata and controls
148 lines (114 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env python3
"""
Generate binary test input for the order book processor.
Outputs to stdout, redirect to a file: python3 generator.py > test_input.bin
"""
import struct
import sys
def write_message(seq_no, msg_data):
"""Write a message with header (seqNo, msgSize) followed by message data."""
msg_size = len(msg_data)
# Header: uint32 seqNo, uint32 msgSize
header = struct.pack('<II', seq_no, msg_size)
sys.stdout.buffer.write(header)
sys.stdout.buffer.write(msg_data)
def create_add_message(symbol, order_id, side, volume, price):
"""
Create ADD message (32 bytes):
- byte 0: 'A'
- bytes 1-3: symbol (3 chars, space-padded)
- bytes 4-11: order_id (uint64)
- byte 12: side ('B' or 'S')
- bytes 13-15: padding
- bytes 16-23: volume (uint64)
- bytes 24-27: price (int32)
- bytes 28-31: padding
"""
msg = bytearray(32)
msg[0] = ord('A')
# Symbol: 3 bytes, space-padded
symbol_bytes = symbol.ljust(3, ' ')[:3].encode('ascii')
msg[1:4] = symbol_bytes
# Order ID: uint64 at offset 4
struct.pack_into('<Q', msg, 4, order_id)
# Side: char at offset 12
msg[12] = ord(side)
# Volume: uint64 at offset 16
struct.pack_into('<Q', msg, 16, volume)
# Price: int32 at offset 24
struct.pack_into('<i', msg, 24, price)
return bytes(msg)
def create_update_message(symbol, order_id, side, volume, price):
"""
Create UPDATE message (32 bytes) - same format as ADD but with 'U'
"""
msg = bytearray(32)
msg[0] = ord('U')
symbol_bytes = symbol.ljust(3, ' ')[:3].encode('ascii')
msg[1:4] = symbol_bytes
struct.pack_into('<Q', msg, 4, order_id)
msg[12] = ord(side)
struct.pack_into('<Q', msg, 16, volume)
struct.pack_into('<i', msg, 24, price)
return bytes(msg)
def create_delete_message(symbol, order_id, side):
"""
Create DELETE message (16 bytes):
- byte 0: 'D'
- bytes 1-3: symbol
- bytes 4-11: order_id (uint64)
- byte 12: side
- bytes 13-15: padding
"""
msg = bytearray(16)
msg[0] = ord('D')
symbol_bytes = symbol.ljust(3, ' ')[:3].encode('ascii')
msg[1:4] = symbol_bytes
struct.pack_into('<Q', msg, 4, order_id)
msg[12] = ord(side)
return bytes(msg)
def create_execute_message(symbol, order_id, side, traded_qty):
"""
Create EXECUTE message (24 bytes):
- byte 0: 'E'
- bytes 1-3: symbol
- bytes 4-11: order_id (uint64)
- byte 12: side
- bytes 13-15: padding
- bytes 16-23: traded_qty (uint64)
"""
msg = bytearray(24)
msg[0] = ord('E')
symbol_bytes = symbol.ljust(3, ' ')[:3].encode('ascii')
msg[1:4] = symbol_bytes
struct.pack_into('<Q', msg, 4, order_id)
msg[12] = ord(side)
struct.pack_into('<Q', msg, 16, traded_qty)
return bytes(msg)
def main():
"""Generate the multi-symbol test case."""
# Message 1: Add AAPL BID
write_message(1, create_add_message('AAPL', 1001, 'B', 100, 1500000))
# Message 2: Add AAPL ASK
write_message(2, create_add_message('AAPL', 1002, 'S', 50, 1505000))
# Message 3: Add MSFT BID
write_message(3, create_add_message('MSFT', 2001, 'B', 200, 3000000))
# Message 4: Add MSFT ASK
write_message(4, create_add_message('MSFT', 2002, 'S', 150, 3010000))
# Message 5: Add GOOGL BID
write_message(5, create_add_message('GOOGL', 3001, 'B', 75, 2800000))
# Message 6: Add AAPL BID (lower price, so second level)
write_message(6, create_add_message('AAPL', 1003, 'B', 120, 1499000))
# Message 7: Execute AAPL BID partially
write_message(7, create_execute_message('AAPL', 1001, 'B', 30))
# Message 8: Add GOOGL ASK
write_message(8, create_add_message('GOOGL', 3002, 'S', 60, 2805000))
# Message 9: Update MSFT BID (increase volume)
write_message(9, create_update_message('MSFT', 2001, 'B', 250, 3000000))
# Message 10: Delete AAPL ASK
write_message(10, create_delete_message('AAPL', 1002, 'S'))
sys.stderr.write("Binary test input generated successfully!\n")
sys.stderr.write("Usage: python3 generator.py > test_input.bin\n")
sys.stderr.write("Then: ./orderbook_processor 2 < test_input.bin\n")
if __name__ == '__main__':
main()