22
33Custom Event Handler
44====================
5-
65Here we will look into custom event handler implementation. Unlike the
76Basic Usage example, we will not pay much attention to anything behind
87the handler.
@@ -12,7 +11,8 @@ is attached to the Subscription. When an event comes, internal
1211structures call the update method of your handler with event as a
1312parameter. event is a list with data specific to each event type. For
1413example, for the Trade event type: ‘Symbol’, ‘Price’, ‘ExchangeCode’,
15- ‘Size’, ‘Tick’, ‘Change’, ‘DayVolume’, ‘Time’, ‘IsETH’.
14+ ‘Size’, ‘Tick’, ‘Change’, ‘DayVolume’, ‘Time’, ‘IsETH’. More info here:
15+ https://kb.dxfeed.com/display/DS/dxFeed+API+Market+Events
1616
1717After adding symbols or attaching a default listener (what is actually
1818done implicitly in the first case) list of one-word descriptions of
@@ -29,8 +29,10 @@ Import package
2929.. code :: python3
3030
3131 import dxfeed as dx
32+ from dxfeed.core.utils.data_class import DequeWithLock # custom deque with thread lock
3233 from datetime import datetime # for timed subscription
3334 from dateutil.relativedelta import relativedelta
35+ import numpy as np
3436
3537 Configure and create connection with Endpoint class
3638~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -49,75 +51,91 @@ you should also provide time to start subscription from.
4951
5052.. code :: python3
5153
52- candle_sub = endpoint.create_subscription('Candle', date_time=datetime.now() - relativedelta(minutes=30 ))
54+ candle_sub = endpoint.create_subscription('Candle', date_time=datetime.now() - relativedelta(days=3 ))
5355
5456 .. code :: python3
5557
5658 class DiffHandler(dx.EventHandler):
5759 def __init__(self):
58- self.__prev_open = 0
59- self.__prev_high = 0
60- self.__prev_low = 0
61- self.__prev_close = 0
62- self.__prev_volume = 0
63- self.volume_changes = list ()
60+ self.__prev_open = None
61+ self.__prev_high = None
62+ self.__prev_low = None
63+ self.__prev_close = None
64+ self.__prev_volume = None
65+ self.volume_changes = DequeWithLock ()
6466 self.counter = 0
6567
6668 def update(self, event):
67- if event[12] == event[12]: # AskVolume not nan
69+ if not np.isnan(event[12]): # AskVolume not nan
70+ self.counter += 1
6871 print(f'Symbol: {event[0]}')
69- print(f'Open changed by: {event[5] - self.__prev_open}')
70- self.__prev_open = event[5]
71- print(f'High changed by: {event[6] - self.__prev_high}')
72- self.__prev_high = event[6]
73- print(f'Open changed by: {event[7] - self.__prev_low}')
74- self.__prev_low = event[7]
75- print(f'Close changed by: {event[8] - self.__prev_close}')
76- self.__prev_close = event[8]
77- # Volume logic
78- vol_change = event[12] - self.__prev_volume
79- self.volume_changes.append(vol_change)
80- self.counter +=1
81- print(f'Volume changed by: {vol_change}, from {self.__prev_volume}, to {event[12]}')
82- self.__prev_volume = event[12]
83- print(f'Ask events processed: {self.counter}')
84- print('-------------------')
85- if self.counter % 10 == 0:
86- print(f'Average volume change for 10 past ask events is: {sum(self.volume_changes) / len(self.volume_changes)}')
87- self.volume_changes.clear()
72+ if self.counter == 1:
73+ self.__prev_open = event[5]
74+ self.__prev_high = event[6]
75+ self.__prev_low = event[7]
76+ self.__prev_close = event[8]
77+ self.__prev_volume = event[12]
78+ print('First event processed')
79+ print('-------------------')
80+ else:
81+ print(f'Open changed by: {event[5] - self.__prev_open}')
82+ self.__prev_open = event[5]
83+ print(f'High changed by: {event[6] - self.__prev_high}')
84+ self.__prev_high = event[6]
85+ print(f'Open changed by: {event[7] - self.__prev_low}')
86+ self.__prev_low = event[7]
87+ print(f'Close changed by: {event[8] - self.__prev_close}')
88+ self.__prev_close = event[8]
89+ # Volume logic
90+ vol_change = event[12] - self.__prev_volume
91+ self.volume_changes.safe_append(vol_change)
92+ print(f'Volume changed by: {vol_change}, from {self.__prev_volume}, to {event[12]}')
93+ self.__prev_volume = event[12]
94+ print(f'Ask events prcessed: {self.counter}')
8895 print('-------------------')
96+ if self.counter % 10 == 0:
97+ print(f'Average volume change for 10 past ask events is: {sum(self.volume_changes) / len(self.volume_changes)}')
98+ self.volume_changes.clear()
99+ print('-------------------')
100+
101+ For Candle event type along with base symbol, you should specify an
102+ aggregation period. You can also set price type. More details:
103+ https://kb.dxfeed.com/display/DS/REST+API#RESTAPI-Candlesymbols
89104
90105.. code :: python3
91106
92107 handler = DiffHandler()
93- candle_sub.set_event_handler(handler).add_symbols(['AAPL'])
108+ candle_sub.set_event_handler(handler).add_symbols(['AAPL{=d} ']);
94109
95110
96- .. code-block :: text
111+ .. code :: text
97112
98- Symbol: AAPL
99- Open changed by: 336.3
100- High changed by: 336.3
101- Open changed by: 336.3
102- Close changed by: 336.3
103- Volume changed by: 200.0, from 0, to 200.0
104- Ask events processed: 1
113+ Symbol: AAPL{=d}
114+ First event processed
115+ -------------------
116+ Symbol: AAPL{=d}
117+ Open changed by: -2.6399999999999864
118+ High changed by: -1.0500000000000114
119+ Open changed by: -4.1299999999999955
120+ Close changed by: -1.8199999999999932
121+ Volume changed by: 10387567.0, from 7339.0, to 10394906.0
122+ Ask events prcessed: 2
105123 -------------------
106- Symbol: AAPL
107- Open changed by: 0.05989999999997053
108- High changed by: 0.05989999999997053
109- Open changed by: 0.05989999999997053
110- Close changed by: 0.05989999999997053
111- Volume changed by: -75 .0, from 200 .0, to 125 .0
112- Ask events processed: 2
124+ Symbol: AAPL{=d}
125+ Open changed by: 3.7399999999999523
126+ High changed by: 1.9499999999999886
127+ Open changed by: 1.8699999999999477
128+ Close changed by: -0.1400000000000432
129+ Volume changed by: 1746584 .0, from 10394906 .0, to 12141490 .0
130+ Ask events prcessed: 3
113131 -------------------
114- Symbol: AAPL
115- Open changed by: -0.009899999999959164
116- High changed by: -0.009899999999959164
117- Open changed by: -0.009899999999959164
118- Close changed by: -0.009899999999959164
119- Volume changed by: -25 .0, from 125 .0, to 100 .0
120- Ask events processed: 3
132+ Symbol: AAPL{=d}
133+ Open changed by: 0.0
134+ High changed by: 0.0
135+ Open changed by: 0.0
136+ Close changed by: 0.0
137+ Volume changed by: 0 .0, from 12141490 .0, to 12141490 .0
138+ Ask events prcessed: 4
121139 -------------------
122140
123141
@@ -137,7 +155,7 @@ Close connection
137155 print(f'Connection status: {endpoint.connection_status}')
138156
139157
140- .. code-block :: text
158+ .. code :: text
141159
142160 Connection status: Not connected
143161
0 commit comments