Skip to content

Commit 93edcb1

Browse files
committed
Add test cases generator
1 parent a9e4fbb commit 93edcb1

File tree

3 files changed

+151
-3
lines changed

3 files changed

+151
-3
lines changed

orderbook/orderbook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def __str__(self):
233233
if self.tape != None and len(self.tape) > 0:
234234
num = 0
235235
for entry in self.tape:
236-
if num < 5: # get last 5 entries
236+
if num < 10: # get last 5 entries
237237
tempfile.write(str(entry['quantity']) + " @ " + str(entry['price']) + " (" + str(entry['timestamp']) + ")\n")
238238
num += 1
239239
else:

orderbook/orderlist.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ def move_to_tail(self, order):
9292
def __str__(self):
9393
from cStringIO import StringIO
9494
temp_file = StringIO()
95-
for order in self:
96-
temp_file.write("%s\n" % str(order))
95+
#for order in self:
96+
# temp_file.write("%s\n" % str(order))
97+
temp_file.write("%s\n" % str(self.head_order))
9798
return temp_file.getvalue()
9899

99100

orderbook/test/genOrders.py

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
#! /usr/bin/python
2+
from __future__ import print_function
3+
from random import *
4+
import sys
5+
sys.path.append('..')
6+
from orderbook import OrderBook
7+
8+
def generate_new_buy(trade_id):
9+
return {'type' : 'limit',
10+
'side' : 'bid',
11+
'quantity' : randint(1,1000),
12+
'price' : randint(900,1050),
13+
'trade_id' : trade_id}
14+
15+
def generate_cross_buy(trade_id):
16+
return {'type' : 'limit',
17+
'side' : 'bid',
18+
'quantity' : randint(1,1000),
19+
'price' : randint(1055,1200),
20+
'trade_id' : trade_id}
21+
22+
def generate_new_sell(trade_id):
23+
return {'type' : 'limit',
24+
'side' : 'ask',
25+
'quantity' : randint(1,1000),
26+
'price' : randint(1055,1200),
27+
'trade_id' : trade_id}
28+
29+
def generate_cross_sell(trade_id):
30+
return {'type' : 'limit',
31+
'side' : 'ask',
32+
'quantity' : randint(1,1000),
33+
'price' : randint(900,1050),
34+
'trade_id' : trade_id}
35+
36+
def treat_trades(trades, side):
37+
if not trades:
38+
return
39+
if side == 'B':
40+
for j in range(len(trades)):
41+
trade = trades[j]
42+
assert (trade['party1'][1] == 'ask'), 'party1 should be ask'
43+
new_quantity = None
44+
orderId = trade['party1'][2]
45+
assert (orderId != None), 'party1 should have order_id'
46+
new_quantity = trade['party1'][3]
47+
order = sells[orderId]
48+
if new_quantity == None:
49+
del sells[orderId]
50+
else:
51+
order['quantity'] = new_quantity
52+
else:
53+
for j in range(len(trades)):
54+
trade = trades[j]
55+
assert (trade['party1'][1] == 'bid'), 'party1 should be bid'
56+
new_quantity = None
57+
orderId = trade['party1'][2]
58+
assert (orderId != None), 'party1 should have order_id'
59+
new_quantity = trade['party1'][3]
60+
order = buys[orderId]
61+
if new_quantity == None:
62+
del buys[orderId]
63+
else:
64+
order['quantity'] = new_quantity
65+
66+
def prefill(nb_orders_prefilled, verbose = False):
67+
for trade_id in range(nb_orders_prefilled):
68+
trades,neworder = order_book.process_order(generate_new_buy(trade_id), False, verbose)
69+
assert (trades == []), 'No trade at this stage'
70+
assert (neworder != []), 'Expect new order'
71+
buys[neworder['order_id']]=neworder
72+
trades,neworder = order_book.process_order(generate_new_sell(trade_id), False, verbose)
73+
assert (trades == []), 'No trade at this stage'
74+
assert (neworder != []), 'Expect new order'
75+
sells[neworder['order_id']]=neworder
76+
77+
def testCases(trade_id, action, side, verbose = False):
78+
if action == 'A':
79+
if side == 'B':
80+
trades,neworder = order_book.process_order(generate_new_buy(trade_id), False, verbose)
81+
treat_trades(trades, side)
82+
if neworder:
83+
buys[neworder['order_id']]=neworder
84+
else:
85+
trades,neworder = order_book.process_order(generate_new_sell(trade_id), False, verbose)
86+
treat_trades(trades, side)
87+
if neworder:
88+
sells[neworder['order_id']]=neworder
89+
elif action == 'M':
90+
if side == 'B':
91+
if len(buys):
92+
order = buys[choice(buys.keys())]
93+
order['quantity'] = randint(1,1000)
94+
order_book.modify_order(order['order_id'], order)
95+
else:
96+
if len(sells):
97+
order = sells[choice(sells.keys())]
98+
order['quantity'] = randint(1,1000)
99+
order_book.modify_order(order['order_id'], order)
100+
elif action == 'X':
101+
if side == 'B':
102+
if len(buys):
103+
key = choice(buys.keys())
104+
order = buys[key]
105+
del buys[key]
106+
order_book.cancel_order('bid', order['order_id'])
107+
else:
108+
if len(sells):
109+
key = choice(sells.keys())
110+
order = sells[key]
111+
del sells[key]
112+
order_book.cancel_order('ask', order['order_id'])
113+
elif action == 'C':
114+
if side == 'B':
115+
trades,neworder = order_book.process_order(generate_cross_buy(trade_id), False, verbose)
116+
treat_trades(trades, side)
117+
if neworder:
118+
buys[neworder['order_id']]=neworder
119+
else:
120+
trades,neworder = order_book.process_order(generate_cross_sell(trade_id), False, verbose)
121+
treat_trades(trades, side)
122+
if neworder:
123+
sells[neworder['order_id']]=neworder
124+
125+
126+
buys = {}
127+
sells = {}
128+
order_book = OrderBook()
129+
130+
# nb buys and sells to prefill orderbook
131+
prefill(10)
132+
133+
#print(order_book)
134+
135+
136+
#usage:
137+
# 1/ trade_id
138+
# 2/ choice('AMXC') : A (new), M (modify), X (cancel), C (cross)
139+
# 3/ choice('BS') : B (buy), S (sell)
140+
for trade_id in xrange(10, 100):
141+
testCases(trade_id, choice('C'), choice('BS'), False)
142+
143+
print(order_book)
144+
145+
# quit()
146+
147+

0 commit comments

Comments
 (0)