85
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								main.py
									
									
									
									
									
								
							@@ -1,6 +1,8 @@
 | 
				
			|||||||
 | 
					import csv
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
from typing import Dict, List, Optional, Tuple
 | 
					from typing import Any, Dict, List, Optional, Tuple
 | 
				
			||||||
from dataclasses import dataclass
 | 
					from dataclasses import dataclass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import mexc_spot_v3
 | 
					import mexc_spot_v3
 | 
				
			||||||
@@ -49,6 +51,8 @@ class GridTradingBot:
 | 
				
			|||||||
        参数:
 | 
					        参数:
 | 
				
			||||||
            conf (Dict): 配置字典,包含:
 | 
					            conf (Dict): 配置字典,包含:
 | 
				
			||||||
                - symbol: 交易对 (如 'BTCUSDC')
 | 
					                - symbol: 交易对 (如 'BTCUSDC')
 | 
				
			||||||
 | 
					                - csv_symbol: CSV中映射的交易对 (如 'BTCUSDT')
 | 
				
			||||||
 | 
					                - csv_file: CSV记录文件 (如 'output/mexc-spot-grid-trades.csv')
 | 
				
			||||||
                - grid_percentage: 每格百分比 (如 0.005 表示 0.5%)
 | 
					                - grid_percentage: 每格百分比 (如 0.005 表示 0.5%)
 | 
				
			||||||
                - grid_count: 单边网格数量 (如 3)
 | 
					                - grid_count: 单边网格数量 (如 3)
 | 
				
			||||||
                - order_amount: 每单加密货币数量 (如 0.00001 BTC)
 | 
					                - order_amount: 每单加密货币数量 (如 0.00001 BTC)
 | 
				
			||||||
@@ -62,6 +66,8 @@ class GridTradingBot:
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
        self.config = conf
 | 
					        self.config = conf
 | 
				
			||||||
        self.symbol = conf["symbol"]
 | 
					        self.symbol = conf["symbol"]
 | 
				
			||||||
 | 
					        self.csv_symbol = conf["csv_symbol"]
 | 
				
			||||||
 | 
					        self.csv_file = conf["csv_file"]
 | 
				
			||||||
        self.grid_percentage = conf["grid_percentage"]
 | 
					        self.grid_percentage = conf["grid_percentage"]
 | 
				
			||||||
        self.grid_count = conf["grid_count"]
 | 
					        self.grid_count = conf["grid_count"]
 | 
				
			||||||
        self.order_amount = conf["order_amount"]
 | 
					        self.order_amount = conf["order_amount"]
 | 
				
			||||||
