ソースを参照

使用综合币价观察价格

skyfffire 2 ヶ月 前
コミット
78c39ad079
3 ファイル変更31 行追加35 行削除
  1. 13 35
      checker/c_erc20_lead_mexc.py
  2. 15 0
      checker/ok_chain_client.py
  3. 3 0
      toto.readme

+ 13 - 35
checker/c_erc20_lead_mexc.py

@@ -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")
 

+ 15 - 0
checker/ok_chain_client.py

@@ -183,6 +183,11 @@ def gas_limit(chain_id, from_addr, to_addr, value, call_data=None):
 
     return send_post_request(post_request_path, post_params)
 
+def price(post_params):
+    post_request_path = '/api/v5/dex/index/current-price'
+
+    return send_post_request(post_request_path, post_params)
+
 def broadcast(chain_id, address, signed_tx):
     post_request_path = '/api/v5/dex/pre-transaction/broadcast-transaction'
     post_params = {
@@ -218,6 +223,16 @@ if __name__ == "__main__":
     import decimal
     from pprint import pprint
 
+    
+    # post_params = [{
+    #     'chainIndex': 1,
+    #     'tokenContractAddress': '0xCaB84bc21F9092167fCFe0ea60f5CE053ab39a1E',
+    # },{
+    #     'chainIndex': 1,
+    #     'tokenContractAddress': '0x673D1713a325E619B9F3fB1ba06c1253DF697601',
+    # }]
+    # pprint(price(post_params))
+
     # pprint(supported_chain())
 
     # pprint(swap(1, decimal.Decimal('1000') * (10 ** 6), '0xdAC17F958D2ee523a2206206994597C13D831ec7', '0xf816507E690f5Aa4E29d164885EB5fa7a5627860', 1, '0xf816507E690f5Aa4E29d164885EB5fa7a5627860'))

+ 3 - 0
toto.readme

@@ -35,6 +35,9 @@
 2025-09-04
 [-] 每个币就放100U
 
+2025-09-08
+[ ] 测试接入ok的price对比
+
 待定
 [ ] 找时间想想怎么管理okx的apikey,先批量注册一堆再说
 [ ] 网格改造(每一格之间的开单间距)