2
tập trung vào
319
Người theo dõi

Khung chiến lược định lượng đa tiền tệ Python: Ý tưởng thiết kế và triển khai chi tiết

Được tạo ra trong: 2025-08-29 13:10:54, cập nhật trên: 2025-08-31 09:11:53
comments   0
hits   626

giới thiệu:

Gần đây, một người dùng trên Xiaocao teacherCách xây dựng nhanh chóng chiến lược giao dịch đa tiền tệ phổ biến sau khi nâng cấp FMZVui lòng để lại bình luận trong phần bình luận của bài viết này, hy vọng sẽ cung cấp một phiên bản Python của khung chiến lược này. Để đáp ứng nhu cầu của các nhà phát triển Python, bài viết này sẽ dựa trên ý tưởng ban đầu của Xiaocao và kết hợp chúng với môi trường giao dịch mô phỏng Binance để giải thích chi tiết cách xây dựng một khung giao dịch định lượng đa tiền tệ phổ biến.

Khung này có các tính năng sau:

  • Dựa trên ngôn ngữ Python, dễ hiểu và mở rộng
  • Hỗ trợ giao dịch đồng thời nhiều loại tiền tệ
  • Sử dụng sàn giao dịch mô phỏng Binance để kiểm tra bảo mật
  • Cung cấp các ví dụ mã đầy đủ và các bình luận chi tiết

Chúng tôi hy vọng bài viết này sẽ giúp bạn nhanh chóng bắt đầu giao dịch định lượng đa tiền tệ. Chúng tôi cũng hoan nghênh các nhà phát triển đổi mới và tối ưu hóa dựa trên kinh nghiệm này, tạo ra các chiến lược giao dịch toàn diện và cá nhân hóa hơn nữa. Hãy cùng nhau tiếp tục khám phá con đường giao dịch định lượng!

Chiến lược khởi tạo

Ở giai đoạn khởi tạo chiến lược giao dịch, trước tiên chúng ta xác định các biến toàn cụcSYMBOLSQUOTOINTERVAL, biểu thị loại tiền giao dịch mục tiêu, loại tiền cơ sở và thời gian khoảng thời gian,InfoBiến được sử dụng để lưu trữ tất cả dữ liệu quan trọng cần thiết trong quá trình vận hành chiến lược.InitInfoChức năng này khởi tạo dữ liệu này, bao gồm thông tin tài khoản, quản lý thời gian, dữ liệu thị trường cho từng loại tiền tệ giao dịch, thông tin lệnh, thông tin vị thế, v.v. Các bước khởi tạo này đảm bảo rằng chiến lược có cấu trúc dữ liệu rõ ràng và trạng thái ban đầu khi chạy, đặt nền tảng cho việc thực hiện chiến lược tiếp theo.

import time
import json 

SYMBOLS = 'LINK,ETH,TRB'
QUOTO = 'USDT'
INTERVAL = 5

# 全局变量,储存数据
# SYMBOLS代表要交易的币种,格式如"BTC,ETH,LTC"
# QUOTO为基础货币,永续合约常见的有USDT,USDC
# INTERVAL代表循环的间隔
Info = {
    'trade_symbols': SYMBOLS.split(','),  # 交易币种
    'base_coin': QUOTO,                   # 基础货币
    'ticker': {},                         # 行情数据
    'order': {},                          # 订单信息
    'account': {},                        # 账户信息
    'precision': {},                      # 精度信息
    'position': {},                       # 仓位信息
    'time': {},                           # 时间相关数据
    'count': {},                          # 计数器
    'interval': INTERVAL                  # 循环的间隔时间
}

# 初始化策略
def InitInfo():

    # 初始化账户信息,初始余额为0
    Info['account'] = {
        'init_balance': 0,  # 初始余额
        'wallet_balance': 0,  # 钱包余额
        'margin_balance': 0,  # 保证金余额
        'margin_used': 0,  # 已用保证金
        'margin_free': 0,  # 可用保证金
        'profit': 0,  # 总收益
        'profit_rate': 0,  # 收益率
        'unrealised_profit': 0,  # 未实现收益
    }

    # 初始化时间数据,控制更新的时间
    Info['time'] = {
        'update_ticker_time': 0,    # 更新行情的时间
        'update_pos_time': 0,       # 更新仓位的时间
        'update_profit_time': 0,    # 更新利润的时间
        'update_account_time': 0,   # 更新账户信息的时间
        'update_status_time': 0,    # 更新状态的时间
        'last_loop_time': 0,        # 上一次主循环的时间
        'loop_delay': 0,             # 循环延迟
        'start_time': time.time()
    }

    # 初始化每个交易币种的数据
    for symbol in Info['trade_symbols']:
        Info['ticker'][symbol] = {'last': 0, 'ask': 0, 'bid': 0}  # 行情
        Info['order'][symbol] = {                                 # 订单信息
            'buy': {'id': 0, 'price': 0, 'amount': 0},
            'sell': {'id': 0, 'price': 0, 'amount': 0}
        }
        Info['position'][symbol] = {                              # 仓位信息
            'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
        }
        Info['precision'][symbol] = {}  # 精度信息初始化为空
        Info['position'][symbol] = {                              # 仓位信息
            'amount': 0, 'hold_price': 0, 'unrealised_profit': 0, 'open_time': 0, 'value': 0
        }

