|
|
@@ -85,12 +85,10 @@ class ArbitrageProcess:
|
|
|
|
|
|
# 存储当前套利交易的细节信息,例如买入数量、价格等
|
|
|
self.sell_price = Decimal(0)
|
|
|
+ self.sell_value = Decimal(0) # 实际卖出价值
|
|
|
self.buy_price = Decimal(0)
|
|
|
self.chain_tx_hash = None # 链上买入的tx hash
|
|
|
self.exchange_sell_amount = Decimal(process_item['exchangeOutAmount']) # 交易所卖出量
|
|
|
- self.exchange_sell_order_id = None # 交易所卖出id
|
|
|
- self.exchange_withdrawal_id = None # 交易所提现id
|
|
|
- self.exchange_withdrawal_amount = None # 交易所提现数量
|
|
|
self.actual_profit = Decimal(0) # 實際利潤
|
|
|
|
|
|
# 定义可能的状态
|
|
|
@@ -306,95 +304,77 @@ class ArbitrageProcess:
|
|
|
logger.info(msg)
|
|
|
add_state_flow_entry(self.process_item, self.current_state, msg, "pending")
|
|
|
try:
|
|
|
- # 第一步直接卖出,这个数量用固定数量
|
|
|
- pseudo_amount_to_sell = self.exchange_sell_amount
|
|
|
- # 处理精度
|
|
|
- pseudo_amount_to_sell = pseudo_amount_to_sell.quantize(self.coin_asset_precision, rounding=ROUND_DOWN)
|
|
|
-
|
|
|
- order_params = {
|
|
|
- "symbol": self.symbol.replace('_', ''),
|
|
|
- "side": "SELL",
|
|
|
- "type": "MARKET",
|
|
|
- "quantity": int(pseudo_amount_to_sell),
|
|
|
- }
|
|
|
- order_params_formated = pformat(order_params, indent=2)
|
|
|
-
|
|
|
- exchange_sell_order = mexc.trade.post_order(order_params)
|
|
|
- exchange_sell_order_formated = pformat(exchange_sell_order, indent=2)
|
|
|
-
|
|
|
- msg = f"交易所现货卖出订单已发送 \n params:{order_params_formated} \n rst: {exchange_sell_order_formated}"
|
|
|
- if 'orderId' not in exchange_sell_order:
|
|
|
- logger.error(msg)
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
- self._set_state(self.STATE_FAILED)
|
|
|
-
|
|
|
- return
|
|
|
-
|
|
|
- self.exchange_sell_order_id = exchange_sell_order['orderId']
|
|
|
+ order_times = 0
|
|
|
+ self.already_sold_amount = Decimal(0)
|
|
|
+ while self.already_sold_amount < self.exchange_sell_amount and order_times < 5:
|
|
|
+ order_times = order_times + 1
|
|
|
+ # 第一步直接买入,这个数量用固定数量
|
|
|
+ pseudo_amount_to_sell = self.exchange_sell_amount - self.already_sold_amount
|
|
|
+ # 处理精度
|
|
|
+ pseudo_amount_to_sell = pseudo_amount_to_sell.quantize(self.coin_asset_precision, rounding=ROUND_DOWN)
|
|
|
|
|
|
- logger.info(msg)
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "success")
|
|
|
-
|
|
|
- self._set_state(self.STATE_WAITING_SELL_CONFIRM)
|
|
|
- except Exception as e:
|
|
|
- exc_traceback = traceback.format_exc()
|
|
|
- msg = f"交易所现货卖出下单失败\n{exc_traceback}"
|
|
|
- logger.error(msg)
|
|
|
-
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
- self._set_state(self.STATE_FAILED)
|
|
|
-
|
|
|
- # traceback.print_exc()
|
|
|
-
|
|
|
- def _wait_sell_confirm(self):
|
|
|
- """
|
|
|
- 等待交易所现货卖出订单确认(完全成交)
|
|
|
- """
|
|
|
- exchange_sell_order_id = self.exchange_sell_order_id
|
|
|
- msg = f"等待交易所现货卖出订单确认:{exchange_sell_order_id}"
|
|
|
- logger.info(msg)
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "pending")
|
|
|
-
|
|
|
- try:
|
|
|
- # 查询交易所订单状态
|
|
|
- waiting_times = 30
|
|
|
- last_order = None
|
|
|
- while waiting_times > 0:
|
|
|
- params = {
|
|
|
+ order_params = {
|
|
|
"symbol": self.symbol.replace('_', ''),
|
|
|
- "orderId": exchange_sell_order_id
|
|
|
+ "side": "SELL",
|
|
|
+ "type": "MARKET",
|
|
|
+ "quantity": float(pseudo_amount_to_sell),
|
|
|
}
|
|
|
- order = mexc.trade.get_order(params)
|
|
|
- last_order = order
|
|
|
-
|
|
|
- if order['status'] in ["FILLED", "PARTIALLY_CANCELED"]:
|
|
|
- money = Decimal(order['cummulativeQuoteQty'])
|
|
|
- amount = Decimal(order['executedQty'])
|
|
|
+ order_params_formated = pformat(order_params, indent=2)
|
|
|
+
|
|
|
+ exchange_sell_order = mexc.trade.post_order(order_params)
|
|
|
+ exchange_sell_order_formated = pformat(exchange_sell_order, indent=2)
|
|
|
|
|
|
- self.sell_price = money / amount
|
|
|
- self.sell_price = self.sell_price.quantize(self.price_precision, rounding=ROUND_DOWN)
|
|
|
+ msg = f"交易所现货卖出订单已发送 \n params:{order_params_formated} \n rst: {exchange_sell_order_formated}"
|
|
|
+ if 'orderId' not in exchange_sell_order:
|
|
|
+ logger.error(msg)
|
|
|
+ add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
|
|
|
- order_formated = pformat(order, indent=2)
|
|
|
- msg = f"交易所现货卖出订单已完成, 价格:{self.sell_price}, money: {money}\n order: {order_formated}"
|
|
|
- logger.info(msg)
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "success")
|
|
|
+ continue
|
|
|
|
|
|
- self.exchange_withdrawal_amount = money
|
|
|
+ # 查询交易所订单状态
|
|
|
+ exchange_sell_order_id = exchange_sell_order['orderId']
|
|
|
+ waiting_times = 5
|
|
|
+ while waiting_times > 0:
|
|
|
+ params = {
|
|
|
+ "symbol": self.symbol.replace('_', ''),
|
|
|
+ "orderId": exchange_sell_order_id
|
|
|
+ }
|
|
|
+ order = mexc.trade.get_order(params)
|
|
|
+
|
|
|
+ if order['status'] in ["FILLED", "PARTIALLY_CANCELED"]:
|
|
|
+ # 以实际成交数量为准
|
|
|
+ money = Decimal(order['cummulativeQuoteQty'])
|
|
|
+ self.already_sold_amount = self.already_sold_amount + Decimal(order['executedQty'])
|
|
|
+
|
|
|
+ self.sell_value = self.sell_value + money
|
|
|
+ self.sell_price = self.sell_value / self.already_sold_amount
|
|
|
+ self.sell_price = self.sell_price.quantize(self.price_precision, rounding=ROUND_DOWN)
|
|
|
+
|
|
|
+ order_formated = pformat(order, indent=2)
|
|
|
+ msg = f"交易所现货卖出订单已完成, 价格:{self.buy_price}, money: {money}\n order: {order_formated}"
|
|
|
+ logger.info(msg)
|
|
|
+ add_state_flow_entry(self.process_item, self.current_state, msg, "success")
|
|
|
+
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ time.sleep(1)
|
|
|
+ waiting_times = waiting_times - 1
|
|
|
+
|
|
|
+ if order_times <= 5:
|
|
|
+ msg = 'mexc现货卖出流程完成'
|
|
|
+ logger.info(msg)
|
|
|
+ add_state_flow_entry(self.process_item, self.current_state, msg, "success")
|
|
|
|
|
|
- self._set_state(self.STATE_BUYING_ON_CHAIN)
|
|
|
- return
|
|
|
- else:
|
|
|
- time.sleep(1)
|
|
|
- waiting_times = waiting_times - 1
|
|
|
+ self._set_state(self.STATE_BUYING_ON_CHAIN)
|
|
|
+ else:
|
|
|
+ msg = 'mexc现货卖出流程失败, 重试次数大于5'
|
|
|
+ logger.info(msg)
|
|
|
+ add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
|
|
|
- last_order_formated = pformat(last_order, indent=2)
|
|
|
- msg = f"交易所现货卖出订单失敗, 最後狀態:\n{last_order_formated}。"
|
|
|
- logger.info(msg)
|
|
|
- add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
- self._set_state(self.STATE_FAILED)
|
|
|
+ self._set_state(self.STATE_WAITING_EXCHANGE_ROLLBACK)
|
|
|
except Exception as e:
|
|
|
exc_traceback = traceback.format_exc()
|
|
|
- msg = f"查询交易所现货卖出订单状态时发生错误\n{exc_traceback}"
|
|
|
+ msg = f"交易所现货卖出下单失败\n{exc_traceback}"
|
|
|
logger.error(msg)
|
|
|
|
|
|
add_state_flow_entry(self.process_item, self.current_state, msg, "fail")
|
|
|
@@ -564,8 +544,6 @@ class ArbitrageProcess:
|
|
|
logger.info(msg)
|
|
|
add_state_flow_entry(self.process_item, self.current_state, msg, "success")
|
|
|
|
|
|
- self.exchange_withdrawal_amount = self.exchange_withdrawal_amount + money
|
|
|
-
|
|
|
break
|
|
|
else:
|
|
|
time.sleep(1)
|
|
|
@@ -635,7 +613,7 @@ class ArbitrageProcess:
|
|
|
add_state_flow_entry(self.process_item, self.current_state, msg, "pending")
|
|
|
try:
|
|
|
# 使用预提现数量进行回滚
|
|
|
- pseudo_amount_to_buy = Decimal(self.exchange_withdrawal_amount)
|
|
|
+ pseudo_amount_to_buy = Decimal(self.sell_value)
|
|
|
# 处理精度
|
|
|
pseudo_amount_to_buy = pseudo_amount_to_buy.quantize(self.base_coin_asset_precision, rounding=ROUND_DOWN)
|
|
|
|