working aster triggers extend
This commit is contained in:
19
algo.ipynb
19
algo.ipynb
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 4,
|
||||
"id": "d1eed397",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -18,7 +18,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 5,
|
||||
"id": "c6151613",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -38,7 +38,7 @@
|
||||
"1"
|
||||
]
|
||||
},
|
||||
"execution_count": 19,
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -46,14 +46,15 @@
|
||||
"source": [
|
||||
"config_update = {\n",
|
||||
" # 'Min_Time_To_Funding_Minutes': 60,\n",
|
||||
" # 'Allow_Ordering_Aster': False,\n",
|
||||
" # 'Allow_Ordering_Extend': False,\n",
|
||||
" 'Loop_Sleep_Sec': 0.00,\n",
|
||||
" 'Min_Fund_Rate_Pct_To_Trade': 0.0001,\n",
|
||||
" # 'Allow_Ordering_Aster': True,\n",
|
||||
" # 'Allow_Ordering_Extend': True,\n",
|
||||
" # 'Loop_Sleep_Sec': 0.00,\n",
|
||||
" # 'Min_Fund_Rate_Pct_To_Trade': 0.001,\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",
|
||||
" # 'Print_Summary_Each_Loop': False,\n",
|
||||
" 'Print_Summary_Each_Loop': True,\n",
|
||||
" 'Flatten_Open_Positions': False,\n",
|
||||
"}\n",
|
||||
"VAL_KEY.publish('fr_orchestrator_input', json.dumps(config_update))"
|
||||
]
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"Config_Updated_Timestamp": 1777388081818,
|
||||
"Config_Updated_Timestamp": 1777411434591,
|
||||
"Allow_Ordering_Aster": true,
|
||||
"Allow_Ordering_Extend": true,
|
||||
"Loop_Sleep_Sec": 0.0,
|
||||
"Max_Target_Notional": 0.0,
|
||||
"Min_Time_To_Funding_Minutes": 60,
|
||||
"Min_Fund_Rate_Pct_To_Trade": 0.000,
|
||||
"Price_Worsener_Aster": 0.01,
|
||||
"Min_Fund_Rate_Pct_To_Trade": 0.0,
|
||||
"Price_Worsener_Aster": 0.0,
|
||||
"Price_Worsener_Extend": -0.1,
|
||||
"Target_Open_Cash_Position": 10,
|
||||
"Log_Summary_Each_Loop": false,
|
||||
"Print_Summary_Each_Loop": true,
|
||||
"Flatten_Open_Positions": true,
|
||||
"Flatten_Open_Positions": false,
|
||||
"Flip_Side_For_Testing": false
|
||||
}
|
||||
55
aster.ipynb
55
aster.ipynb
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": 2,
|
||||
"id": "3a269644",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -12,7 +12,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 4,
|
||||
"id": "4395fabb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -71,52 +71,59 @@
|
||||
" \"method\": \"POST\",\n",
|
||||
" \"params\": {\n",
|
||||
" 'symbol': 'ETHUSDT',\n",
|
||||
" 'side': 'SELL',\n",
|
||||
" 'side': 'BUY',\n",
|
||||
" 'type': 'LIMIT',\n",
|
||||
" 'timeInForce': 'GTC',\n",
|
||||
" 'timeInForce': 'GTX',\n",
|
||||
" 'quantity': '0.01',\n",
|
||||
" 'price': '2500',\n",
|
||||
" 'price': '2300',\n",
|
||||
" }\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 5,
|
||||
"id": "2122885a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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",
|
||||
"execution_count": 4,
|
||||
"execution_count": 6,
|
||||
"id": "e895ac52",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[{'symbol': 'ETHUSDT',\n",
|
||||
" 'positionAmt': '-0.214',\n",
|
||||
" 'entryPrice': '2327.21',\n",
|
||||
" 'markPrice': '2326.46000000',\n",
|
||||
" 'unRealizedProfit': '0.16050000',\n",
|
||||
" 'liquidationPrice': '2444.20070305',\n",
|
||||
" 'leverage': '150',\n",
|
||||
" 'maxNotionalValue': '300000',\n",
|
||||
" 'marginType': 'cross',\n",
|
||||
" 'isolatedMargin': '0.00000000',\n",
|
||||
" 'isAutoAddMargin': 'false',\n",
|
||||
" 'positionSide': 'BOTH',\n",
|
||||
" 'notional': '-497.86244000',\n",
|
||||
" 'isolatedWallet': '0',\n",
|
||||
" 'updateTime': 1777182273777}]"
|
||||
"{'orderId': 17365320734,\n",
|
||||
" 'symbol': 'ETHUSDT',\n",
|
||||
" 'status': 'NEW',\n",
|
||||
" 'clientOrderId': 'RlTsi93X2Qe75bMt2vzC5v',\n",
|
||||
" 'price': '2300',\n",
|
||||
" 'avgPrice': '0.00000',\n",
|
||||
" 'origQty': '0.010',\n",
|
||||
" 'executedQty': '0',\n",
|
||||
" 'cumQty': '0',\n",
|
||||
" 'cumQuote': '0',\n",
|
||||
" 'timeInForce': 'GTX',\n",
|
||||
" 'type': 'LIMIT',\n",
|
||||
" 'reduceOnly': False,\n",
|
||||
" 'closePosition': False,\n",
|
||||
" 'side': 'BUY',\n",
|
||||
" 'positionSide': 'BOTH',\n",
|
||||
" 'stopPrice': '0',\n",
|
||||
" 'workingType': 'CONTRACT_PRICE',\n",
|
||||
" 'priceProtect': False,\n",
|
||||
" 'origType': 'LIMIT',\n",
|
||||
" 'updateTime': 1777411299750,\n",
|
||||
" 'newChainData': {'hash': '0x43deac455e5dc6c77576c7dd21b1c3d1d5d5d6745a30300ddef0a18fc41fa0a3'}}"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
|
||||
2747
engine_best_funding_rate.ipynb
Normal file
2747
engine_best_funding_rate.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
10044
engine_dispersion.ipynb
10044
engine_dispersion.ipynb
File diff suppressed because one or more lines are too long
@@ -27,7 +27,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"id": "ff971ca9",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -59,7 +59,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": null,
|
||||
"id": "c366706f",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -93,6 +93,7 @@
|
||||
" price=ORDER_PRICE,\n",
|
||||
" side=ORDER_SIDE,\n",
|
||||
" taker_fee=Decimal(\"0.00025\"),\n",
|
||||
" post_only=True,\n",
|
||||
" # previous_order_id='1295034892466447624365619416628580523728221205816494340545831832663414858661'\n",
|
||||
")"
|
||||
]
|
||||
@@ -133,9 +134,37 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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",
|
||||
"execution_count": 12,
|
||||
|
||||
111
main.py
111
main.py
@@ -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}')
|
||||
await kill_algo()
|
||||
# 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():
|
||||
global EXTEND_AVAIL_COLLATERAL
|
||||
@@ -174,37 +174,61 @@ 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
|
||||
|
||||
async def get_extend_notional(resp: dict | None = None):
|
||||
global EXTEND_NOTIONAL_OBJ
|
||||
global EXTEND_NOTIONAL_POSITION
|
||||
global EXTEND_UNREALIZED_PNL
|
||||
global EXTEND_MULT
|
||||
|
||||
previous_notional_obj = EXTEND_NOTIONAL_OBJ
|
||||
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 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
|
||||
position_side = pos_dict['side'] # LONG or SHORT
|
||||
notional_pos_abs = abs(float(pos_dict['value']))
|
||||
if position_side == 'LONG':
|
||||
notional_pos_sided = notional_pos_abs
|
||||
elif position_side == 'SHORT':
|
||||
notional_pos_sided = notional_pos_abs * -1
|
||||
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:
|
||||
logging.info(f'EXTEND BAD SIDE ON POSITION UPDATE: {pos_dict}')
|
||||
pos_dict = {}
|
||||
pos_dict['side'] = 'LONG'
|
||||
pos_dict['value'] = 0.00
|
||||
logging.info('get_extend_notional - No Positions')
|
||||
|
||||
EXTEND_NOTIONAL_POSITION = notional_pos_sided - float(EXTEND_UNREALIZED_PNL)
|
||||
EXTEND_MULT = pos_dict.get('leverage', EXTEND_MULT)
|
||||
if abs(EXTEND_NOTIONAL_POSITION) > ALGO_CONFIG.Max_Target_Notional*2.01:
|
||||
logging.info(f'BAD NOTIONAL - EXTEND CHANGE: {previous_notional_position} -> {EXTEND_NOTIONAL_POSITION}; UR PNL: {EXTEND_UNREALIZED_PNL}; MULT: {EXTEND_MULT}; d: {pos_dict}; resp: {resp}')
|
||||
await kill_algo()
|
||||
if EXTEND_NOTIONAL_POSITION != previous_notional_position:
|
||||
logging.info(f'EXTEND NOTIONAL CHANGE: {previous_notional_position} -> {EXTEND_NOTIONAL_POSITION:.2f}; UR PNL: {EXTEND_UNREALIZED_PNL:.2f}; MULT: {EXTEND_MULT:.0f}; resp: {bool(resp)}')
|
||||
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
|
||||
notional_pos_abs = abs(float(pos_dict['value']))
|
||||
if position_side == 'LONG':
|
||||
notional_pos_sided = notional_pos_abs
|
||||
elif position_side == 'SHORT':
|
||||
notional_pos_sided = notional_pos_abs * -1
|
||||
else:
|
||||
logging.info(f'EXTEND BAD SIDE ON POSITION UPDATE: {pos_dict}')
|
||||
|
||||
EXTEND_NOTIONAL_POSITION = notional_pos_sided - float(EXTEND_UNREALIZED_PNL)
|
||||
EXTEND_MULT = pos_dict.get('leverage', EXTEND_MULT)
|
||||
if abs(EXTEND_NOTIONAL_POSITION) > ALGO_CONFIG.Max_Target_Notional*2.01:
|
||||
logging.info(f'BAD NOTIONAL - EXTEND CHANGE: {previous_notional_position} -> {EXTEND_NOTIONAL_POSITION}; UR PNL: {EXTEND_UNREALIZED_PNL}; MULT: {EXTEND_MULT}; d: {pos_dict}; resp: {resp}')
|
||||
await kill_algo()
|
||||
if EXTEND_NOTIONAL_POSITION != previous_notional_position:
|
||||
logging.info(f'EXTEND NOTIONAL CHANGE: {previous_notional_position} -> {EXTEND_NOTIONAL_POSITION:.2f}; UR PNL: {EXTEND_UNREALIZED_PNL:.2f}; MULT: {EXTEND_MULT:.0f}; resp: {bool(resp)}')
|
||||
|
||||
### EXCHANGE INFO ###
|
||||
async def get_aster_exch_info():
|
||||
@@ -375,7 +399,7 @@ async def run_algo():
|
||||
logging.info(f'EXTEND ORDER ({order_id}): {order_orig_status} -> {order_update_status}')
|
||||
EXTEND_OPEN_ORDERS[idx] = order_update
|
||||
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)
|
||||
elif order_update_status in ['PARTIALLY_FILLED']:
|
||||
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))
|
||||
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:
|
||||
@@ -470,8 +493,11 @@ async def run_algo():
|
||||
Expected_Alpha_Net_FR_w_Taker = Expected_Alpha_Net_FR-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) )
|
||||
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)
|
||||
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
|
||||
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):
|
||||
OUT: print | logging.info = logging.info if use_logging else print
|
||||
|
||||
@@ -491,20 +520,21 @@ async def run_algo():
|
||||
ASTER: {ASTER_FUND_RATE:.6%} [{ASTER_FUND_RATE*10_000:.2f}bps] [{ASTER_FUND_RATE*1_000_000:.0f}pips] | EXTEND: {EXTEND_FUND_RATE:.6%} [{EXTEND_FUND_RATE*10_000:.2f}bps] [{EXTEND_FUND_RATE*1_000_000:.0f}pips]
|
||||
ASTER: {'LONG PAYS SHORT' if ASTER_FUND_RATE > 0 else 'SHORT PAYS LONG'} | EXTEND: {'LONG PAYS SHORT' if EXTEND_FUND_RATE > 0 else 'SHORT PAYS LONG'}
|
||||
ASTER: [ Available Collateral: {ASTER_AVAIL_COLLATERAL:.4f} ] | EXTEND: [ Available Collateral: {EXTEND_AVAIL_COLLATERAL:.4f} ]
|
||||
ASTER: [ Notional Position $ : {ASTER_NOTIONAL_POSITION:.4f} ] | EXTEND: [ Notional Position $ : {EXTEND_NOTIONAL_POSITION:.4f} ]
|
||||
ASTER: [ Notional Position $ : {ASTER_NOTIONAL_POSITION:.4f} ] | EXTEND: [ Notional Position $ : {EXTEND_NOTIONAL_POSITION:.4f} ]
|
||||
|
||||
SAME TIME? : {FUNDINGS_AT_SAME_TIME_NEXT_HR} [ Minutes Between Fundings: {min_between_fundings} ]
|
||||
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}]
|
||||
|
||||
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_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_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} ]
|
||||
|
||||
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} *
|
||||
FEES : TAKER: {0.02:.2%}; Expected Alpha w Taker = {Expected_Alpha_Net_FR-0.0002:.6f} [w/o FR: {Expected_Alpha_w_Taker:.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.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 ---
|
||||
@@ -521,10 +551,17 @@ async def run_algo():
|
||||
# print_summary()
|
||||
|
||||
### ROUTES ###
|
||||
# MIN_EXPECTED_ALPHA_TO_TRADE = 0.0001
|
||||
MIN_EXPECTED_ALPHA_TO_TRADE = -0.000001
|
||||
# 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...')
|
||||
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:
|
||||
# logging.info(f'*** Alpha Ratio HIT - LETS ORDER: {ALPHA_RATIO:.8f}')
|
||||
# ASTER
|
||||
@@ -575,7 +612,7 @@ async def run_algo():
|
||||
'symbol': symbol,
|
||||
'side': side,
|
||||
'type': 'LIMIT',
|
||||
'timeInForce': 'GTC',
|
||||
'timeInForce': 'GTX',
|
||||
'quantity': qty,
|
||||
'price': price,
|
||||
}
|
||||
@@ -625,7 +662,7 @@ async def run_algo():
|
||||
open_order_px = 0
|
||||
place_order = True
|
||||
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:
|
||||
logging.info('EXTEND OPEN ORDER NO PX CHG; SKIPPING')
|
||||
else:
|
||||
@@ -674,7 +711,7 @@ async def run_algo():
|
||||
continue
|
||||
else:
|
||||
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:
|
||||
logging.info('CANCELLING OPEN ORDERS')
|
||||
|
||||
Reference in New Issue
Block a user