Thu thập thông tin thị trường và cài đặt chính xác

Bước này đảm bảo tính chính xác của giá cả, số lượng và các khía cạnh khác của loại tiền tệ mà chúng tôi xử lý, cũng như số lượng lệnh, đáp ứng các tiêu chuẩn của sàn giao dịch. Các cặp giao dịch khác nhau (chẳng hạn như BTC/USD hoặc ETH/USDT) có các yêu cầu về độ chính xác tối thiểu khác nhau về giá cả và số lượng, vì vậy chúng tôi cần lấy thông tin về độ chính xác này từ API của sàn giao dịch để tránh các lệnh không tuân thủ. Ví dụ: ETH/USDT có thể cho phép hai chữ số thập phân, trong khi BTC/USDT có thể cho phép tám chữ số thập phân.

Mục đích:

  • Thu thập độ chính xác về giá và số lượng cho từng loại tiền tệ để đảm bảo tính chính xác của dữ liệu đơn hàng.
  • Ngăn ngừa lỗi đơn hàng do lỗi chính xác.
# 获取精度信息
def GetPrecision():
    # 获取交易所的市场信息
    for presym in Info['trade_symbols']:
        curcontract = presym + '_USDT.swap'
        exchange.GetTicker(curcontract)
    exchange_info = exchange.GetMarkets()
    
    # 遍历市场中的所有交易对
    for pair, data in exchange_info.items():
        symbol = pair.split('_')[0]  # 永续合约交易对的格式为 BTC_USDT.swap
        
        # 检查该交易对是否为我们要交易的币种,基础货币是否匹配,且是永续合约
        if symbol in Info['trade_symbols'] and pair.split('.')[0].endswith(Info['base_coin']) and pair.endswith('swap'):
            # 获取该交易对的精度信息
            Info['precision'][symbol] = {
                'tick_size': data['TickSize'],                  # 价格精度
                'amount_size': data['AmountSize'],              # 数量精度
                'price_precision': data['PricePrecision'],      # 价格小数位精度
                'amount_precision': data['AmountPrecision'],    # 数量小数位精度
                'min_qty': data['MinQty'],                      # 最小下单数量
                'max_qty': data['MaxQty'],                      # 最大下单数量
                'min_notional': data['MinNotional'],            # 最小交易额
                'ctVal': data['CtVal']                          # 合约价值,如1张代表0.01个币
            }
            
            # 检查合约价值的计价货币是否为symbol,避免币本位情况
            if data['CtValCcy'] != symbol:
                raise Exception("不支持币本位")

GetPrecisionchức năng

  • Thu thập thông tin thị trường từ các sàn giao dịch thông qua API, bao gồm cài đặt chính xác cho các cặp giao dịch.
  • Đối với các cặp giao dịch đủ điều kiện, hãy ghi lại thông tin như độ chính xác về giá, độ chính xác về số lượng, khối lượng giao dịch tối thiểu và tối đa và giá trị hợp đồng.
  • Kiểm tra xem đó có phải là giao dịch ký quỹ bằng tiền xu hay không và đưa ra ngoại lệ nếu có.

Nhận báo giá

Truy cập dữ liệu thị trường hiện tại thông qua API, chẳng hạn như giá mới nhất, giá mua tốt nhất, giá bán tốt nhất và độ sâu sổ lệnh. Thông tin này rất quan trọng cho các quyết định giao dịch tiếp theo. Tùy thuộc vào chiến lược, dữ liệu này có thể dựa trên biểu đồ nến (dữ liệu OHLC) hoặc dữ liệu từng tick-by-tick.

Mục đích:

  • Nhận dữ liệu giao dịch mới nhất của thị trường hiện tại để chiến lược có thể đưa ra quyết định mua và bán dựa trên dữ liệu này.
  • Bao gồm việc thu thập dữ liệu thời gian thực và lịch sử để tính toán chỉ báo kỹ thuật.
