working aster triggers extend

This commit is contained in:
2026-04-28 22:40:35 +00:00
parent 7d55712278
commit 8f3f7c6667
7 changed files with 12021 additions and 998 deletions

View File

@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 4,
"id": "d1eed397", "id": "d1eed397",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -18,7 +18,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 5,
"id": "c6151613", "id": "c6151613",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -38,7 +38,7 @@
"1" "1"
] ]
}, },
"execution_count": 19, "execution_count": 12,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
@@ -46,14 +46,15 @@
"source": [ "source": [
"config_update = {\n", "config_update = {\n",
" # 'Min_Time_To_Funding_Minutes': 60,\n", " # 'Min_Time_To_Funding_Minutes': 60,\n",
" # 'Allow_Ordering_Aster': False,\n", " # 'Allow_Ordering_Aster': True,\n",
" # 'Allow_Ordering_Extend': False,\n", " # 'Allow_Ordering_Extend': True,\n",
" 'Loop_Sleep_Sec': 0.00,\n", " # 'Loop_Sleep_Sec': 0.00,\n",
" 'Min_Fund_Rate_Pct_To_Trade': 0.0001,\n", " # 'Min_Fund_Rate_Pct_To_Trade': 0.001,\n",
" # 'Flip_Side_For_Testing': False,\n", " # 'Flip_Side_For_Testing': False,\n",
"# 'Price_Worsener_Extend': 0.0,\n", " # 'Price_Worsener_Extend': 0.0,\n",
" # 'Log_Summary_Each_Loop': False,\n", " # 'Log_Summary_Each_Loop': False,\n",
" # 'Print_Summary_Each_Loop': False,\n", " 'Print_Summary_Each_Loop': True,\n",
" 'Flatten_Open_Positions': False,\n",
"}\n", "}\n",
"VAL_KEY.publish('fr_orchestrator_input', json.dumps(config_update))" "VAL_KEY.publish('fr_orchestrator_input', json.dumps(config_update))"
] ]

View File

@@ -1,16 +1,16 @@
{ {
"Config_Updated_Timestamp": 1777388081818, "Config_Updated_Timestamp": 1777411434591,
"Allow_Ordering_Aster": true, "Allow_Ordering_Aster": true,
"Allow_Ordering_Extend": true, "Allow_Ordering_Extend": true,
"Loop_Sleep_Sec": 0.0, "Loop_Sleep_Sec": 0.0,
"Max_Target_Notional": 0.0, "Max_Target_Notional": 0.0,
"Min_Time_To_Funding_Minutes": 60, "Min_Time_To_Funding_Minutes": 60,
"Min_Fund_Rate_Pct_To_Trade": 0.000, "Min_Fund_Rate_Pct_To_Trade": 0.0,
"Price_Worsener_Aster": 0.01, "Price_Worsener_Aster": 0.0,
"Price_Worsener_Extend": -0.1, "Price_Worsener_Extend": -0.1,
"Target_Open_Cash_Position": 10, "Target_Open_Cash_Position": 10,
"Log_Summary_Each_Loop": false, "Log_Summary_Each_Loop": false,
"Print_Summary_Each_Loop": true, "Print_Summary_Each_Loop": true,
"Flatten_Open_Positions": true, "Flatten_Open_Positions": false,
"Flip_Side_For_Testing": false "Flip_Side_For_Testing": false
} }

View File

