Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_size_remaining_non_limit(self):
self.simulated.order.order_type.liability = 2
self.simulated.order.order_type.ORDER_TYPE = OrderTypes.LIMIT_ON_CLOSE
self.assertEqual(self.simulated.size_remaining, 0)
def test_init(self):
self.assertEqual(self.order_type.EXCHANGE, ExchangeType.BETFAIR)
self.assertEqual(self.order_type.ORDER_TYPE, OrderTypes.LIMIT_ON_CLOSE)
self.assertEqual(self.order_type.liability, 64)
self.assertEqual(self.order_type.price, 1.01)
def _process_sp(self, publish_time: int, runner: RunnerBook) -> None:
# calculate matched on BSP reconciliation
actual_sp = runner.sp.actual_sp
if actual_sp:
self._bsp_reconciled = True
_order_type = self.order.order_type
if _order_type.ORDER_TYPE == OrderTypes.LIMIT:
size = self.size_remaining
elif _order_type.ORDER_TYPE == OrderTypes.LIMIT_ON_CLOSE:
if self.side == "BACK":
if actual_sp < _order_type.price:
return
size = _order_type.liability
else:
if actual_sp > _order_type.price:
return
size = round(_order_type.liability / (actual_sp - 1), 2)
elif _order_type.ORDER_TYPE == OrderTypes.MARKET_ON_CLOSE:
if self.side == "BACK":
size = _order_type.liability
else:
size = round(_order_type.liability / (actual_sp - 1), 2)
else:
raise NotImplementedError()
self._update_matched((publish_time, actual_sp, size))
def _validate(self, order_package):
if order_package.package_type in (
OrderPackageType.PLACE,
OrderPackageType.REPLACE, # todo potential bug?
):
for order in order_package:
strategy = order.trade.strategy
if order.order_type.ORDER_TYPE == OrderTypes.LIMIT:
if order.side == "BACK":
exposure = order.order_type.size
else:
exposure = (order.order_type.price - 1) * order.order_type.size
elif order.order_type.ORDER_TYPE == OrderTypes.LIMIT_ON_CLOSE:
exposure = order.order_type.liability # todo correct?
elif order.order_type.ORDER_TYPE == OrderTypes.MARKET_ON_CLOSE:
exposure = order.order_type.liability
else:
continue
# per order
if exposure > strategy.max_order_exposure:
self._on_error(
order,
"Order exposure ({0}) is greater than strategy.max_order_strategy ({1})".format(
exposure, strategy.max_order_exposure
),
)
continue
def replace(self, new_price: float) -> None:
if self.order_type.ORDER_TYPE in [OrderTypes.LIMIT, OrderTypes.LIMIT_ON_CLOSE]:
if self.order_type.price == new_price:
raise OrderUpdateError("Prices match")
elif self.status != OrderStatus.EXECUTABLE:
raise OrderUpdateError("Current status: %s" % self.status)
self.update_data["new_price"] = new_price
self.replacing()
else:
raise OrderUpdateError(
"Only LIMIT or LIMIT_ON_CLOSE orders can be replaced."
)
def _validate_betfair_order(self, order):
if order.order_type.ORDER_TYPE == OrderTypes.LIMIT:
self._validate_betfair_size(order)
self._validate_betfair_price(order)
self._validate_betfair_min_size(order, OrderTypes.LIMIT)
elif order.order_type.ORDER_TYPE == OrderTypes.LIMIT_ON_CLOSE:
self._validate_betfair_price(order)
self._validate_betfair_liability(order)
self._validate_betfair_min_size(order, OrderTypes.LIMIT_ON_CLOSE)
elif order.order_type.ORDER_TYPE == OrderTypes.MARKET_ON_CLOSE:
self._validate_betfair_liability(order)
self._validate_betfair_min_size(order, OrderTypes.MARKET_ON_CLOSE)
else:
self._on_error(order, "Unknown orderType")
return {
"order_type": self.ORDER_TYPE.value,
"price": self.price,
"size": self.size,
"persistence_type": self.persistence_type,
"time_in_force": self.time_in_force,
"min_fill_size": self.min_fill_size,
"bet_target_type": self.bet_target_type,
"bet_target_size": self.bet_target_size,
}
class LimitOnCloseOrder(BaseOrderType):
EXCHANGE = ExchangeType.BETFAIR
ORDER_TYPE = OrderTypes.LIMIT_ON_CLOSE
def __init__(self, liability: float, price: float):
self.liability = liability
self.price = price
def place_instruction(self) -> dict:
return limit_on_close_order(liability=self.liability, price=self.price)
@property
def info(self):
return {
"order_type": self.ORDER_TYPE.value,
"liability": self.liability,
"price": self.price,
}
def _validate_betfair_order(self, order):
if order.order_type.ORDER_TYPE == OrderTypes.LIMIT:
self._validate_betfair_size(order)
self._validate_betfair_price(order)
self._validate_betfair_min_size(order, OrderTypes.LIMIT)
elif order.order_type.ORDER_TYPE == OrderTypes.LIMIT_ON_CLOSE:
self._validate_betfair_price(order)
self._validate_betfair_liability(order)
self._validate_betfair_min_size(order, OrderTypes.LIMIT_ON_CLOSE)
elif order.order_type.ORDER_TYPE == OrderTypes.MARKET_ON_CLOSE:
self._validate_betfair_liability(order)
self._validate_betfair_min_size(order, OrderTypes.MARKET_ON_CLOSE)
else:
self._on_error(order, "Unknown orderType")