# 更新行情信息
def UpdateTicker():
    
    # 记录当前更新时间戳
    Info['time']['update_ticker_time'] = time.time() * 1000 # 使用time.time()获取当前时间的时间戳
    
    # 遍历获取到的行情数据
    for ticpre in Info['trade_symbols']:
        
        curcontract = ticpre + '_' + QUOTO + '.swap'
        data = exchange.GetTicker(curcontract)
        
        if not data:
            Log("获取行情失败", GetLastError())
            return
        # 提取交易币种,永续合约格式如 'BTC_USDT.swap',这里取币种名 'BTC'
        symbol = data['Symbol'].split('_')[0]
        
        # 过滤掉不是基础货币(Info['base_coin'])的交易对或不是永续合约的交易对
        if not data['Symbol'].split('.')[0].endswith(Info['base_coin']) or symbol not in Info['trade_symbols'] or not data['Symbol'].endswith('swap'):
            continue
        
        # 更新行情的卖出价、买入价和最后成交价
        Info['ticker'][symbol]['ask'] = float(data['Sell'])  # 卖出价
        Info['ticker'][symbol]['bid'] = float(data['Buy'])   # 买入价
        Info['ticker'][symbol]['last'] = float(data['Last']) # 最后成交价
  1. Nhận dữ liệu thị trường

    • sử dụngexchange.GetTickersNhận thông tin thị trường theo thời gian thực cho tất cả các cặp giao dịch.tickerBiến này lưu trữ tất cả thông tin cặp giao dịch.
  2. Xử lý lỗi

    • Nếu dữ liệu thị trường không thể thu thập thành công, chương trình sẽ vượt quaLogNhật ký chức năng và đầu raGetLastErrorĐã trả về thông báo lỗi.
  3. Thời gian cập nhật

    • sử dụngtime.timeĐể ghi lại dấu thời gian của thời điểm hiện tại, được sử dụng để đánh dấu thời điểm thị trường được cập nhật.
  4. Lọc dữ liệu

    • Trích xuất tên tiền tệ giao dịch từ dữ liệu thị trường.
    • Lọc ra các cặp giao dịch không đáp ứng các yêu cầu, chẳng hạn như các cặp giao dịch không được thanh toán bằng loại tiền cơ sở hoặc các cặp giao dịch không phải là hợp đồng vĩnh viễn.
  5. Cập nhật dữ liệu thị trường

    • Đối với các loại tiền tệ giao dịch đủ điều kiện, hãy cập nhật giá mua, giá bán và giá giao dịch gần nhất của chúng.

Thông qua chức năng này, hệ thống có thể thu thập và cập nhật thông tin thị trường mới nhất của loại tiền tệ giao dịch mục tiêu theo thời gian thực.

Nhận thông tin vị trí tài khoản

Sử dụng API để truy xuất số dư tài khoản và các khoản nắm giữ hiện tại (tiền tệ, số lượng, chi phí, v.v.). Bước này rất quan trọng để đánh giá nguồn vốn khả dụng, tính toán rủi ro và quản lý vị thế. Ví dụ: số lượng nắm giữ hiện tại của bạn sẽ quyết định việc tăng hay giảm vị thế.

Mục đích:

  • Đảm bảo có đủ tiền hoặc vị thế mở trong tài khoản của bạn để thực hiện giao dịch.
  • Xác định quy mô và hướng giao dịch dựa trên vị thế hiện tại và số tiền trong tài khoản.
# 更新账户信息
def UpdateAccount():
   
    # 如果上次更新时间距现在不到1分钟,直接返回
    if time.time() - Info['time']['update_account_time'] < 60:
        return
    
    # 记录账户信息更新时间
    Info['time']['update_account_time'] = time.time() * 1000
    
    # 获取账户信息
    account = exchange.GetAccount()
    
    # 如果账户信息获取失败,记录日志并返回
    if account is None:
        Log("更新账户失败")
        return
    
    # 计算账户信息
    Info['account']['margin_used'] = round(account['Equity'] - account['Balance'], 2)  # 使用的保证金
    Info['account']['margin_balance'] = round(account['Equity'], 2)  # 当前账户余额
    Info['account']['margin_free'] = round(account['Balance'], 2)  # 可用余额
    Info['account']['wallet_balance'] = round(account['Equity'] - account['UPnL'], 2)  # 钱包余额
    Info['account']['unrealised_profit'] = round(account['UPnL'], 2)  # 未实现盈亏

    # 初始化账户初始余额
    if not Info['account']['init_balance']:
        if _G("init_balance") and _G("init_balance") > 0:
            Info['account']['init_balance'] = round(_G("init_balance"), 2)
        else:
            Info['account']['init_balance'] = Info['account']['margin_balance']
            _G("init_balance", Info['account']['init_balance'])
    
    # 计算账户利润及利润率
    Info['account']['profit'] = round(Info['account']['margin_balance'] - Info['account']['init_balance'], 2)
    Info['account']['profit_rate'] = round((100 * Info['account']['profit']) / Info['account']['init_balance'], 2)

    # 计算仓位总价值和杠杆率
    Info['count']['total'] = round(Info['count']['long'] + Info['count']['short'], 2)
    Info['count']['leverage'] = round(Info['count']['total'] / Info['account']['margin_balance'], 2)