@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 2,
"id": "3a269644", "id": "3a269644",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -12,7 +12,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 4,
"id": "4395fabb", "id": "4395fabb",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -71,52 +71,59 @@
" \"method\": \"POST\",\n", " \"method\": \"POST\",\n",
" \"params\": {\n", " \"params\": {\n",
" 'symbol': 'ETHUSDT',\n", " 'symbol': 'ETHUSDT',\n",
" 'side': 'SELL',\n", " 'side': 'BUY',\n",
" 'type': 'LIMIT',\n", " 'type': 'LIMIT',\n",
" 'timeInForce': 'GTC',\n", " 'timeInForce': 'GTX',\n",
" 'quantity': '0.01',\n", " 'quantity': '0.01',\n",
" 'price': '2500',\n", " 'price': '2300',\n",
" }\n", " }\n",
"}" "}"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 5,
"id": "2122885a", "id": "2122885a",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"j = await aster_auth.post_authenticated_url(fut_acct_positionRisk)\n" "j = await aster_auth.post_authenticated_url(post_order)\n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 6,
"id": "e895ac52", "id": "e895ac52",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"[{'symbol': 'ETHUSDT',\n", "{'orderId': 17365320734,\n",
" 'positionAmt': '-0.214',\n", " 'symbol': 'ETHUSDT',\n",
" 'entryPrice': '2327.21',\n", " 'status': 'NEW',\n",
" 'markPrice': '2326.46000000',\n", " 'clientOrderId': 'RlTsi93X2Qe75bMt2vzC5v',\n",
" 'unRealizedProfit': '0.16050000',\n", " 'price': '2300',\n",
" 'liquidationPrice': '2444.20070305',\n", " 'avgPrice': '0.00000',\n",
" 'leverage': '150',\n", " 'origQty': '0.010',\n",
" 'maxNotionalValue': '300000',\n", " 'executedQty': '0',\n",
" 'marginType': 'cross',\n", " 'cumQty': '0',\n",
" 'isolatedMargin': '0.00000000',\n", " 'cumQuote': '0',\n",
" 'isAutoAddMargin': 'false',\n", " 'timeInForce': 'GTX',\n",
" 'type': 'LIMIT',\n",
" 'reduceOnly': False,\n",
" 'closePosition': False,\n",
" 'side': 'BUY',\n",
" 'positionSide': 'BOTH',\n", " 'positionSide': 'BOTH',\n",
" 'notional': '-497.86244000',\n", " 'stopPrice': '0',\n",
" 'isolatedWallet': '0',\n", " 'workingType': 'CONTRACT_PRICE',\n",
" 'updateTime': 1777182273777}]" " 'priceProtect': False,\n",
" 'origType': 'LIMIT',\n",
" 'updateTime': 1777411299750,\n",
" 'newChainData': {'hash': '0x43deac455e5dc6c77576c7dd21b1c3d1d5d5d6745a30300ddef0a18fc41fa0a3'}}"
] ]
}, },
"execution_count": 4, "execution_count": 6,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -27,7 +27,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"id": "ff971ca9", "id": "ff971ca9",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -59,7 +59,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": null,
"id": "c366706f", "id": "c366706f",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -93,6 +93,7 @@
" price=ORDER_PRICE,\n", " price=ORDER_PRICE,\n",
" side=ORDER_SIDE,\n", " side=ORDER_SIDE,\n",
" taker_fee=Decimal(\"0.00025\"),\n", " taker_fee=Decimal(\"0.00025\"),\n",
" post_only=True,\n",
" # previous_order_id='1295034892466447624365619416628580523728221205816494340545831832663414858661'\n", " # previous_order_id='1295034892466447624365619416628580523728221205816494340545831832663414858661'\n",
")" ")"
] ]
@@ -133,9 +134,37 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"d = await trading_client.account.get_positions_history()" "d = await trading_client.account.get_positions()"
] ]
}, },
{
"cell_type": "code",
"execution_count": 8,
"id": "ade14392",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'OK', 'data': [], 'error': None, 'pagination': None}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dict(d)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 12,

77
main.py
View File

