def what_contract_trade_is_possible(self, proposed_order): log = proposed_order.log_with_attributes(self.log) data_trade_limits = dataTradeLimits(self.data) strategy_name = proposed_order.strategy_name instrument_code = proposed_order.instrument_code # proposed_order.trade.total_abs_qty() is a scalar, returns a scalar possible_trade_size = data_trade_limits.what_trade_is_possible( strategy_name, instrument_code, proposed_order.trade.total_abs_qty()) revised_order = proposed_order.change_trade_size_proportionally( possible_trade_size ) if revised_order.trade != proposed_order.trade: log.msg( "%s/%s trade change from %s to %s because of trade limits" % ( strategy_name, instrument_code, str(proposed_order.trade), str(revised_order.trade), ) ) return revised_order
def view_trade_limits(data): trade_limits = dataTradeLimits(data) all_limits = trade_limits.get_all_limits_sorted() print("All limits\n") for limit in all_limits: print(limit) print("\n")
def set_trade_limit_for_instrument( data, instrument_code: str, risk_multiplier: float, trade_multiplier: float, period_days: int, max_leverage: float, ): trade_limits = dataTradeLimits(data) new_limit = calc_trade_limit_for_instrument( data, instrument_code=instrument_code, risk_multiplier=risk_multiplier, trade_multiplier=trade_multiplier, max_leverage=max_leverage, period_days=period_days, ) if np.isnan(new_limit): print("Can't calculate trade limit for %s, not setting" % instrument_code) else: print("Update limit for %s %d with %d" % (instrument_code, period_days, new_limit)) trade_limits.update_instrument_limit_with_new_limit( instrument_code, period_days, new_limit)
def reset_limit_for_instrument(data): trade_limits = dataTradeLimits(data) instrument_code = get_valid_instrument_code_from_user(data) period_days = get_and_convert("Period of days?", type_expected=int, allow_default=True, default_value = 1) ans = input("Reset means trade 'clock' will restart. Are you sure? (y/other)") if ans =="y": trade_limits.reset_instrument_limit(instrument_code, period_days)
def set_trade_limit_for_instrument( data, instrument_code: str, trade_multiplier: float, period_days: int, auto_parameters: parametersForAutoPopulation ): trade_limits = dataTradeLimits(data) new_limit = calc_trade_limit_for_instrument( data, instrument_code=instrument_code, auto_parameters = auto_parameters, trade_multiplier=trade_multiplier, period_days=period_days ) if np.isnan(new_limit): print("Can't calculate trade limit for %s, not setting" % instrument_code) else: print( "Update limit for %s %d with %d" % (instrument_code, period_days, new_limit) ) trade_limits.update_instrument_limit_with_new_limit( instrument_code, period_days, new_limit )
def apply_trade_limits_to_contract_order( self, proposed_order: contractOrder) -> contractOrder: log = proposed_order.log_with_attributes(self.log) data_trade_limits = dataTradeLimits(self.data) instrument_strategy = proposed_order.instrument_strategy # proposed_order.trade.total_abs_qty() is a scalar, returns a scalar maximum_abs_qty = ( data_trade_limits.what_trade_is_possible_for_strategy_instrument( instrument_strategy, proposed_order.trade)) contract_order_after_trade_limits = ( proposed_order. change_trade_size_proportionally_to_meet_abs_qty_limit( maximum_abs_qty)) if contract_order_after_trade_limits.trade != proposed_order.trade: log.msg("%s trade change from %s to %s because of trade limits" % ( proposed_order.key, str(proposed_order.trade), str(contract_order_after_trade_limits.trade), )) return contract_order_after_trade_limits
def change_limit_for_instrument(data): trade_limits = dataTradeLimits(data) instrument_code = get_valid_instrument_code_from_user(data) period_days = get_and_convert("Period of days?", type_expected=int, allow_default=True, default_value = 1) new_limit = get_and_convert("Limit (in contracts?)", type_expected=int, allow_default=False) ans = input("Update will change number of trades allowed in periods, but won't reset 'clock'. Are you sure? (y/other)") if ans =="y": trade_limits.update_instrument_limit_with_new_limit(instrument_code, period_days, new_limit)
def add_trade_to_trade_limits(self, executed_order, trade_size=arg_not_supplied): if trade_size is arg_not_supplied: trade_size = executed_order.trade[0] data_trade_limits = dataTradeLimits(self.data) strategy_name = executed_order.strategy_name instrument_code = executed_order.instrument_code data_trade_limits.add_trade(strategy_name, instrument_code, trade_size)
def set_trade_limit_for_instrument(data, instrument_code, risk_multiplier, trade_multiplier, period_days): trade_limits = dataTradeLimits(data) new_limit = calc_trade_limit_for_instrument(data, instrument_code, risk_multiplier, trade_multiplier, period_days) if np.isnan(new_limit): print("Can't calculate trade limit for %s, not setting" % instrument_code) else: trade_limits.update_instrument_limit_with_new_limit( instrument_code, period_days, new_limit)
def remove_trade_from_trade_limits(self, partially_filled_modified_or_cancelled_order, unfilled_qty =arg_not_supplied): if unfilled_qty is arg_not_supplied: unfilled_qty = partially_filled_modified_or_cancelled_order.trade[0] - \ partially_filled_modified_or_cancelled_order.fill[0] data_trade_limits = dataTradeLimits(self.data) strategy_name = partially_filled_modified_or_cancelled_order.strategy_name instrument_code = partially_filled_modified_or_cancelled_order.instrument_code data_trade_limits.remove_trade(strategy_name, instrument_code, unfilled_qty)
def what_contract_trade_is_possible(self, proposed_order): log = proposed_order.log_with_attributes(self.log) data_trade_limits = dataTradeLimits(self.data) strategy_name = proposed_order.strategy_name instrument_code = proposed_order.instrument_code possible_trade_size = data_trade_limits.what_trade_is_possible(strategy_name, instrument_code, proposed_order.trade[0]) revised_order = proposed_order.replace_trade_only_use_for_unsubmitted_trades([possible_trade_size]) if revised_order.trade[0]!=proposed_order.trade[0]: log.msg("%s/%s trade change from %s to %s because of trade limits" \ % (strategy_name, instrument_code, str(proposed_order.trade), str(revised_order.trade))) return revised_order
def reset_limit_for_instrument_strategy(data): trade_limits = dataTradeLimits(data) instrument_code = get_valid_instrument_code_from_user(data) period_days = get_and_convert( "Period of days?", type_expected=int, allow_default=True, default_value=1 ) strategy_name = get_valid_strategy_name_from_user(data=data, source="positions") ans = input("Reset means trade 'clock' will restart. Are you sure? (y/other)") if ans == "y": instrument_strategy = instrumentStrategy( instrument_code=instrument_code, strategy_name=strategy_name ) trade_limits.reset_instrument_strategy_limit( instrument_strategy=instrument_strategy, period_days=period_days )
def get_list_of_trade_limits(data): trade_limits = dataTradeLimits(data) all_limits = trade_limits.get_all_limits() list_of_limits = [get_trade_limit_tuple(limit) for limit in all_limits] return list_of_limits
def reset_all_limits(data): trade_limits = dataTradeLimits(data) ans = input( "Reset means trade 'clock' will restart. Are you sure? (y/other)") if ans == "y": trade_limits.reset_all_limits()
def add_trade_to_trade_limits(self, executed_order: brokerOrder): data_trade_limits = dataTradeLimits(self.data) data_trade_limits.add_trade(executed_order)