def _send_to_broker_and_get_reward(self, action): reward = 0.0 discouragement = 0.000000000001 if action == 0: # do nothing reward += discouragement elif action == 1: # buy price_fee_adjusted = self.midpoint + (PriceJump.fee * self.midpoint) if self.broker.short_inventory_count > 0: order = Order(ccy=self.sym, side='short', price=price_fee_adjusted, step=self.local_step_number) self.broker.remove(order=order) reward += self.broker.get_reward(side=order.side) elif self.broker.long_inventory_count >= 0: order = Order(ccy=self.sym, side='long', price=price_fee_adjusted, step=self.local_step_number) if self.broker.add(order=order) is False: reward -= discouragement else: logger.info( ('gym_trading.get_reward() ' + 'Error for action #{} - ' + 'unable to place an order with broker').format(action)) elif action == 2: # sell price_fee_adjusted = self.midpoint - (PriceJump.fee * self.midpoint) if self.broker.long_inventory_count > 0: order = Order(ccy=self.sym, side='long', price=price_fee_adjusted, step=self.local_step_number) self.broker.remove(order=order) reward += self.broker.get_reward(side=order.side) elif self.broker.short_inventory_count >= 0: order = Order(ccy=self.sym, side='short', price=price_fee_adjusted, step=self.local_step_number) if self.broker.add(order=order) is False: reward -= discouragement else: logger.info( 'gym_trading.get_reward() ' + 'Error for action #{} - ' + 'unable to place an order with broker'.format(action)) else: logger.info( ('Unknown action to take in get_reward(): ' + 'action={} | midpoint={}').format(action, self.midpoint)) return reward
def test_case_three(self): print('\nTest_Case_Three') test_position = Broker(5) midpoint = 100. for i in range(10): order_open = Order(ccy='BTC-USD', side='long', price=midpoint - i, step=i) test_position.add(order=order_open) self.assertEqual(5, test_position.long_inventory.position_count) self.assertEqual(0, test_position.short_inventory.position_count) print('Confirm we have 5 positions: %i' % test_position.long_inventory.position_count) for i in range(10): order_open = Order(ccy='BTC-USD', side='long', price=midpoint + i, step=i) test_position.remove(order=order_open) self.assertEqual(0, test_position.long_inventory.position_count) self.assertEqual(0, test_position.short_inventory.position_count)
def test_case_one(self): print('\nTest_Case_One') test_position = Broker() midpoint = 100. fee = .003 order_open = Order(ccy='BTC-USD', side='long', price=midpoint, step=1) test_position.add(order=order_open) self.assertEqual(1, test_position.long_inventory.position_count) print('LONG Unrealized_pnl: %f' % test_position.long_inventory.get_unrealized_pnl()) self.assertEqual(0, test_position.short_inventory.position_count) self.assertEqual(0., test_position.short_inventory.get_unrealized_pnl()) order_close = Order(ccy='BTC-USD', side='long', price=midpoint + (midpoint * fee * 5), step=100) test_position.remove(order=order_close) self.assertEqual(0, test_position.long_inventory.position_count) print('LONG Unrealized_pnl: %f' % test_position.long_inventory.get_unrealized_pnl()) self.assertEqual(test_position.short_inventory.position_count, 0) self.assertEqual(test_position.short_inventory.get_unrealized_pnl(), 0.) print('LONG Realized_pnl: %f' % test_position.get_realized_pnl())
def test_case_two(self): print('\nTest_Case_Two') test_position = Broker() midpoint = 100. fee = .003 order_open = Order(ccy='BTC-USD', side='short', price=midpoint, step=1) test_position.add(order=order_open) self.assertEqual(1, test_position.short_inventory.position_count) self.assertEqual(0, test_position.long_inventory.position_count) self.assertEqual(0., test_position.long_inventory.get_unrealized_pnl()) print('SHORT Unrealized_pnl: %f' % test_position.short_inventory.get_unrealized_pnl()) order_close = Order(ccy='BTC-USD', side='short', price=midpoint - (midpoint * fee * 15), step=100) test_position.remove(order=order_close) self.assertEqual(0, test_position.short_inventory.position_count) self.assertEqual(0, test_position.long_inventory.position_count) self.assertEqual(0., test_position.long_inventory.get_unrealized_pnl()) print('SHORT Unrealized_pnl: %f' % test_position.short_inventory.get_unrealized_pnl()) print('SHORT Realized_pnl: %f' % test_position.get_realized_pnl())
def step(self, action: int): for current_step in range(self.action_repeats): if self.done: self.reset() return self.observation, self.reward, self.done # reset the reward if there ARE action repeats if current_step == 0: self.reward = 0. step_action = action else: step_action = 0 # Get current step's midpoint self.midpoint = self.prices_[self.local_step_number] # Pass current time step midpoint to broker to calculate PnL, # or if any open orders are to be filled buy_volume = self._get_book_data(PriceJump.buy_trade_index) sell_volume = self._get_book_data(PriceJump.sell_trade_index) self.tns.step(buys=buy_volume, sells=sell_volume) self.rsi.step(price=self.midpoint) self.broker.step(midpoint=self.midpoint) self.reward += self._send_to_broker_and_get_reward( action=step_action) step_observation = self._get_step_observation(action=action) self.data_buffer.append(step_observation) if len(self.data_buffer) > self.window_size: del self.data_buffer[0] self.local_step_number += self.step_size self.observation = self._get_observation() if self.local_step_number > self.max_steps: self.done = True order = Order(ccy=self.sym, side=None, price=self.midpoint, step=self.local_step_number) self.reward = self.broker.flatten_inventory(order=order) return self.observation, self.reward, self.done, {}
def _send_to_broker_and_get_reward(self, action: int): """ Create or adjust orders per a specified action and adjust for penalties. :param action: (int) current step's action :return: (float) reward """ reward = 0.0 discouragement = 0.000000000001 if action == 0: # do nothing reward += discouragement elif action == 1: # buy price_fee_adjusted = self.midpoint + (PriceJump.fee * self.midpoint) if self.broker.short_inventory_count > 0: order = Order(ccy=self.sym, side='short', price=price_fee_adjusted, step=self.local_step_number) self.broker.remove(order=order) reward += self.broker.get_reward(side=order.side) / \ self.broker.reward_scale # scale realized PnL elif self.broker.long_inventory_count >= 0: order = Order(ccy=self.sym, side='long', price=price_fee_adjusted, step=self.local_step_number) if self.broker.add(order=order) is False: reward -= discouragement else: logger.info( ('gym_trading.get_reward() ' + 'Error for action #{} - ' + 'unable to place an order with broker').format(action)) elif action == 2: # sell price_fee_adjusted = self.midpoint - (PriceJump.fee * self.midpoint) if self.broker.long_inventory_count > 0: order = Order(ccy=self.sym, side='long', price=price_fee_adjusted, step=self.local_step_number) self.broker.remove(order=order) reward += self.broker.get_reward(side=order.side) / \ self.broker.reward_scale # scale realized PnL elif self.broker.short_inventory_count >= 0: order = Order(ccy=self.sym, side='short', price=price_fee_adjusted, step=self.local_step_number) if self.broker.add(order=order) is False: reward -= discouragement else: logger.info( ('gym_trading.get_reward() ' + 'Error for action #{} - ' + 'unable to place an order with broker').format(action)) else: logger.info( ('Unknown action to take in get_reward(): ' + 'action={} | midpoint={}').format(action, self.midpoint)) return reward