@@ -165,7 +165,7 @@ async def get_aster_notional_position(resp: dict | None = None):
logging.info(f'BAD NOTIONAL - ASTER CHANGE: {previous_notional_position} -> {ASTER_NOTIONAL_POSITION}; UR PNL: {ASTER_UNREALIZED_PNL}; MULT: {ASTER_MULT}; d: {d}; resp: {resp}') logging.info(f'BAD NOTIONAL - ASTER CHANGE: {previous_notional_position} -> {ASTER_NOTIONAL_POSITION}; UR PNL: {ASTER_UNREALIZED_PNL}; MULT: {ASTER_MULT}; d: {d}; resp: {resp}')
await kill_algo() await kill_algo()
# if ASTER_NOTIONAL_POSITION != previous_notional_position: # if ASTER_NOTIONAL_POSITION != previous_notional_position:
logging.info(f'ASTER NOTIONAL CHANGE: {previous_notional_position} -> {ASTER_NOTIONAL_POSITION:.2f}; UR PNL: {ASTER_UNREALIZED_PNL:.2f}; MULT: {ASTER_MULT:.0f}; resp: {bool(resp)}') logging.info(f'ASTER NOTIONAL CHANGE: {previous_notional_position:.2f} -> {ASTER_NOTIONAL_POSITION:.2f}; UR PNL: {ASTER_UNREALIZED_PNL:.2f}; MULT: {ASTER_MULT:.0f}; resp: {bool(resp)}')
async def get_extend_collateral(): async def get_extend_collateral():
global EXTEND_AVAIL_COLLATERAL global EXTEND_AVAIL_COLLATERAL
@@ -174,21 +174,45 @@ async def get_extend_collateral():
EXTEND_AVAIL_COLLATERAL = get_bals.get('available_for_trade', 0) if get_bals.get('collateral_name', None)==EXTEND_RH_ASSET else 0 EXTEND_AVAIL_COLLATERAL = get_bals.get('available_for_trade', 0) if get_bals.get('collateral_name', None)==EXTEND_RH_ASSET else 0
async def get_extend_notional(resp: dict | None = None): async def get_extend_notional(resp: dict | None = None):
global EXTEND_NOTIONAL_OBJ
global EXTEND_NOTIONAL_POSITION global EXTEND_NOTIONAL_POSITION
global EXTEND_UNREALIZED_PNL global EXTEND_UNREALIZED_PNL
global EXTEND_MULT global EXTEND_MULT
if not resp: previous_notional_obj = EXTEND_NOTIONAL_OBJ
resp = dict(await EXTEND_CLIENT.account.get_positions()).get('data', {})
pos_dict = [dict(d) for d in resp if dict(d).get('market') == EXTEND_TICKER]
if not pos_dict:
logging.info('get_extend_notional - No Positions')
else:
pos_dict = pos_dict[0]
EXTEND_UNREALIZED_PNL = pos_dict.get('unrealised_pnl', 0)
previous_notional_position = EXTEND_NOTIONAL_POSITION previous_notional_position = EXTEND_NOTIONAL_POSITION
if not resp:
resp = dict(await EXTEND_CLIENT.account.get_positions()).get('data', [])
pos_dict = [dict(d) for d in resp if dict(d).get('market') == EXTEND_TICKER]
if pos_dict:
pos_dict = pos_dict[0]
else:
pos_dict = {}
pos_dict['side'] = 'LONG'
pos_dict['value'] = 0.00
logging.info('get_extend_notional - No Positions')
pos_dict['timestamp_arrival'] = round(datetime.now().timestamp()*1000)
else:
pos_dict = [dict(d) for d in resp if dict(d).get('market') == EXTEND_TICKER]
if pos_dict:
pos_dict = pos_dict[0]
else:
pos_dict = {}
pos_dict['side'] = 'LONG'
pos_dict['value'] = 0.00
logging.info('get_extend_notional - No Positions')
if previous_notional_obj is not None:
if previous_notional_obj['timestamp_arrival'] > pos_dict['timestamp_arrival']:
# logging.info(f'EXTEND NOTIONAL: prev timestamp ({pd.to_datetime(previous_notional_obj['timestamp_arrival'], unit='ms')}) > new timestamp ({pd.to_datetime(d['timestamp_arrival'], unit='ms')}); skipping')
return
EXTEND_NOTIONAL_OBJ = pos_dict
EXTEND_UNREALIZED_PNL = pos_dict.get('unrealised_pnl', 0)
position_side = pos_dict['side'] # LONG or SHORT position_side = pos_dict['side'] # LONG or SHORT
notional_pos_abs = abs(float(pos_dict['value'])) notional_pos_abs = abs(float(pos_dict['value']))
if position_side == 'LONG': if position_side == 'LONG':
@@ -375,7 +399,7 @@ async def run_algo():
logging.info(f'EXTEND ORDER ({order_id}): {order_orig_status} -> {order_update_status}') logging.info(f'EXTEND ORDER ({order_id}): {order_orig_status} -> {order_update_status}')
EXTEND_OPEN_ORDERS[idx] = order_update EXTEND_OPEN_ORDERS[idx] = order_update
if order_update_status in ['CANCELLED','EXPIRED','REJECTED']: if order_update_status in ['CANCELLED','EXPIRED','REJECTED']:
logging.info(f'EXTEND ORDER CANCELLED or EXPIRED: {order_id}') logging.info(f'EXTEND ORDER CANCELLED, REJECTED or EXPIRED: {order_id}')
EXTEND_OPEN_ORDERS.pop(idx) EXTEND_OPEN_ORDERS.pop(idx)
elif order_update_status in ['PARTIALLY_FILLED']: elif order_update_status in ['PARTIALLY_FILLED']:
logging.info(f'EXTEND ORDER PARTIALLY FILLED: {order_id}') logging.info(f'EXTEND ORDER PARTIALLY FILLED: {order_id}')
@@ -394,7 +418,6 @@ async def run_algo():
min_between_fundings = round((abs(ASTER_FUND_RATE_TIME - EXTEND_FUND_RATE_TIME) / 1000 / 60)) min_between_fundings = round((abs(ASTER_FUND_RATE_TIME - EXTEND_FUND_RATE_TIME) / 1000 / 60))
FUNDINGS_AT_SAME_TIME_NEXT_HR = min_between_fundings < 5 FUNDINGS_AT_SAME_TIME_NEXT_HR = min_between_fundings < 5
# FUNDINGS_AT_SAME_TIME_NEXT_HR = ( (ASTER_FUND_RATE_TIME < 60*60*1000) and (EXTEND_FUND_RATE < 60*60*1000) )
if ( abs(ASTER_FUND_RATE) > abs(EXTEND_FUND_RATE) ) and FUNDINGS_AT_SAME_TIME_NEXT_HR: if ( abs(ASTER_FUND_RATE) > abs(EXTEND_FUND_RATE) ) and FUNDINGS_AT_SAME_TIME_NEXT_HR:
@@ -470,8 +493,11 @@ async def run_algo():
Expected_Alpha_Net_FR_w_Taker = Expected_Alpha_Net_FR-0.0002 Expected_Alpha_Net_FR_w_Taker = Expected_Alpha_Net_FR-0.0002
Expected_Alpha_w_Taker = Expected_Alpha-0.0002 Expected_Alpha_w_Taker = Expected_Alpha-0.0002
EXTEND_TGT_NOTIONAL = ASTER_NOTIONAL_POSITION * -1
ASTER_TGT_TAIL = ASTER_TGT_NOTIONAL - ( float(ASTER_NOTIONAL_POSITION) + float(ASTER_UNREALIZED_PNL) ) ASTER_TGT_TAIL = ASTER_TGT_NOTIONAL - ( float(ASTER_NOTIONAL_POSITION) + float(ASTER_UNREALIZED_PNL) )
EXTEND_TGT_TAIL = EXTEND_TGT_NOTIONAL - ( float(EXTEND_NOTIONAL_POSITION) + float(EXTEND_UNREALIZED_PNL) ) EXTEND_TGT_TAIL = EXTEND_TGT_NOTIONAL - ( float(EXTEND_NOTIONAL_POSITION) + float(EXTEND_UNREALIZED_PNL) )
# EXTEND_TGT_TAIL = float(ASTER_NOTIONAL_POSITION)*-1
ASTER_TGT_TAIL_BASE_QTY = Decimal(str(float(ASTER_TGT_TAIL) / float(ASTER_TOB_PX))).quantize(Decimal(str(0.001)), rounding=ROUND_DOWN) ASTER_TGT_TAIL_BASE_QTY = Decimal(str(float(ASTER_TGT_TAIL) / float(ASTER_TOB_PX))).quantize(Decimal(str(0.001)), rounding=ROUND_DOWN)
EXTEND_TGT_TAIL_BASE_QTY = Decimal(str(float(EXTEND_TGT_TAIL) / float(EXTEND_TOB_PX))).quantize(Decimal(str(0.001)), rounding=ROUND_DOWN) EXTEND_TGT_TAIL_BASE_QTY = Decimal(str(float(EXTEND_TGT_TAIL) / float(EXTEND_TOB_PX))).quantize(Decimal(str(0.001)), rounding=ROUND_DOWN)
@@ -481,6 +507,9 @@ async def run_algo():
ASTER_TGT_TAIL_ORDERABLE = abs(ASTER_TGT_TAIL_BASE_QTY) >= MAX_MIN_ORDER_QTY ASTER_TGT_TAIL_ORDERABLE = abs(ASTER_TGT_TAIL_BASE_QTY) >= MAX_MIN_ORDER_QTY
EXTEND_TGT_TAIL_ORDERABLE = abs(EXTEND_TGT_TAIL_BASE_QTY) >= MAX_MIN_ORDER_QTY EXTEND_TGT_TAIL_ORDERABLE = abs(EXTEND_TGT_TAIL_BASE_QTY) >= MAX_MIN_ORDER_QTY
Hedge_Ratio = abs(( abs( max([abs(float(EXTEND_NOTIONAL_POSITION)), 0.01]) / max([abs(float(ASTER_NOTIONAL_POSITION)), 0.01]) ) - 1 ) * 100)
Currently_Hedged = Hedge_Ratio < 1.00
def print_summary(use_logging: bool = False): def print_summary(use_logging: bool = False):
OUT: print | logging.info = logging.info if use_logging else print OUT: print | logging.info = logging.info if use_logging else print
@@ -497,14 +526,15 @@ async def run_algo():
NET FUNDING : {NEXT_NET_FUNDING_RATE:.6%} [{NEXT_NET_FUNDING_RATE*10_000:.2f}bps] [{NEXT_NET_FUNDING_RATE*1_000_000:.0f}pips]; Is Zero?: {Flags.NET_FUNDING_IS_ZERO} [Min: {ALGO_CONFIG.Min_Fund_Rate_Pct_To_Trade}] NET FUNDING : {NEXT_NET_FUNDING_RATE:.6%} [{NEXT_NET_FUNDING_RATE*10_000:.2f}bps] [{NEXT_NET_FUNDING_RATE*1_000_000:.0f}pips]; Is Zero?: {Flags.NET_FUNDING_IS_ZERO} [Min: {ALGO_CONFIG.Min_Fund_Rate_Pct_To_Trade}]
ALPHA SIDE : {ALPHA_EXCH} [{ALPHA_CARRY_SIDE}] ALPHA SIDE : {ALPHA_EXCH} [{ALPHA_CARRY_SIDE}]
TGT NOTIONAL: $ {ALGO_CONFIG.Max_Target_Notional if not Flags.NET_FUNDING_IS_ZERO else 0.00}; Flatten Open Positions Flag? {ALGO_CONFIG.Flatten_Open_Positions} TGT NOTIONAL: $ {abs(ALPHA_TGT_NOTIONAL):.2f}; Flatten Open Positions Flag? {ALGO_CONFIG.Flatten_Open_Positions}
ASTER: {ASTER_NOTIONAL_POSITION:.4f} -> {ASTER_TGT_NOTIONAL:.2f} [ Remain: {ASTER_TGT_TAIL:.4f} ] | EXTEND: {EXTEND_NOTIONAL_POSITION:.4f} -> {EXTEND_TGT_NOTIONAL:.2f} [ Remain: {EXTEND_TGT_TAIL:.4f} ] ASTER: {ASTER_NOTIONAL_POSITION:.4f} -> {ASTER_TGT_NOTIONAL:.2f} [ Remain: {ASTER_TGT_TAIL:.4f} ] | EXTEND: {EXTEND_NOTIONAL_POSITION:.4f} -> {EXTEND_TGT_NOTIONAL:.2f} [ Remain: {EXTEND_TGT_TAIL:.4f} ]
ASTER: {ASTER_TGT_NOTIONAL:.2f} - {ASTER_NOTIONAL_POSITION:.2f} + {ASTER_UNREALIZED_PNL:.2f} = {ASTER_TGT_TAIL:2f} | EXTEND: {EXTEND_TGT_NOTIONAL:.2f} - {EXTEND_NOTIONAL_POSITION:.2f} + {EXTEND_UNREALIZED_PNL:.2f} = {EXTEND_TGT_TAIL:2f} ASTER: {ASTER_TGT_NOTIONAL:.2f} - {ASTER_NOTIONAL_POSITION:.2f} + {ASTER_UNREALIZED_PNL:.2f} = {ASTER_TGT_TAIL:2f} | EXTEND: {EXTEND_TGT_NOTIONAL:.2f} - {EXTEND_NOTIONAL_POSITION:.2f} + {EXTEND_UNREALIZED_PNL:.2f} = {EXTEND_TGT_TAIL:2f}
ASTER: {ASTER_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {ASTER_TGT_TAIL_ORDERABLE} ] | EXTEND: {EXTEND_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {EXTEND_TGT_TAIL_ORDERABLE} ] ASTER: {ASTER_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {ASTER_TGT_TAIL_ORDERABLE} ] | EXTEND: {EXTEND_TGT_TAIL_BASE_QTY:.4f} > {MAX_MIN_ORDER_QTY:.4f} min [ Order: {EXTEND_TGT_TAIL_ORDERABLE} ]
ALPHA: {ALPHA_RATIO:.8f} ALPHA_RATIO: {Alpha_Nominator:_.2f} / {Alpha_Denominator:_.2f}; Expected_Alpha = {Expected_Alpha:.6f} + FR[{NEXT_NET_FUNDING_RATE:.6f}] = * {Expected_Alpha_Net_FR:.6f} * ALPHA: {ALPHA_RATIO:.8f} ALPHA_RATIO: {Alpha_Nominator:_.2f} / {Alpha_Denominator:_.2f} (Px Diff: {abs(Alpha_Nominator-Alpha_Denominator):.2f}); Expected_Alpha = {Expected_Alpha:.6f} + FR[{NEXT_NET_FUNDING_RATE:.6f}] = * {Expected_Alpha_Net_FR:.6f} *
FEES : TAKER: {0.02:.2%}; Expected Alpha w Taker = {Expected_Alpha_Net_FR-0.0002:.6f} [w/o FR: {Expected_Alpha_w_Taker:.6f}] FEES : TAKER: {0.0002:.2%}; Expected Alpha w Taker = {Expected_Alpha_Net_FR-0.0002:.6f} [w/o FR: {Expected_Alpha_w_Taker:.6f}]
HEDGE: {Hedge_Ratio:.2f}% <= {1:.2f}%: {Currently_Hedged} [{EXTEND_NOTIONAL_POSITION:.2f} / {ASTER_NOTIONAL_POSITION:.2f}]
--- ASTER OPEN ORDERS --- --- ASTER OPEN ORDERS ---
@@ -521,10 +551,17 @@ async def run_algo():
# print_summary() # print_summary()
### ROUTES ### ### ROUTES ###
# MIN_EXPECTED_ALPHA_TO_TRADE = 0.0001
MIN_EXPECTED_ALPHA_TO_TRADE = -0.000001
# ALPHA RATIO CHECK # ALPHA RATIO CHECK
if not( ( Expected_Alpha_w_Taker > 0 ) or ( ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS ) ): if not( ( Expected_Alpha_w_Taker > MIN_EXPECTED_ALPHA_TO_TRADE ) or ( ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS ) or ALGO_CONFIG.Flatten_Open_Positions ):
# logging.info(f'Alpha Ratio too low ({ALPHA_RATIO:.8f}) and no Open Orders...') # logging.info(f'Alpha Ratio too low ({ALPHA_RATIO:.8f}) and no Open Orders...')
pass pass
elif ( Expected_Alpha_w_Taker <= MIN_EXPECTED_ALPHA_TO_TRADE ) and ( ASTER_OPEN_ORDERS or EXTEND_OPEN_ORDERS ) and Currently_Hedged:
await aster_cancel_all_orders()
await extend_cancel_all_orders()
logging.info('Expected_Alpha went away with open orders...cancelling since we are currently hedged...')
time.sleep( (1/1000)*100 ) # 100ms wait for ws cancel response
else: else:
# logging.info(f'*** Alpha Ratio HIT - LETS ORDER: {ALPHA_RATIO:.8f}') # logging.info(f'*** Alpha Ratio HIT - LETS ORDER: {ALPHA_RATIO:.8f}')
# ASTER # ASTER
@@ -575,7 +612,7 @@ async def run_algo():
'symbol': symbol, 'symbol': symbol,
'side': side, 'side': side,
'type': 'LIMIT', 'type': 'LIMIT',
'timeInForce': 'GTC', 'timeInForce': 'GTX',
'quantity': qty, 'quantity': qty,
'price': price, 'price': price,
} }
@@ -625,7 +662,7 @@ async def run_algo():
open_order_px = 0 open_order_px = 0
place_order = True place_order = True
if place_order: if place_order:
price = Decimal(str(price)).quantize(Decimal(str(0.01)), rounding=ROUND_DOWN) price = Decimal(str(price)).quantize(Decimal(str(0.1)), rounding=ROUND_DOWN)
if round(open_order_px - float(price), 2) == 0.00: if round(open_order_px - float(price), 2) == 0.00:
logging.info('EXTEND OPEN ORDER NO PX CHG; SKIPPING') logging.info('EXTEND OPEN ORDER NO PX CHG; SKIPPING')
else: else:
@@ -674,7 +711,7 @@ async def run_algo():
continue continue
else: else:
time.sleep(ALGO_CONFIG.Loop_Sleep_Sec) time.sleep(ALGO_CONFIG.Loop_Sleep_Sec)
# logging.info(f'_____ End No Open Orders _____ (Algo Engine ms: {(time.time() - loop_start)*1000:.2f}); Sleeping for sec: {ALGO_CONFIG.Loop_Sleep_Sec:.0f}') # print(f'_____ End No Open Orders _____ (Algo Engine ms: {(time.time() - loop_start)*1000:.2f}); Sleeping for sec: {ALGO_CONFIG.Loop_Sleep_Sec:.0f}')
except KeyboardInterrupt: except KeyboardInterrupt:
logging.info('CANCELLING OPEN ORDERS') logging.info('CANCELLING OPEN ORDERS')