# 更新仓位信息
def UpdatePosition():
    
    # 获取永续合约的仓位信息
    pos = exchange.GetPositions(Info['base_coin'] + ".swap")
    
    # 记录仓位信息更新时间
    Info['time']['update_pos_time'] = time.time() * 1000

    # 初始化仓位信息
    position_info = {symbol: {'amount': 0, 'hold_price': 0, 'unrealised_profit': 0} for symbol in Info['trade_symbols']}

    # 遍历仓位信息,更新相应币种的仓位
    for data in pos:
        symbol = data['Symbol'].split("_")[0]
        
        # 过滤掉不符合条件的币种
        if not data['Symbol'].split(".")[0].endswith(Info['base_coin']) or symbol not in Info['trade_symbols']:
            continue
        
        # 如果仓位不为零,则需要单向持仓
        if position_info[symbol]['amount'] != 0:
            raise Exception("需要单向持仓")
        
        # 更新仓位信息
        position_info[symbol] = {
            'amount': data['Amount'] * Info['precision'][symbol]['ctVal'] if data['Type'] == 0 else -data['Amount'] * Info['precision'][symbol]['ctVal'],
            'hold_price': data['Price'],
            'unrealised_profit': data['Profit']
        }

    # 初始化仓位统计数据
    Info['count'] = {'long': 0, 'short': 0, 'total': 0, 'leverage': 0}

    # 遍历更新后的仓位信息
    for symbol, info in position_info.items():
        deal_volume = abs(info['amount'] - Info['position'][symbol]['amount'])
        direction = 1 if info['amount'] - Info['position'][symbol]['amount'] > 0 else -1
        
        # 如果仓位发生变化,记录成交信息
        if deal_volume:
            deal_price = Info['order'][symbol]['buy']['price'] if direction == 1 else Info['order'][symbol]['sell']['price']
            Log(
                symbol,
                "仓位更新:",
                round(Info['position'][symbol]['value'], 1),
                " -> ",
                round(info['amount'] * Info['ticker'][symbol]['last'], 1),
                ", 买" if direction == 1 else ", 卖",
                ", 成交价:",
                deal_price,
                ", 成本价:",
                round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']),
            )

        # 更新仓位信息
        Info['position'][symbol]['amount'] = info['amount']
        Info['position'][symbol]['hold_price'] = info['hold_price']
        Info['position'][symbol]['value'] = round(Info['position'][symbol]['amount'] * Info['ticker'][symbol]['last'], 2)
        Info['position'][symbol]['unrealised_profit'] = info['unrealised_profit']

        # 统计多头和空头仓位价值
        if Info['position'][symbol]['amount'] > 0:
            Info['count']['long'] += abs(Info['position'][symbol]['value'])
        else:
            Info['count']['short'] += abs(Info['position'][symbol]['value'])
  1. UpdateAccountchức năng

    • Kiểm tra khoảng thời gian:Mỗi khi bạn cập nhật tài khoản, hãy đảm bảo lần cập nhật cuối cùng cách thời điểm cập nhật hơn 1 phút để tránh cập nhật quá thường xuyên.
    • Cập nhật thông tin tài khoản: Gọiexchange.GetAccountNhận thông tin tài khoản và tính toán các thông số tài khoản khác nhau, chẳng hạn nhưmargin_usedwallet_balanceunrealised_profitChờ đợi.
    • Khởi tạo số dư: Khởi tạo số dư ban đầu của tài khoản khi chạy lần đầu và lưu vào biến toàn cụcInfo['account']['init_balance']ở giữa.
    • Tính toán lợi nhuận: Tính toán lợi nhuận và biên lợi nhuận dựa trên số dư hiện tại và số dư ban đầu.
  2. UpdatePositionchức năng

    • Nhận thông tin vị trí: Gọiexchange.GetPositions()Nhận trạng thái vị trí hiện tại.
    • Cập nhật vị trí:Cập nhật thông tin vị trí của loại tiền tệ mục tiêu dựa trên dữ liệu vị trí đã thu thập được (chẳng hạn nhưamounthold_priceunrealised_profitChờ đợi).
    • Tính đòn bẩyTính toán tỷ lệ đòn bẩy tổng thể dựa trên giá trị vị thế mua và bán hiện tại và số dư ký quỹ.

