Exemple #1
0
    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")
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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
        )
Exemple #6
0
    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
Exemple #7
0
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)
Exemple #8
0
    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)
Exemple #9
0
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)
Exemple #10
0
    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)
Exemple #11
0
    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
Exemple #12
0
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
        )
Exemple #13
0
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()
Exemple #15
0
    def add_trade_to_trade_limits(self, executed_order: brokerOrder):

        data_trade_limits = dataTradeLimits(self.data)

        data_trade_limits.add_trade(executed_order)