def _apply_float_override(override_as_float: float, original_position_no_override: int, proposed_trade: Order) -> Order: """ Works if override value is float, or override_close (float value is 0.0) or override_none (float value is 1.0) :param original_position_no_override: :param proposed_trade: :return: """ if override_as_float == 1.0: return proposed_trade desired_new_position = original_position_no_override + proposed_trade.trade.as_single_trade_qty_or_error() override_new_position = int( np.floor( desired_new_position * override_as_float)) new_trade_value = override_new_position - original_position_no_override proposed_trade.replace_required_trade_size_only_use_for_unsubmitted_trades( tradeQuantity(new_trade_value)) return proposed_trade
def what_trade_is_possible(position: int, position_limit: int, order: Order) -> Order: ## POSIITON LIMITS CAN ONLY BE APPLIED TO SINGLE LEG TRADES, EG INSTRUMENT ORDERS proposed_trade = order.as_single_trade_qty_or_error() possible_trade = what_trade_is_possible_single_leg_trade(position=position, position_limit=position_limit, proposed_trade=proposed_trade) possible_trade_as_trade_qty = tradeQuantity(possible_trade) order = order.replace_required_trade_size_only_use_for_unsubmitted_trades(possible_trade_as_trade_qty) return order
def add_children_to_stack_and_child_id_to_parent( self, parent_stack: orderStackData, child_stack: orderStackData, parent_order: Order, list_of_child_orders: listOfOrders, ): parent_log = parent_order.log_with_attributes(self.log) list_of_child_ids = put_children_on_stack( child_stack=child_stack, list_of_child_orders=list_of_child_orders, parent_log=parent_log, parent_order=parent_order, ) if len(list_of_child_ids) == 0: return None success_or_failure = add_children_to_parent_or_rollback_children( child_stack=child_stack, parent_order=parent_order, parent_log=parent_log, parent_stack=parent_stack, list_of_child_ids=list_of_child_ids, ) if success_or_failure is success: log_successful_adding( list_of_child_orders=list_of_child_orders, list_of_child_ids=list_of_child_ids, parent_order=parent_order, parent_log=parent_log, )
def _add_order_to_data_no_checking(self, order: Order): # Duplicates will be overriden, so be careful mongo_record = order.as_dict() self.mongo_data.add_data(order.order_id, mongo_record, allow_overwrite=True)
def _apply_reduce_only(original_position_no_override: int, proposed_trade: Order) -> Order: proposed_trade_value = proposed_trade.trade.as_single_trade_qty_or_error() desired_new_position = original_position_no_override + proposed_trade_value if sign(desired_new_position) != sign(original_position_no_override): # Wants sign to change, we convert into a pure closing trade new_trade_value = -original_position_no_override elif abs(desired_new_position) > abs(original_position_no_override): # Increasing trade not allowed, zero trade new_trade_value = 0 else: # Reducing trade and sign not changing, we'll allow new_trade_value = proposed_trade_value proposed_trade.replace_required_trade_size_only_use_for_unsubmitted_trades( tradeQuantity(new_trade_value)) return proposed_trade
def _put_order_on_stack_and_get_order_id(self, order: Order) -> int: order_has_existing_id = not order.order_id is no_order_id if order_has_existing_id: log = order.log_with_attributes(self.log) log.warn( "Order %s already has order ID will be ignored and allocated a new ID!" % str(order)) order_to_add = copy(order) order_id = self._get_next_order_id() order_to_add.order_id = order_id self._put_order_on_stack_no_checking(order_to_add) return order_id
def fill_from_order(order: Order) -> Fill: try: assert len(order.trade) == 1 except: raise Exception("Can't get fills from multi-leg orders") if order.fill_equals_zero(): return missing_order fill_price = order.filled_price fill_datetime = order.fill_datetime fill_qty = order.fill[0] if fill_price is None: return missing_order if fill_datetime is None: return missing_order return Fill(fill_datetime, fill_qty, fill_price)
def _apply_no_trading(proposed_trade: Order): new_trade = proposed_trade.replace_required_trade_size_only_use_for_unsubmitted_trades( tradeQuantity(0)) return new_trade
def _put_order_on_stack_no_checking(self, order: Order): order_as_dict = order.as_dict() self.mongo_data.add_data(int(order.order_id), order_as_dict, allow_overwrite=False)