1414
1515
1616class BacktestBroker (IBroker ):
17-
1817 def __init__ (
1918 self ,
2019 data : MarketData ,
@@ -24,6 +23,7 @@ def __init__(
2423 trade_on_close = False ,
2524 hedging = False ,
2625 exclusive_orders = False ,
26+ spread = 0.0 ,
2727 ):
2828 self ._data = data
2929 self ._cash = cash
@@ -32,6 +32,7 @@ def __init__(
3232 self ._trade_on_close = trade_on_close
3333 self ._hedging = hedging
3434 self ._exclusive_orders = exclusive_orders
35+ self ._spread = spread
3536
3637 self ._equity = np .tile (np .nan , len (self ._data ))
3738 self .orders : list [Order ] = []
@@ -53,7 +54,6 @@ def leverage(self) -> float:
5354 return self ._leverage
5455
5556 def order (self , order : Order ):
56-
5757 # If exclusive orders (each new order auto-closes previous orders/position),
5858 # cancel all non-contingent orders and close all open trades beforehand
5959 if self ._exclusive_orders :
@@ -65,14 +65,10 @@ def order(self, order: Order):
6565
6666 self .orders .append (order )
6767
68- def load_instrument_candles (
69- self , instrument : Instrument , granularity : Granularity , count : int
70- ):
68+ def load_instrument_candles (self , instrument : Instrument , granularity : Granularity , count : int ):
7169 self ._data .load_instrument_candles (instrument , granularity , count )
7270
73- def subscribe (
74- self , instrument : Instrument , granularity : Granularity
75- ) -> IInstrumentData :
71+ def subscribe (self , instrument : Instrument , granularity : Granularity ) -> IInstrumentData :
7672 return self ._data .get (instrument , granularity )
7773
7874 def get_position (self , instrument : Instrument ) -> Position :
@@ -81,9 +77,7 @@ def get_position(self, instrument: Instrument) -> Position:
8177 def close_position (self , instrument : Instrument ):
8278 position = self .get_position (instrument )
8379 for trade in position .trades :
84- self .orders .insert (
85- 0 , Order (trade .instrument , - trade .size , parent_trade = trade )
86- )
80+ self .orders .insert (0 , Order (trade .instrument , - trade .size , parent_trade = trade ))
8781
8882 def next (self ):
8983 self ._process_orders ()
@@ -107,7 +101,6 @@ def _update_equity(self):
107101 raise OutOfMoneyError
108102
109103 def _process_orders (self ):
110-
111104 reprocess_orders = False
112105 for order in list (self .orders ):
113106 _data = self ._get_instrument_data (order .instrument )
@@ -119,6 +112,7 @@ def _process_orders(self):
119112 self ._commission ,
120113 self ._leverage ,
121114 self .margin_available ,
115+ self ._spread ,
122116 )
123117 # Related SL/TP order already removed
124118 if order not in self .orders :
@@ -172,9 +166,7 @@ def _process_contingent_order(self, ctx: OrderContext):
172166 _order_size = ctx .adjusted_size
173167
174168 if trade in self .trades :
175- closed = self ._reduce_trade (
176- trade , _order_size , ctx .entry_price , ctx .entry_time
177- )
169+ closed = self ._reduce_trade (trade , _order_size , ctx .entry_price , ctx .entry_time )
178170 # If this is a SL/TP closing the trade already removed it.
179171 if closed and order in self .orders :
180172 self .orders .remove (order )
@@ -230,9 +222,7 @@ def _update_position(self, ctx: OrderContext):
230222 def _open_trade (self , ctx : OrderContext , tag : Optional [str ] = None ):
231223 order = ctx .order
232224 size = ctx .adjusted_size
233- trade = Trade (
234- order .instrument , size , ctx .entry_price , ctx .entry_time , ctx .data , tag
235- )
225+ trade = Trade (order .instrument , size , ctx .entry_price , ctx .entry_time , ctx .data , tag )
236226 self .trades .append (trade )
237227
238228 if order .take_profit_on_fill :
@@ -255,9 +245,7 @@ def _open_trade(self, ctx: OrderContext, tag: Optional[str] = None):
255245 trade .sl = sl_order
256246 self .orders .insert (0 , sl_order )
257247
258- def _reduce_trade (
259- self , trade : Trade , size : int , price : float , timestamp : Timestamp
260- ):
248+ def _reduce_trade (self , trade : Trade , size : int , price : float , timestamp : Timestamp ):
261249 size_left = trade .size + size
262250 closed = False
263251
@@ -281,9 +269,7 @@ def _reduce_trade(
281269
282270 def close_trades (self ):
283271 for trade in self .trades :
284- self .orders .insert (
285- 0 , Order (trade .instrument , - trade .size , parent_trade = trade )
286- )
272+ self .orders .insert (0 , Order (trade .instrument , - trade .size , parent_trade = trade ))
287273
288274 def _close_trade (self , trade : Trade , price : float , timestamp : Timestamp ):
289275 self .trades .remove (trade )
0 commit comments