Thông qua hai chức năng này, chiến lược có thể liên tục theo dõi trạng thái tài khoản và thay đổi vị thế, cung cấp hỗ trợ dữ liệu thời gian thực cho các quyết định giao dịch tiếp theo.

buôn bán

Thực hiện lệnh mua hoặc bán dựa trên logic chiến lược. Đây có thể là lệnh thị trường, lệnh giới hạn hoặc các loại lệnh khác. Bước này bao gồm việc tương tác với API của sàn giao dịch để gửi yêu cầu mua hoặc bán. Việc thực hiện lệnh thành công sẽ ảnh hưởng đến số dư tài khoản và số lượng hợp đồng mở.

Mục đích:

  • Phát hành hướng dẫn giao dịch thông qua API để hoàn tất hoạt động mua và bán.
  • Đảm bảo loại lệnh và số lượng lệnh tuân thủ các yêu cầu về chiến lược và quy định trao đổi.
# 订单函数
def Order(symbol, direction, price, amount, msg):
    pair = f"{symbol}_{Info['base_coin']}.swap"  # 构造交易对名称
    ret = exchange.CreateOrder(pair, direction, price, amount, msg)  # 执行下单操作
    
    # 判断是否下单成功
    if ret:
        Info['order'][symbol][direction]['id'] = ret  # 记录订单ID
        Info['order'][symbol][direction]['price'] = price  # 记录下单价格
    else:
        Log(f"{symbol} {direction} {price} {amount} 下单异常")  # 输出异常信息

# 交易函数
def Trade(symbol, direction, price, amount, msg):
    
    # 根据最小价格变动调整价格
    price = round(price - (price % Info['precision'][symbol]['tick_size']), Info['precision'][symbol]['price_precision'])
    
    # 计算调整后的交易数量
    amount = amount / Info['precision'][symbol]['ctVal']  # 计算真实合约数量
    amount = round(amount - (amount % Info['precision'][symbol]['amount_size']), Info['precision'][symbol]['amount_precision'])

    # 限制最大交易数量
    if Info['precision'][symbol]['max_qty'] > 0:
        amount = min(amount, Info['precision'][symbol]['max_qty'])
    
    new_order = False
    
    # 如果新价格与之前的订单价格差异大于0.0001,则重新下单

    if Info['order'][symbol][direction]['price'] > 0 and abs(price - Info['order'][symbol][direction]['price']) / price > 0.0001:
        Log('已持订单,订单价格发生变化')
        new_order = True
    
    # 如果交易数量为0或者当前订单ID为0,则撤单
    if amount <= 0 or Info['order'][symbol][direction]['id'] == 0:
        Log('新订单产生')
        new_order = True
    
    # 如果需要新订单
    if new_order:
        # 如果有原有订单,撤销它
        if Info['order'][symbol][direction]['id'] != 0:
            exchange.CancelOrder(Info['order'][symbol][direction]['id'])
            Info['order'][symbol][direction]['id'] = 0
            Info['order'][symbol][direction]['price'] = 0
            Log('撤单成功:', symbol)
        
        
        # 如果更新仓位或ticker的延迟太高,则不下单
        if (time.time() * 1000 - Info['time']['update_pos_time'] > 2 * Info['interval'] * 1000 or 
            time.time() * 1000 - Info['time']['update_ticker_time'] > 2 * Info['interval'] * 1000):
            Log(time.time() * 1000, Info['time']['update_pos_time'], time.time() * 1000 - Info['time']['update_pos_time'])
            Log(time.time() * 1000, Info['time']['update_ticker_time'], time.time() * 1000 - Info['time']['update_ticker_time'])
            Log('延迟过高')
            return
        
        # 如果订单金额或数量过低,不执行下单操作
        if price * amount <= Info['precision'][symbol]['min_notional'] or amount < Info['precision'][symbol]['min_qty']:
            Log(f"{symbol} 下单量太低", price * amount)
            return
        
        # 执行下单操作
        Log('order下单:', symbol)
        Order(symbol, direction, price, amount, msg)
  1. Orderchức năng

    • Chịu trách nhiệm tạo đơn hàng. Nếu thành công, hệ thống sẽ ghi lại ID đơn hàng và giá. Nếu thất bại, hệ thống sẽ đưa ra thông báo lỗi.
  2. Tradechức năng

    • Điều chỉnh dựa trên giá thị trường và số lượng để xác định có nên hủy lệnh và đặt lệnh mới hay không nhằm tránh lỗi thực hiện lệnh hoặc thao tác lặp lại.
  3. CancelOrderchức năng

    • Đây là thao tác hủy lệnh tùy chỉnh, có nhiệm vụ hủy lệnh đang chờ xử lý hiện tại.

