@@ -59,10 +59,9 @@ def _format_date(dt: date) -> str:
59
59
60
60
61
61
class Trade :
62
- """Trade"""
62
+ """Trade representing all values provided by the Thetadata stream. """
63
63
def __init__ (self ):
64
- """from_bytes
65
- """
64
+ """Dummy constructor"""
66
65
self .ms_of_day = 0
67
66
self .sequence = 0
68
67
self .size = 0
@@ -72,8 +71,7 @@ def __init__(self):
72
71
self .date = None
73
72
74
73
def from_bytes (self , data : bytearray ):
75
- """from_bytes
76
- """
74
+ """Deserializes a trade."""
77
75
view = memoryview (data )
78
76
parse_int = lambda d : int .from_bytes (d , "big" )
79
77
self .ms_of_day = parse_int (view [0 :4 ])
@@ -86,16 +84,16 @@ def from_bytes(self, data: bytearray):
86
84
self .date = date (year = int (date_raw [0 :4 ]), month = int (date_raw [4 :6 ]), day = int (date_raw [6 :8 ]))
87
85
88
86
def to_string (self ) -> str :
87
+ """String representation of a trade."""
89
88
return 'ms_of_day: ' + str (self .ms_of_day ) + ' sequence: ' + str (self .sequence ) + ' size: ' + str (self .size ) + \
90
89
' condition: ' + str (self .condition .name ) + ' price: ' + str (self .price ) + ' exchange: ' + \
91
90
str (self .exchange .value [1 ]) + ' date: ' + str (self .date )
92
91
93
92
94
93
class Quote :
95
- """Quote"""
94
+ """Quote representing all values provided by the Thetadata stream. """
96
95
def __init__ (self ):
97
- """from_bytes
98
- """
96
+ """Dummy constructor"""
99
97
self .ms_of_day = 0
100
98
self .bid_size = 0
101
99
self .bid_exchange = Exchange .OPRA
@@ -108,8 +106,7 @@ def __init__(self):
108
106
self .date = None
109
107
110
108
def from_bytes (self , data : bytes ):
111
- """from_bytes
112
- """
109
+ """Deserializes a trade."""
113
110
view = memoryview (data )
114
111
parse_int = lambda d : int .from_bytes (d , "big" )
115
112
mult = _pt_to_price_mul [parse_int (view [36 :40 ])]
@@ -126,6 +123,7 @@ def from_bytes(self, data: bytes):
126
123
self .date = date (year = int (date_raw [0 :4 ]), month = int (date_raw [4 :6 ]), day = int (date_raw [6 :8 ]))
127
124
128
125
def to_string (self ) -> str :
126
+ """String representation of a quote."""
129
127
return 'ms_of_day: ' + str (self .ms_of_day ) + ' bid_size: ' + str (self .bid_size ) + ' bid_exchange: ' + \
130
128
str (self .bid_exchange .value [1 ]) + ' bid_price: ' + str (self .bid_price ) + ' bid_condition: ' + \
131
129
str (self .bid_condition .name ) + ' ask_size: ' + str (self .ask_size ) + ' ask_exchange: ' + \
@@ -134,40 +132,37 @@ def to_string(self) -> str:
134
132
135
133
136
134
class OpenInterest :
137
- """Trade """
135
+ """Open Interest """
138
136
def __init__ (self ):
139
- """from_bytes
140
- """
137
+ """Dummy constructor"""
141
138
self .open_interest = 0
142
139
self .date = None
143
140
144
141
def from_bytes (self , data : bytearray ):
145
- """from_bytes
146
- """
142
+ """Deserializes open interest."""
147
143
view = memoryview (data )
148
144
parse_int = lambda d : int .from_bytes (d , "big" )
149
145
self .open_interest = parse_int (view [0 :4 ])
150
146
date_raw = str (parse_int (view [4 :8 ]))
151
147
self .date = date (year = int (date_raw [0 :4 ]), month = int (date_raw [4 :6 ]), day = int (date_raw [6 :8 ]))
152
148
153
149
def to_string (self ) -> str :
150
+ """String representation of open interest."""
154
151
return 'open_interest: ' + str (self .open_interest ) + ' date: ' + str (self .date )
155
152
156
153
157
154
class Contract :
158
155
"""Contract"""
159
156
def __init__ (self ):
160
- """from_bytes
161
- """
157
+ """Dummy constructor"""
162
158
self .root = ""
163
159
self .exp = None
164
160
self .strike = None
165
161
self .isCall = False
166
162
self .isOption = False
167
163
168
164
def from_bytes (self , data : bytes ):
169
- """from_bytes
170
- """
165
+ """Deserializes a contract."""
171
166
view = memoryview (data )
172
167
parse_int = lambda d : int .from_bytes (d , "big" )
173
168
# parse
@@ -185,12 +180,13 @@ def from_bytes(self, data: bytes):
185
180
self .strike = parse_int (view [root_len + 9 : root_len + 13 ]) / 1000.0
186
181
187
182
def to_string (self ) -> str :
183
+ """String representation of open interest."""
188
184
return 'root: ' + self .root + ' isOption: ' + str (self .isOption ) + ' exp: ' + str (self .exp ) + \
189
185
' strike: ' + str (self .strike ) + ' isCall: ' + str (self .isCall )
190
186
191
187
192
188
class StreamMsg :
193
- """Msg"""
189
+ """Stream Msg"""
194
190
def __init__ (self ):
195
191
self .type = StreamMsgType .ERROR
196
192
self .trade = Trade ()
@@ -272,6 +268,8 @@ def connect(self):
272
268
def connect_stream (self , callback ):
273
269
"""Initiate a connection with the Theta Terminal Stream server on `localhost`.
274
270
Requests can only be made inside this generator aka the `with client.connect_stream()` block.
271
+ Responses to the provided callback method are recycled, meaning that if you send data received
272
+ in the callback method to another thread, you must create a copy of it first.
275
273
276
274
:raises ConnectionRefusedError: If the connection failed.
277
275
:raises TimeoutError: If the timeout is set and has been reached.
0 commit comments