update switching fr logic for expected alpha
This commit is contained in:
61
main.py
61
main.py
@@ -249,33 +249,34 @@ def signal_alpha_over_taker(
|
||||
alpha_hurdle_adj: Decimal = Decimal('0.00'),
|
||||
) -> Signal:
|
||||
|
||||
|
||||
if funding_rate_exch == 'ASTER':
|
||||
if funding_rate_side == 'BUY':
|
||||
aster_buy_fund_rate_return = abs(funding_rate)
|
||||
extend_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
else:
|
||||
aster_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
extend_buy_fund_rate_return = abs(funding_rate)
|
||||
else: # funding_rate_exch == 'EXTEND':
|
||||
if funding_rate_side == 'BUY':
|
||||
aster_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
extend_buy_fund_rate_return = abs(funding_rate)
|
||||
else:
|
||||
aster_buy_fund_rate_return = abs(funding_rate)
|
||||
extend_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
|
||||
|
||||
if Config.Overrides.Flatten_Open_Positions_Opportunistic:
|
||||
if Decimal(str(Aster.notional_position)) > 0:
|
||||
aster_buy_fund_rate_return = abs(funding_rate_switch) * -1
|
||||
extend_buy_fund_rate_return = abs(funding_rate_switch)
|
||||
aster_buy_fund_rate_return = aster_buy_fund_rate_return
|
||||
extend_buy_fund_rate_return = max([extend_buy_fund_rate_return, abs(funding_rate_switch)])
|
||||
# funding_rate_exch = 'EXTEND'
|
||||
# funding_rate_side = 'BUY'
|
||||
else: # Decimal(str(Aster.notional_position)) < 0:
|
||||
aster_buy_fund_rate_return = abs(funding_rate_switch)
|
||||
extend_buy_fund_rate_return = abs(funding_rate_switch) * -1
|
||||
aster_buy_fund_rate_return = max([aster_buy_fund_rate_return, abs(funding_rate_switch)])
|
||||
extend_buy_fund_rate_return = extend_buy_fund_rate_return
|
||||
# funding_rate_exch = 'ASTER'
|
||||
# funding_rate_side = 'BUY'
|
||||
else:
|
||||
if funding_rate_exch == 'ASTER':
|
||||
if funding_rate_side == 'BUY':
|
||||
aster_buy_fund_rate_return = abs(funding_rate)
|
||||
extend_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
else:
|
||||
aster_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
extend_buy_fund_rate_return = abs(funding_rate)
|
||||
else: # funding_rate_exch == 'EXTEND':
|
||||
if funding_rate_side == 'BUY':
|
||||
aster_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
extend_buy_fund_rate_return = abs(funding_rate)
|
||||
else:
|
||||
aster_buy_fund_rate_return = abs(funding_rate)
|
||||
extend_buy_fund_rate_return = abs(funding_rate) * -1
|
||||
|
||||
|
||||
aster_mid_px: Decimal = ( Decimal(str(aster_ticker_dict['best_ask_px'])) + Decimal(str(aster_ticker_dict['best_bid_px'])) ) / 2
|
||||
extend_mid_px: Decimal = ( Decimal(str(extend_ticker_dict['best_ask_px'])) + Decimal(str(extend_ticker_dict['best_bid_px'])) ) / 2
|
||||
@@ -288,7 +289,8 @@ def signal_alpha_over_taker(
|
||||
|
||||
aster_buy_expected_alpha: Decimal = ( aster_buy_ratio_min_taker_hurdle - Decimal(str(Aster.buy_ratio)) ).quantize(Decimal('0.000001'), rounding='ROUND_DOWN') # Decimal Price % Diff (x Qty = Alpha $)
|
||||
extend_buy_expected_alpha: Decimal = ( extend_buy_ratio_min_taker_hurdle - Decimal(str(Extend.buy_ratio)) ).quantize(Decimal('0.000001'), rounding='ROUND_DOWN') # Decimal Price % Diff (x Qty = Alpha $)
|
||||
|
||||
best_expected_alpha = max([aster_buy_expected_alpha, extend_buy_expected_alpha])
|
||||
|
||||
# logging.info(f'aster_buy_ratio_min_taker_hurdle: ( {aster_buy_ratio} - {aster_buy_fund_rate_return} ) - {taker_fee} - {alpha_hurdle_adj} = {aster_buy_ratio_min_taker_hurdle}')
|
||||
# logging.info(f'extend_buy_ratio_min_taker_hurdle: ( {extend_buy_ratio} - {extend_buy_fund_rate_return} ) - {taker_fee} - {alpha_hurdle_adj} = {extend_buy_ratio_min_taker_hurdle}')
|
||||
# logging.info(f'aster_buy_expected_alpha: {aster_buy_ratio_min_taker_hurdle} - {Decimal(str(Aster.buy_ratio))} = {aster_buy_expected_alpha}')
|
||||
@@ -299,7 +301,7 @@ def signal_alpha_over_taker(
|
||||
# aster_buy_expected_alpha : 0.000673878630659394266895260 - 0.0014628375 = -0.0007
|
||||
# extend_buy_expected_alpha : -0.001173878630659394266895260 - -0.0014628375 = 0.0002
|
||||
|
||||
if aster_buy_expected_alpha > 0:
|
||||
if ( aster_buy_expected_alpha > 0 ) and ( best_expected_alpha == aster_buy_expected_alpha ):
|
||||
signal: bool = True
|
||||
exchange: str = 'ASTER'
|
||||
side: str = 'BUY'
|
||||
@@ -307,7 +309,7 @@ def signal_alpha_over_taker(
|
||||
expected_alpha: Decimal = aster_buy_expected_alpha
|
||||
model_ratio: Decimal = Decimal(str(Aster.buy_ratio))
|
||||
current_ratio: Decimal = aster_buy_ratio_min_taker_hurdle
|
||||
elif extend_buy_expected_alpha > 0:
|
||||
elif ( extend_buy_expected_alpha > 0 ) and ( best_expected_alpha == extend_buy_expected_alpha ):
|
||||
signal: bool = True
|
||||
exchange: str = 'EXTEND'
|
||||
side: str = 'BUY'
|
||||
@@ -316,7 +318,7 @@ def signal_alpha_over_taker(
|
||||
model_ratio: Decimal = Decimal(str(Extend.buy_ratio))
|
||||
current_ratio: Decimal = extend_buy_ratio_min_taker_hurdle
|
||||
else:
|
||||
if max([aster_buy_expected_alpha,extend_buy_expected_alpha]) == aster_buy_expected_alpha:
|
||||
if best_expected_alpha == aster_buy_expected_alpha:
|
||||
signal: bool = False
|
||||
exchange: str = 'ASTER'
|
||||
side: str = 'BUY'
|
||||
@@ -877,7 +879,7 @@ async def run_algo():
|
||||
aster_fund_rate = aster_fund_rate * -1
|
||||
extend_fund_rate = extend_fund_rate * -1
|
||||
|
||||
aster_fund_rate_time = float(aster_fund_rate_dict.get('next_funding_time_ts_ms', 0))
|
||||
aster_fund_rate_time = max([float(aster_fund_rate_dict.get('next_funding_time_ts_ms', 0)), 0])
|
||||
aster_fund_rate_time = aster_fund_rate_time+(60*60*1000) if aster_fund_rate_time < (datetime.now().timestamp()*1000) else aster_fund_rate_time
|
||||
|
||||
extend_fund_rate_time = max([float(extend_fund_rate_dict.get('next_funding_time_ts_ms', 0)), 0])
|
||||
@@ -893,7 +895,8 @@ async def run_algo():
|
||||
if next_funding_at_same_time:
|
||||
net_fr = max([fund_rate_ast, fund_rate_ext]) - min([fund_rate_ast, fund_rate_ext])
|
||||
fr_best_exch = 'ASTER' if max([abs(fund_rate_ast), abs(fund_rate_ext)]) == abs(fund_rate_ast) else 'EXTEND'
|
||||
fr_best_side = 'BUY' if net_fr < 0 else 'SELL'
|
||||
fr_best_rate = fund_rate_ast if max([abs(fund_rate_ast), abs(fund_rate_ext)]) == abs(fund_rate_ast) else fund_rate_ext
|
||||
fr_best_side = 'BUY' if fr_best_rate < 0 else 'SELL'
|
||||
return net_fr, fr_best_exch, fr_best_side
|
||||
else:
|
||||
fr_best_exch = 'EXTEND'
|
||||
@@ -1261,11 +1264,7 @@ async def main():
|
||||
VAL_KEY.set(name='fr_orchestrator_output', value=json.dumps(obj=Config.model_dump()))
|
||||
VAL_KEY.set(name='fr_algo_working_symbol', value=json.dumps(obj={'ASTER': asdict(obj=Aster), 'EXTEND': asdict(obj=Extend)}))
|
||||
|
||||
Funding_Rates_Min_Remaining_Factor_Pcts = calc_fr_minutes_remaining_factor(
|
||||
min_start_procedure = 30,
|
||||
min_to_end_procedure = 7,
|
||||
factor_exp_pct = 0.50
|
||||
)
|
||||
Funding_Rates_Min_Remaining_Factor_Pcts = calc_fr_minutes_remaining_factor()
|
||||
|
||||
Algo_Status = structs.Algo_Status(
|
||||
last_update_ts_ms = int(round(datetime.now().timestamp()*1000, 2)),
|
||||
|
||||
Reference in New Issue
Block a user