@@ -85,6 +91,78 @@ class GridTradingBot:
 | 
				
			|||||||
        self.running = False
 | 
					        self.running = False
 | 
				
			||||||
        logger.info("[GridTradingBot.__init__] GridTradingBot initialized successfully")
 | 
					        logger.info("[GridTradingBot.__init__] GridTradingBot initialized successfully")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def record_transaction(self, order_response: Dict[str, Any]) -> bool:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        记录交易到CSV文件
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            order_data: 订单数据字典
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            是否成功记录
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            csv_symbol = self.csv_symbol
 | 
				
			||||||
 | 
					            order_id = order_response["orderId"]
 | 
				
			||||||
 | 
					            executed_qty = order_response["executedQty"]
 | 
				
			||||||
 | 
					            cummulative_quote_qty = order_response["cummulativeQuoteQty"]
 | 
				
			||||||
 | 
					            side = order_response["side"]
 | 
				
			||||||
 | 
					            trade_type = "买入" if side == "BUY" else "卖出"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            timestamp = datetime.fromtimestamp(order_response["updateTime"] / 1000).strftime(
 | 
				
			||||||
 | 
					                "%Y-%m-%dT%H:%M"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            row = [
 | 
				
			||||||
 | 
					                timestamp,
 | 
				
			||||||
 | 
					                trade_type,
 | 
				
			||||||
 | 
					                csv_symbol,
 | 
				
			||||||
 | 
					                executed_qty,
 | 
				
			||||||
 | 
					                cummulative_quote_qty,
 | 
				
			||||||
 | 
					                "资金账户",
 | 
				
			||||||
 | 
					                "CEX",
 | 
				
			||||||
 | 
					                f"MEXC API - Order ID: {order_id}",
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # 检查文件是否存在
 | 
				
			||||||
 | 
					            file_exists = False
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                with open(self.csv_file, "r", encoding="utf-8") as f:
 | 
				
			||||||
 | 
					                    file_exists = True
 | 
				
			||||||
 | 
					            except FileNotFoundError:
 | 
				
			||||||
 | 
					                pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # 写入CSV
 | 
				
			||||||
 | 
					            with open(self.csv_file, "a", newline="", encoding="utf-8") as f:
 | 
				
			||||||
 | 
					                writer = csv.writer(f)
 | 
				
			||||||
 | 
					                if not file_exists:
 | 
				
			||||||
 | 
					                    writer.writerow(
 | 
				
			||||||
 | 
					                        [
 | 
				
			||||||
 | 
					                            "日期",
 | 
				
			||||||
 | 
					                            "类型",
 | 
				
			||||||
 | 
					                            "证券代码",
 | 
				
			||||||
 | 
					                            "份额",
 | 
				
			||||||
 | 
					                            "净额",
 | 
				
			||||||
 | 
					                            "现金账户",
 | 
				
			||||||
 | 
					                            "目标账户",
 | 
				
			||||||
 | 
					                            "备注",
 | 
				
			||||||
 | 
					                        ]
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                writer.writerow(row)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            logger.info(
 | 
				
			||||||
 | 
					                "[GridTradingBot.record_transaction] Transaction recorded, order ID: %s",
 | 
				
			||||||
 | 
					                order_id,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            logger.error(
 | 
				
			||||||
 | 
					                "[GridTradingBot.record_transaction] Transaction recording failed: %s",
 | 
				
			||||||
 | 
					                str(e),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def api_get_price(self) -> float:
 | 
					    def api_get_price(self) -> float:
 | 
				
			||||||
        """获取当前市场价格"""
 | 
					        """获取当前市场价格"""
 | 
				
			||||||
        logger.custom_debug(
 | 
					        logger.custom_debug(
 | 
				
			||||||
@@ -359,9 +437,8 @@ class GridTradingBot:
 | 
				
			|||||||
                        order_id,
 | 
					                        order_id,
 | 
				
			||||||
                        self.active_orders[order_id].filled_time,
 | 
					                        self.active_orders[order_id].filled_time,
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 | 
					                    self.record_transaction(order_info)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # 如果订单已完成或已取消,从活跃订单中移除
 | 
					 | 
				
			||||||
                # if new_status in ["FILLED", "CANCELED"]:
 | 
					 | 
				
			||||||
                if new_status in ["CANCELED"]:
 | 
					                if new_status in ["CANCELED"]:
 | 
				
			||||||
                    logger.custom_debug(
 | 
					                    logger.custom_debug(
 | 
				
			||||||
                        "[GridTradingBot.api_update_order_statuses] Removing order %s from active orders (status: %s)",
 | 
					                        "[GridTradingBot.api_update_order_statuses] Removing order %s from active orders (status: %s)",
 | 
				
			||||||
@@ -832,6 +909,8 @@ class GridTradingBot:
 | 
				
			|||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
    config = {
 | 
					    config = {
 | 
				
			||||||
        "symbol": "BTCUSDC",  # 交易对
 | 
					        "symbol": "BTCUSDC",  # 交易对
 | 
				
			||||||
 | 
					        "csv_symbol": "BTCUSDT",  # CSV记录映射交易对
 | 
				
			||||||
 | 
					        "csv_file": "output/mexc_spot_grid_trades.csv",  # CSV记录文件
 | 
				
			||||||
        "grid_percentage": 0.001,  # 等比网格的公比
 | 
					        "grid_percentage": 0.001,  # 等比网格的公比
 | 
				
			||||||
        "grid_count": 3,  # 单侧的挂单数,实时平衡
 | 
					        "grid_count": 3,  # 单侧的挂单数,实时平衡
 | 
				
			||||||
        "order_amount": 0.00001,  # BTC数量
 | 
					        "order_amount": 0.00001,  # BTC数量
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user