Skip to content

Commit 3d3d104

Browse files
committed
[EN-1570] Custom handler example docs edited
1 parent 3cd2328 commit 3d3d104

File tree

2 files changed

+73
-54
lines changed

2 files changed

+73
-54
lines changed

docs/custom_handler.rst

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
Custom Event Handler
44
====================
5-
65
Here we will look into custom event handler implementation. Unlike the
76
Basic Usage example, we will not pay much attention to anything behind
87
the handler.
@@ -12,7 +11,8 @@ is attached to the Subscription. When an event comes, internal
1211
structures call the update method of your handler with event as a
1312
parameter. event is a list with data specific to each event type. For
1413
example, 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

1717
After adding symbols or attaching a default listener (what is actually
1818
done 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

examples/CustomHandlerExample.ipynb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
"metadata": {},
6767
"outputs": [],
6868
"source": [
69-
"candle_sub = endpoint.create_subscription('Candle', date_time=datetime.now() - relativedelta(days=30))"
69+
"candle_sub = endpoint.create_subscription('Candle', date_time=datetime.now() - relativedelta(days=3))"
7070
]
7171
},
7272
{
@@ -96,6 +96,7 @@
9696
" self.__prev_close = event[8]\n",
9797
" self.__prev_volume = event[12]\n",
9898
" print('First event processed')\n",
99+
" print('-------------------')\n",
99100
" else:\n",
100101
" print(f'Open changed by: {event[5] - self.__prev_open}')\n",
101102
" self.__prev_open = event[5]\n",

0 commit comments

Comments
 (0)