Hiển thị trạng thái

Trạng thái hoạt động của chiến lược được hiển thị theo thời gian thực, bao gồm số dư tài khoản, vị thế hiện tại, trạng thái thực hiện giao dịch, giá thị trường hiện tại, v.v. Bước này không chỉ để theo dõi hoạt động của chiến lược mà còn để nhanh chóng hiểu được hiệu suất của chiến lược trong quá trình tối ưu hóa và gỡ lỗi chiến lược.

Mục đích:

  • Hiển thị thông tin chính về hoạt động chiến lược một cách kịp thời để người dùng có thể theo dõi.
  • Cung cấp cơ chế phản hồi để hiển thị giao dịch đã được thực hiện thành công hay có bất kỳ lỗi nào không.
# 更新状态函数
def UpdateStatus():
    
    # 如果距离上次更新的时间小于4秒,则直接返回
    if time.time() * 1000 - Info['time']['update_status_time'] < 4000:
        return
    
    # 更新状态时间
    Info['time']['update_status_time'] = time.time() * 1000

    # 账户信息表格
    table1 = {
        "type": "table",
        "title": "账户信息",
        "cols": [
            "初始余额", "钱包余额", "保证金余额", "已用保证金", "可用保证金",
            "总收益", "收益率", "未实现收益", "总持仓", "已用杠杆", "循环延时"
        ],
        "rows": [
            [
                Info['account']['init_balance'],  # 初始余额
                Info['account']['wallet_balance'],  # 钱包余额
                Info['account']['margin_balance'],  # 保证金余额
                Info['account']['margin_used'],  # 已用保证金
                Info['account']['margin_free'],  # 可用保证金
                Info['account']['profit'],  # 总收益
                str(Info['account']['profit_rate']) + "%",  # 收益率
                round(Info['account']['unrealised_profit'], 2),  # 未实现收益
                round(Info['count']['total'], 2),  # 总持仓
                Info['count']['leverage'],  # 已用杠杆
                str(Info['time']['loop_delay']) + "ms",  # 循环延时
            ],
        ],
    }
    
    # 交易对信息表格
    table2 = {
        "type": "table",
        "title": "交易对信息",
        "cols": [
            "币种", "方向", "数量", "持仓价格", "持仓价值", 
            "现价", "挂单买价", "挂单卖价", "未实现盈亏"
        ],
        "rows": [],
    }

    # 遍历每个交易对,填充交易对信息
    for symbol in Info['trade_symbols']:
        table2['rows'].append([
            symbol,  # 币种
            "LONG" if Info['position'][symbol]['amount'] > 0 else "SHORT",  # 方向
            round(Info['position'][symbol]['amount'], Info['precision'][symbol]['amount_precision'] + 2),  # 数量
            round(Info['position'][symbol]['hold_price'], Info['precision'][symbol]['price_precision']),  # 持仓价格
            round(Info['position'][symbol]['value'], 2),  # 持仓价值
            round(Info['ticker'][symbol]['last'], Info['precision'][symbol]['price_precision']),  # 现价
            Info['order'][symbol]['buy']['price'],  # 挂单买价
            Info['order'][symbol]['sell']['price'],  # 挂单卖价
            round(Info['position'][symbol]['unrealised_profit'], 2),  # 未实现盈亏
        ])

    # 输出状态日志
    LogStatus(
        f"初始化时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(Info['time']['start_time']))}\n",
        f"`{json.dumps(table1)}`\n" + f"`{json.dumps(table2)}`\n",
        f"最后执行时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}\n"
    )

    # 每10秒钟更新一次账户信息
    if time.time() * 1000 - Info['time']['update_profit_time'] > 10 * 1000:
        UpdateAccount()  # 更新账户信息
        LogProfit(round(Info['account']['profit'], 3), '&')  # 输出收益日志
        Info['time']['update_profit_time'] = time.time() * 1000  # 更新收益时间

Logic giao dịch

Quy trình ra quyết định giao dịch cốt lõi. Dựa trên dữ liệu thị trường, thông tin tài khoản và vị thế, kết hợp với các chỉ báo kỹ thuật hoặc mô hình định lượng, các quyết định được đưa ra liên quan đến việc mua, bán, tăng hay giảm vị thế. Logic giao dịch thay đổi tùy thuộc vào chiến lược, chẳng hạn như chiến lược theo xu hướng, chiến lược đảo chiều trung bình hoặc chiến lược đột phá.

