working aster triggers extend
This commit is contained in:
19
algo.ipynb
19
algo.ipynb
@@ -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))"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
53
aster.ipynb
53
aster.ipynb
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
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",
|
"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
77
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}')
|
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')
|
||||||
|
|||||||
Reference in New Issue
Block a user