|
|
@@ -87,22 +87,21 @@ spread_ema = decimal.Decimal(0)
|
|
|
count = decimal.Decimal(0)
|
|
|
# --- 链上价格获取函数 (Okx) ---
|
|
|
# 返回: price_base_per_target (例如 USDT per RATO)
|
|
|
-def get_chain_price_vs_target_currency(chain_id, in_token_addr, out_token_addr, amount_in_base_human, in_token_decimals, slippage, user_wallet_addr, user_exchange_wallet_addr):
|
|
|
+def get_chain_price(chain_id, out_token_addr):
|
|
|
try:
|
|
|
# amount_in_base_human 已经是 decimal.Decimal 类型的人类可读数量
|
|
|
- in_token_amount_atomic = int(amount_in_base_human * (10 ** in_token_decimals)) # 转为原子单位整数
|
|
|
- data = ok_chain_client.swap(chain_id, in_token_amount_atomic, in_token_addr, out_token_addr, slippage, user_wallet_addr, user_exchange_wallet_addr, 'fast')
|
|
|
+ params = [{
|
|
|
+ 'chainIndex': chain_id,
|
|
|
+ 'tokenContractAddress': out_token_addr,
|
|
|
+ }]
|
|
|
+ data = ok_chain_client.price(params)
|
|
|
|
|
|
if data.get('code') == '0' and data.get('data'):
|
|
|
d = data['data'][0]
|
|
|
- router_result = d['routerResult']
|
|
|
- in_dec, out_dec = int(router_result['fromToken']['decimal']), int(router_result['toToken']['decimal'])
|
|
|
- atomic_in_base, atomic_out_target = decimal.Decimal(router_result['fromTokenAmount']), decimal.Decimal(router_result['toTokenAmount'])
|
|
|
-
|
|
|
- human_in_base = atomic_in_base / (10 ** in_dec)
|
|
|
- human_out_target = atomic_out_target / (10 ** out_dec)
|
|
|
- if human_out_target == 0: return {"error": f"ERC20输出目标代币为0 ({CHAIN_ID})"}, data # data 也返回
|
|
|
- return {"price_base_per_target": human_in_base / human_out_target}, data
|
|
|
+
|
|
|
+ price = decimal.Decimal(d['price'])
|
|
|
+
|
|
|
+ return {"price_base_per_target": price}, data
|
|
|
else:
|
|
|
pprint.pprint(data)
|
|
|
return {
|
|
|
@@ -188,23 +187,11 @@ def calculate_percentage_diff(sell_price, buy_price):
|
|
|
return None
|
|
|
|
|
|
def send_arb_msg(pct, chain_swap_data, cex_price, dex_price):
|
|
|
- # chain_swap_data 是从 get_chain_price_vs_target_currency 返回的第二个值
|
|
|
+ # chain_swap_data 是从 get_chain_price 返回的第二个值
|
|
|
if not (chain_swap_data and chain_swap_data.get('data') and chain_swap_data['data']):
|
|
|
logger.error(f"套利消息发送失败:链上交易数据不完整 {chain_swap_data}")
|
|
|
return
|
|
|
|
|
|
- d = chain_swap_data['data'][0]
|
|
|
- tx = d['tx'] # 这是预签名的交易结构体,不是tx hash
|
|
|
- router_result = d['routerResult']
|
|
|
- from_token_info = router_result['fromToken']
|
|
|
- to_token_info = router_result['toToken']
|
|
|
-
|
|
|
- in_dec, out_dec = int(from_token_info['decimal']), int(to_token_info['decimal'])
|
|
|
- # human_in_base 根据实际传入的 IN_AMOUNT_TO_QUERY (trade_value) 确定
|
|
|
- # human_out_target 是链上swap的实际输出
|
|
|
- atomic_out_target = decimal.Decimal(router_result['toTokenAmount'])
|
|
|
- human_out_target = atomic_out_target / (10 ** out_dec)
|
|
|
-
|
|
|
'''
|
|
|
def get_public_ip_ipify():
|
|
|
"""
|
|
|
@@ -233,7 +220,7 @@ def send_arb_msg(pct, chain_swap_data, cex_price, dex_price):
|
|
|
"cexPrice": str(cex_price),
|
|
|
"dexPrice": str(dex_price),
|
|
|
"symbol": CEX_TARGET_PAIR_USDT,
|
|
|
- "exchangeOutAmount": str(CEX_TRADE_AMOUNT.quantize(decimal.Decimal(f'1e-{out_dec}'))), # CEX上期望卖出的目标币数量
|
|
|
+ "exchangeOutAmount": str(CEX_TRADE_AMOUNT), # CEX上期望卖出的目标币数量
|
|
|
"strategy": STRATEGY,
|
|
|
"queryPriceUrl": query_price_endpoint,
|
|
|
}
|
|
|
@@ -290,16 +277,7 @@ def update_data_for_plotly_and_table():
|
|
|
continue
|
|
|
|
|
|
# 3. 获取链上价格:用 in_amount_to_query_human 这么多的USDT去买目标币,能买到多少,以及价格 (USDT/TARGET)
|
|
|
- dex_data, chain_swap_full_response = get_chain_price_vs_target_currency(
|
|
|
- CHAIN_ID,
|
|
|
- IN_TOKEN_ADDRESS, # USDT
|
|
|
- OUT_TOKEN_ADDRESS, # TARGET
|
|
|
- in_amount_to_query_human, # 花费的USDT数量
|
|
|
- IN_TOKEN_DECIMALS, # USDT的精度
|
|
|
- SLIPPAGE,
|
|
|
- USER_WALLET,
|
|
|
- USER_EXCHANGE_WALLET
|
|
|
- )
|
|
|
+ dex_data, chain_swap_full_response = get_chain_price(CHAIN_ID, OUT_TOKEN_ADDRESS)
|
|
|
dex_price = dex_data.get("price_base_per_target") # USDT/TARGET
|
|
|
dex_err = dex_data.get("error")
|
|
|
|