Mục đích:

  • Đưa ra quyết định giao dịch thông minh dựa trên dữ liệu thị trường và trạng thái tài khoản.
  • Xử lý nhiều tình huống thị trường khác nhau và đảm bảo các chiến lược có thể hoạt động hợp lý trong các môi trường thị trường khác nhau.

Để chứng minh tính ứng dụng của khuôn khổ này, chiến lược giao dịch trong bài viết này sử dụng logic đơn giản. Mỗi lệnh được cố định ở mức 50 USDT, và khi thực hiện giao dịch, khối lượng mua hoặc bán tương ứng được tính toán dựa trên giá mua và giá bán hiện tại của thị trường. Các quy tắc thực hiện của chiến lược này rất cơ bản, nhằm mục đích minh họa cách áp dụng khuôn khổ chiến lược giao dịch tương lai đa tiền tệ trong môi trường giao dịch thực tế. Để đảm bảo tính đơn giản và khả năng vận hành, một điều kiện dừng được đặt ra: khi tổng giá trị hợp đồng mở của một cặp giao dịch đạt 2.000 USDT, các lệnh tiếp theo sẽ dừng lại. Điều này cho phép chúng tôi minh họa một cách thuận tiện cấu trúc cơ bản của chiến lược và cách khuôn khổ này tương tác với dữ liệu thị trường từ các sàn giao dịch.

def MakeOrder():
    
    # 遍历所有交易对
    for symbol in Info['trade_symbols']:
        
        # 获取买价(挂单买价)
        buy_price = Info['ticker'][symbol]['bid']
        
        # 计算买入数量,根据买入金额除以买价
        buy_amount = 50 / buy_price

        # 获取卖价(挂单卖价)
        sell_price = Info['ticker'][symbol]['ask']
        
        # 计算买入数量,根据买入金额除以买价
        sell_amount = 50 / sell_price

        
        # 如果当前持仓的总价值小于2000,则进行买入操作
        if Info['position'][symbol]['value'] < 2000:
            Log('进入交易')
            Log('设定价格:', Info['ticker'][symbol]['bid'])
            Trade(symbol, "buy", buy_price, buy_amount, symbol)  # 执行买入操作
        
        #if Info['position'][symbol]['value'] < 3000:
        #    Trade(symbol, "sell", sell_price, sell_amount, symbol)  # 执行买入操作

Vòng lặp chính

Vòng lặp chính là cốt lõi của khung chiến lược, chịu trách nhiệm đảm bảo hiệu suất nhất quán và ổn định của chiến lược trên thị trường. Vòng lặp này thường xuyên thực hiện nhiều hoạt động khác nhau theo các khoảng thời gian cố định, chẳng hạn như thu thập dữ liệu thị trường mới nhất, cập nhật thông tin vị thế và thực hiện các quyết định giao dịch. Thông qua vòng lặp chính, chiến lược có thể phản ứng với những thay đổi của thị trường theo thời gian thực và đảm bảo mỗi lần thực hiện đều dựa trên dữ liệu thị trường mới nhất. Thông thường, vòng lặp chính được kích hoạt một lần cho mỗi khoảng thời gian mới (chẳng hạn như mỗi phút, mỗi giờ hoặc khi một nến mới được tạo ra).

Mục đích:

  • Đảm bảo chiến lược hoạt động liên tục và ổn định, thu thập dữ liệu thị trường theo thời gian thực và đưa ra quyết định giao dịch.
  • Mỗi chu kỳ đảm bảo tính chính xác và thời gian thực của việc thực hiện chiến lược.
def OnTick():
    try:
        # 更新市场行情信息
        UpdateTicker()
        # 更新持仓信息
        UpdatePosition()
        # 执行下单操作
        MakeOrder()
        # 更新状态信息
        UpdateStatus()
    except Exception as error:
        # 记录循环中发生的错误
        Log("循环出错: " + str(error))

def main():
    LogReset(0)  
    apiBase = "https://testnet.binancefuture.com"  # 币安期货仿真交易所        
    exchange.SetBase(apiBase)  # 设置仿真交易所基站
    # 初始化信息
    exchange.IO('dual', False)  # 单向持仓
    InitInfo()
    GetPrecision()
    
    while True:  # 无限循环
        loop_start_time = time.time() * 1000  # 获取当前时间(毫秒)
        
        # 检查上次循环时间与设定的间隔时间是否已过
        if time.time() * 1000 - Info['time']['last_loop_time'] > Info['interval'] * 1000:
            OnTick()  # 调用 OnTick 函数
            
            # 更新最后一次循环时间
            Info['time']['last_loop_time'] = time.time() * 1000
            # 计算当前循环的延迟时间
            Info['time']['loop_delay'] = time.time() * 1000 - loop_start_time
        
        # 暂停5毫秒,避免过度消耗CPU资源
        Sleep(5000)

Giải thích mã:

  1. OnTickchức năngChức năng này là nhiệm vụ cốt lõi được thực thi mỗi lần trong vòng lặp chính. Chức năng này chịu trách nhiệm cập nhật thông tin thị trường, thông tin vị thế, thực hiện giao dịch và cập nhật trạng thái chiến lược. Mọi cập nhật về giao dịch và thông tin đều được thực hiện trong chức năng này. Mọi lỗi trong quá trình thực hiện đều được ghi lại và lưu lại.

  2. mainchức năng:Hàm chính khởi tạo thông tin liên quan, thiết lập trạm gốc tổng đài và bắt đầu một vòng lặp vô hạn. Trong mỗi vòng lặp, chương trình sẽ kiểm tra xem khoảng thời gian đã thiết lập đã trôi qua chưa. Nếu đã trôi qua,OnTickHàm sẽ được gọi để thực thi chiến lược. Nếu khoảng thời gian chưa đến, chương trình sẽ đợi và tiếp tục vòng lặp để đảm bảo chiến lược được thực thi theo khoảng thời gian đã định trước.

  3. Kiểm soát độ trễ: Sau mỗi vòng lặp, chương trình sẽ tạm dừng 5 mili giây để giảm tải CPU. Điều này nhằm tránh việc tiêu thụ quá nhiều tài nguyên tính toán do các vòng lặp tần suất cao.

Logic hoạt động

  • Giai đoạn khởi tạo: Đầu tiên, hãy thiết lập API và các tham số cần thiết khác, sau đó khởi tạo thông tin và lấy độ chính xác của tiền tệ.
  • Pha vòng lặp chính:Nhập vòng lặp vô hạn, mỗi vòng lặp sẽ kiểm tra khoảng thời gian để đảm bảo khoảng thời gian thực thi chính sách đáp ứng các cài đặt được đặt trước.
  • Giai đoạn thực hiện:Sau khi điều kiện khoảng thời gian được đáp ứng,OnTickChức năng này sẽ được gọi để thực hiện tất cả các hoạt động chiến lược, bao gồm cập nhật thông tin thị trường, thực hiện giao dịch, v.v.

Thiết kế vòng lặp chính này đảm bảo chiến lược tiếp tục chạy theo điều kiện thị trường thời gian thực và đưa ra quyết định giao dịch kịp thời, do đó cải thiện tính ổn định và độ chính xác của chiến lược.

Tóm tắt

Khung chiến lược này được thiết kế chú trọng đến tính mô-đun và khả năng mở rộng. Mỗi bước đều có trách nhiệm rõ ràng, đảm bảo tính mạnh mẽ đồng thời tạo điều kiện thuận lợi cho việc mở rộng và tối ưu hóa trong tương lai. Bằng cách tận dụng API sàn giao dịch, các chiến lược có thể được tinh giản và nhất quán hơn với việc kiểm thử ngược và giao dịch theo thời gian thực.

nhu cầuĐể ýXin lưu ý rằng khuôn khổ trình diễn này sử dụng sàn giao dịch mô phỏng Binance làm ví dụ, nhằm mục đích cung cấp một khuôn khổ cơ bản cho việc phát triển và vận hành chiến lược. Trên thực tế, việc tối ưu hóa dựa trên logic chiến lược thực tế là cần thiết, chẳng hạn như điều chỉnh linh hoạt các tham số dựa trên điều kiện thị trường, tối ưu hóa cơ chế kiểm soát rủi ro và bổ sung xử lý ngoại lệ. Hơn nữa, do sự khác biệt về giao diện API, quy tắc giao dịch, cài đặt độ chính xác và cấu trúc phí giữa các sàn giao dịch, việc tối ưu hóa và điều chỉnh chi tiết dựa trên các yêu cầu cụ thể của sàn giao dịch mục tiêu sẽ là cần thiết trong quá trình triển khai thực tế để đảm bảo tính ổn định và khả năng tương thích của chiến lược. Chúng tôi khuyến nghị bạn nên kiểm tra và xác minh đầy đủ độ tin cậy và hiệu suất của chiến lược trước khi triển khai vào giao dịch thực tế.

phụ lụcĐịa chỉ khung đa tiền tệ Python