2
fokus pada
319
Pengikut

Diskusi Singkat tentang Strategi Pembuatan Pasar Mata Uang Digital (2): Strategi Pasar

Dibuat di: 2025-08-01 11:28:35, diperbarui pada: 2025-08-04 14:15:40
comments   0
hits   692

Kata pengantar

Dalam artikel kami sebelumnya, “Strategi Perdagangan Cuci dalam Mata Uang Kripto”, kami merinci kerangka kerja strategi untuk mengakumulasi volume perdagangan dengan membeli dan menjual pada harga yang sama. Tujuan utama strategi ini adalah untuk mendapatkan rabat pertukaran atau manfaat berjenjang, alih-alih mendapatkan keuntungan dari arbitrase harga. Meskipun strategi perdagangan cuci berharga untuk mempelajari kerangka kerja perdagangan, profitabilitas aktualnya terbatas dan mungkin menghadapi risiko kepatuhan.

Artikel ini akan memperkenalkan strategi pembuatan pasar lain yang lebih praktis berdasarkan artikel sebelumnya:Strategi HandicapBerbeda dengan strategi wash-trading, strategi pembuat pasar adalah strategi arbitrase sejati yang menghasilkan laba dengan menetapkan selisih antara harga beli dan harga jual, yang lebih sejalan dengan model laba pembuat pasar tradisional.

⚠️ Pemberitahuan Penting

Kode strategi pasar yang disajikan dalam artikel ini hanya ditujukan sebagai kerangka pembelajaran dan tidak mencerminkan pengalaman perdagangan di dunia nyata. Strategi yang disajikan di sini ditujukan hanya untuk tujuan pembelajaran dan penelitian teknis dan belum sepenuhnya tervalidasi dalam kondisi pasar dunia nyata. Pembaca disarankan untuk melakukan uji coba ulang dan penilaian risiko secara menyeluruh sebelum menggunakan informasi ini, dan tidak boleh menggunakannya secara langsung dalam perdagangan dunia nyata.


Prinsip Strategi Handicap

Strategi buku pesanan pasar adalah strategi pembentukan pasar yang memanfaatkan buku pesanan pasar (yaitu, kedalaman pasar) untuk arbitrase. Dalam strategi ini, para pembuat pasar secara dinamis menyesuaikan harga pesanan dalam celah antara harga bid dan ask berdasarkan fluktuasi pasar, menempatkan dan membatalkan pesanan, sehingga memanfaatkan likuiditas pasar dan fluktuasi harga jangka pendek untuk menghasilkan keuntungan.

Fitur Inti

  1. Sesuaikan harga pesanan tertunda secara dinamis:Secara dinamis menyesuaikan harga pesanan beli dan jual berdasarkan kedalaman pasar dan fluktuasi harga untuk meningkatkan kemungkinan transaksi.
  2. Kontrol jumlah pesanan yang tertunda: Kontrol jumlah pesanan tertunda berdasarkan dana dan posisi akun untuk menghindari paparan risiko pasar yang berlebihan.
  3. Manajemen status pesanan: Periksa status pesanan secara berkala dan proses pesanan yang belum selesai.

Perbedaan dari strategi knock-on

fitur Strategi peningkatan volume Strategi Handicap
Harga beli dan harga jual Harga sama Harga berbeda (dengan perbedaan harga)
Model keuntungan Potongan/insentif pertukaran selisih bid-ask
Paparan Risiko Rendah (transaksi harga sama) Tinggi (risiko volatilitas harga)
Kepraktisan terbatas Lebih tinggi

Keuntungan Strategi Handicap

  • Meningkatkan likuiditas pasar:Dengan menempatkan pesanan di pasar, kami dapat meningkatkan kedalaman pembelian dan penjualan pasar dan menarik lebih banyak pedagang untuk berpartisipasi.
  • Dapatkan selisih bid-ask: Dengan menyediakan likuiditas, pembuat pasar dapat memperoleh selisih bid-ask dan dengan demikian memperoleh keuntungan.
  • Respons secara fleksibel terhadap fluktuasi pasar:Strategi pasar dapat secara dinamis menyesuaikan harga pesanan tertunda sesuai dengan fluktuasi pasar untuk mengurangi risiko pasar.

Tantangan Strategi Handicap

  • Risiko Pasar: Fluktuasi harga pasar dapat menyebabkan perintah pembuat pasar gagal dieksekusi, atau bahkan mengakibatkan kerugian.
  • Tekanan keuangan:Pembuat pasar membutuhkan dana yang cukup untuk mempertahankan kedalaman jual beli di pasar. Dana yang tidak mencukupi dapat menyebabkan strategi gagal.
  • Manajemen pesanan yang kompleks:Strategi pasar memerlukan pemeriksaan status pesanan dan pemrosesan pesanan yang belum selesai secara berkala, yang meningkatkan kompleksitas strategi.

Struktur strategi handicap

Sesuai dengan strategi pemogokan, kode dalam artikel ini menerapkan strategi pembuatan pasar berdasarkan strategi kuotasi pasar, yang terutama dibagi menjadi dua kategori:

  1. MidClass: Lapisan tengah bursa bertanggung jawab untuk berinteraksi dengan antarmuka bursa guna memperoleh data pasar, informasi akun, status pesanan, dll.
  2. MarketMaker: Kelas strategi pembuatan pasar, bertanggung jawab untuk mengeksekusi strategi pasar, menghasilkan harga pesanan tertunda secara dinamis, menghasilkan pesanan tertunda, memeriksa status pesanan, memperbarui status strategi, dll.

Proses Strategi Handicap

1. Inisialisasi

ada MarketMakerDalam metode inisialisasi kelas, pertama-tama peroleh informasi akurasi bursa dan inisialisasi parameter strategi, seperti akurasi volume transaksi, akurasi harga, dll.

self.precision_info = self.exchange_mid.get_precision()  # 获取精度信息
self.price_precision = self.precision_info['price_precision']  # 价格精度
self.amount_precision = self.precision_info['amount_precision']  # 交易量精度

2. Buat kamus pesanan tertunda

Inti dari strategi pasar adalah menghasilkan kamus pending order, yang berisi harga dan kuantitas beli dan jual. Kode menghasilkan kamus ini dengan menghitung harga tengah dan offset harga.

3. Pergerakan harga pending order

Pergerakan harga pending order dicapai dengan menghitung offset harga. Offset harga didasarkan pada rentang harga (price_range) dan interval harga minimum (min_price_step) dihitung.

price_offset = price_range - self.pending_order_count * min_price_step  # 计算价格偏移量
do_trade = price_offset > 0
  • price_range: Rentang harga, menunjukkan rentang deviasi antara harga pesanan tertunda dan harga tengah.
  • min_price_step: Interval harga minimum, menunjukkan langkah penyesuaian minimum setiap harga pesanan tertunda.
  • price_offset: Offset harga, yang menunjukkan deviasi antara harga pesanan saat ini dan harga tengah.

Jika selisih harga lebih besar dari 0, artinya pesanan dapat terus ditempatkan; jika tidak, jumlah pesanan yang tertunda akan diatur ulang.

4. Hasilkan kamus pesanan tertunda

Berdasarkan selisih harga, harga beli dan jual dihitung dan kamus pesanan tertunda dibuat.

if do_trade:
    buy_price = mid_price - price_offset  # 计算买价
    buy_price = round(buy_price, self.price_precision)  # 四舍五入买价
    
    sell_price = mid_price + price_offset  # 计算卖价
    sell_price = round(sell_price, self.price_precision)  # 四舍五入卖价

    trade_dict = {
        'do_trade': do_trade,
        'buy_price': buy_price,
        'sell_price': sell_price,
        'amount': trade_amount
    }

    Log('返回盘口挂单字典:', trade_dict)
    return trade_dict
else:
    self.pending_order_count = 0  # 重置挂单次数
  • buy_price: Harga penawaran, dihitung sebagai harga tengah dikurangi harga selisih.
  • sell_price:Harga permintaan, dihitung sebagai harga tengah ditambah harga selisih.
  • trade_dict: Kamus pesanan tertunda, termasuk harga dan kuantitas beli dan jual.

5. Melaksanakan perdagangan pasar

Menurut kamus pesanan yang dihasilkan, jalankan transaksi pesanan.create_orderMetode, tempatkan pesanan beli dan pesanan jual pada saat yang sama.

def make_trade_by_dict(self, trade_dict):
    if trade_dict['do_trade']:
        buy_id = self.exchange_mid.create_order('buy', trade_dict['buy_price'], trade_dict['amount'])  # 挂买单
        sell_id = self.exchange_mid.create_order('sell', trade_dict['sell_price'], trade_dict['amount'])  # 挂卖单
        
        self.traded_pairs['pan_kou'].append({
            'buy_id': buy_id, 'sell_id': sell_id, 'init_time': time.time(), 'amount': trade_dict['amount']
        })

6. Periksa status pesanan

Periksa status pesanan secara berkala dan proses pesanan yang belum terpenuhi. Logika pemrosesan status pesanan serupa dengan strategi perdagangan silang, tetapi karena perbedaan harga, eksekusi parsial dapat mengakibatkan keuntungan atau kerugian aktual.

Kerugian utama dari strategi handicap

1. Pergerakan harga pending order tidak cukup fleksibel

Mekanisme penyesuaian harga dalam strategi ini relatif sederhana, dengan batasan sebagai berikut:

price_offset = price_range - self.pending_order_count * min_price_step  # 计算价格偏移量
  • Batas penyesuaian linier:Pengimbangan harga mengadopsi metode penurunan linier dan tidak dapat disesuaikan secara dinamis sesuai dengan volatilitas pasar aktual
  • Pemadatan parameterprice_range Dan min_price_stepIni adalah parameter tetap dan tidak dapat disesuaikan secara real time sesuai dengan kondisi pasar
  • Histeresis respons:Ketika harga pasar berubah dengan cepat, penyesuaian harga strategi mungkin tidak dapat mengikuti ritme pasar
  • Kurangnya kesadaran pasar:Tidak memperhitungkan faktor mikrostruktur pasar seperti kedalaman buku pesanan dan volume perdagangan

Arah perbaikan

  • Memperkenalkan mekanisme penyesuaian harga dinamis berdasarkan volatilitas
  • Sesuaikan harga pending order berdasarkan kedalaman dan likuiditas pasar
  • Tingkatkan penilaian Anda terhadap tren pasar dan hindari menempatkan pesanan yang berlawanan dengan tren

2. Risiko Persediaan

Strategi pasar menghadapi masalah risiko inventaris yang serius:

Kinerja Risiko

  • Risiko transaksi unilateral:Jika hanya order beli atau order jual saja yang dieksekusi, maka akan menyebabkan posisi menjadi tidak seimbang
  • Risiko terarah:Dalam pasar yang sedang tren, sejumlah besar posisi satu arah dapat terakumulasi
  • Pendudukan ibu kota: Persediaan yang berlebihan akan menghabiskan banyak dana dan mempengaruhi efisiensi strategi

Titik risiko dalam kode

if buy_order_status['Status'] == ORDER_STATE_PENDING:
    self.sell_amount += traded_pair['amount']  # 只有卖单成交,积累空头持仓
elif sell_order_status['Status'] == ORDER_STATE_PENDING:
    self.buy_amount += traded_pair['amount']  # 只有买单成交,积累多头持仓

Dampak risiko persediaan

  • Profitabilitas menurun:Posisi unilateral akan mengakibatkan kerugian ketika terjadi perubahan harga yang tidak menguntungkan
  • Tekanan likuiditas:Dana tambahan diperlukan untuk melindungi risiko inventaris
  • Strategi gagal:Dalam kasus ekstrim, strategi mungkin tidak dapat terus berjalan

Langkah-Langkah Manajemen Risiko

  • Pembatasan inventaris: Tetapkan batas posisi maksimum untuk mencegah akumulasi berlebihan
  • Lindung Nilai Dinamis:Ketika inventaris melebihi ambang batas, tutup secara aktif atau lindung nilai
  • Kemiringan harga:Sesuaikan harga beli dan jual berdasarkan inventaris saat ini untuk mendorong transaksi terbalik

Ringkasan Strategi

Strategi market-making adalah strategi yang didasarkan pada kedalaman pasar. Strategi ini menjaga likuiditas pasar dengan menyesuaikan harga dan jumlah pesanan beli dan jual secara dinamis. Dibandingkan dengan strategi wash-trading, strategi market-making memiliki karakteristik sebagai berikut:

✅ Keuntungan

  • Dapatkan keuntungan arbitrase nyata melalui perbedaan harga
  • Sesuai dengan model keuntungan pembuat pasar tradisional
  • Menyediakan likuiditas pasar yang nyata

❌ Tantangan

  • Menghadapi risiko fluktuasi harga pasar
  • Diperlukan manajemen risiko yang lebih canggih
  • Persyaratan yang lebih tinggi untuk dana dan teknologi
  • Mekanisme penyesuaian harga tidak cukup fleksibel:Mekanisme pergerakan harga linier sulit untuk beradaptasi dengan lingkungan pasar yang kompleks
  • Risiko inventaris yang menonjol: Transaksi sepihak dapat dengan mudah menyebabkan posisi tidak seimbang, dan risikonya sangat signifikan di pasar yang sedang tren.

🔮 Arah optimasi masa depan

Mengingat kekurangan strategi handicap saat ini, kita dapat mengoptimalkan dan memperbaikinya ke arah berikut di masa mendatang:

  1. Strategi pembuatan pasar yang dinamis

    • Penyesuaian harga adaptif berdasarkan volatilitas pasar
    • Sesuaikan strategi pending order secara dinamis berdasarkan kedalaman buku order
    • Memperkenalkan pembelajaran mesin untuk memprediksi arah pasar
  2. Strategi manajemen inventaris

    • Pemantauan inventaris dan penilaian risiko secara real-time
    • Mekanisme lindung nilai dinamis dan algoritma penyeimbangan persediaan
    • Strategi kemiringan harga berdasarkan status inventaris
  3. Strategi pembuatan pasar bertingkat

    • Menyediakan likuiditas pada beberapa tingkat harga secara bersamaan
    • Membubarkan risiko titik tunggal dan meningkatkan stabilitas secara keseluruhan
    • Lebih dekat dengan operasi aktual pembuat pasar profesional
  4. Manajemen Risiko yang Cerdas

    • Pemantauan indikator risiko secara real-time
    • Mekanisme stop-loss dan kontrol risiko otomatis
    • Penanganan darurat situasi pasar yang tidak normal

Kode Strategi (Revisi)

import time, json

class MidClass:
    def __init__(self, exchange_instance):
        '''
        初始化交易所中间层
        
        Args:
            exchange_instance: FMZ的交易所结构
        '''
        self.init_timestamp = time.time()  # 记录初始化时间
        self.exchange = exchange_instance  # 保存交易所对象
        self.exchange_name = self.exchange.GetName()  # 获取交易所名称
        self.trading_pair = self.exchange.GetCurrency()  # 获取交易对名称(如 BTC_USDT)

    def get_precision(self):
        '''
        获取交易对的精度信息
        
        Returns:
            返回包含精度信息的字典,失败时返回 None
        '''
        symbol_code = self.exchange.GetCurrency()
        ticker = self.exchange.GetTicker(symbol_code)  # 回测系统需要
        exchange_info = self.exchange.GetMarkets()
        data = exchange_info.get(symbol_code)

        if not data:
            Log("获取市场信息失败", GetLastError())
            return None

        # 获取该交易对的精度信息
        self.precision_info = {
            'tick_size': data['TickSize'],                  # 价格精度
            'amount_size': data['AmountSize'],              # 数量精度
            'price_precision': data['PricePrecision'],      # 价格小数位精度
            'amount_precision': data['AmountPrecision'],    # 数量小数位精度
            'min_qty': data['MinQty'],                      # 最小下单数量
            'max_qty': data['MaxQty']                       # 最大下单数量
        }

        return self.precision_info

    def get_account(self):
        '''
        获取账户信息
        
        Returns:
            获取信息成功返回 True,获取信息失败返回 False
        '''

        self.balance = '---'  # 账户余额
        self.amount = '---'  # 账户持仓量
        self.frozen_balance = '---'  # 冻结余额
        self.frozen_stocks = '---'  # 冻结持仓量
        self.init_balance = None
        self.init_stocks = None
        self.init_equity = None

        try:
            account_info = self.exchange.GetAccount()  # 获取账户信息
            self.balance = account_info['Balance']  # 更新账户余额
            self.amount = account_info['Stocks']  # 更新持仓量
            self.frozen_balance = account_info['FrozenBalance']  # 更新冻结余额
            self.frozen_stocks = account_info['FrozenStocks']  # 更新冻结持仓量
            self.equity = self.balance + self.frozen_balance + (self.amount + self.frozen_stocks) * self.last_price
            
            if not self.init_balance or not self.init_stocks or not self.init_equity:
                if _G("init_balance") and _G("init_balance") > 0 and _G("init_stocks") and _G("init_stocks") > 0:
                    self.init_balance = round(_G("init_balance"), 2)
                    self.init_stocks = round(_G("init_stocks"), 2)
                    self.init_equity = round(_G("init_equity"), 2)
                else:
                    self.init_balance = round(self.balance + self.frozen_balance, 2)
                    self.init_stocks = self.amount + self.frozen_stocks
                    self.init_equity = round(self.init_balance + (self.init_stocks * self.last_price), 2)
                    _G("init_balance", self.init_balance)
                    _G("init_stocks", self.init_stocks)
                    _G("init_equity", self.init_equity)

                    Log('获取初始eqity', self.init_equity)

            self.profit = self.equity - self.init_equity
            self.profitratio = round((self.equity - self.init_equity)/self.init_equity, 4) * 100

            return True
        except:
            return False  # 获取账户信息失败

    def get_ticker(self):
        '''
        获取市价信息(如买一价、卖一价、最高价、最低价等)
        
        Returns:
            获取信息成功返回 True,获取信息失败返回 False
        '''
        self.high_price = '---'  # 最高价
        self.low_price = '---'  # 最低价
        self.sell_price = '---'  # 卖一价
        self.buy_price = '---'  # 买一价
        self.last_price = '---'  # 最新成交价
        self.volume = '---'  # 成交量
        
        try:
            ticker_info = self.exchange.GetTicker()  # 获取市价信息
        
            self.high_price = ticker_info['High']  # 更新最高价
            self.low_price = ticker_info['Low']  # 更新最低价
            self.sell_price = ticker_info['Sell']  # 更新卖一价
            self.buy_price = ticker_info['Buy']  # 更新买一价
            self.last_price = ticker_info['Last']  # 更新最新成交价
            self.volume = ticker_info['Volume']  # 更新成交量
            return True
        except:
            return False  # 获取市价信息失败
        
    def get_depth(self):
        '''
        获取深度信息(买卖盘的挂单列表)
        
        Returns:
            获取信息成功返回 True,获取信息失败返回 False
        '''
        self.ask_orders = '---'  # 卖盘挂单列表
        self.bid_orders = '---'  # 买盘挂单列表
        
        try:
            depth_info = self.exchange.GetDepth()  # 获取深度信息
            self.ask_orders = depth_info['Asks']  # 更新卖盘挂单列表
            self.bid_orders = depth_info['Bids']  # 更新买盘挂单列表
            return True
        except:
            return False  # 获取深度信息失败
        
    def get_ohlc_data(self, period=PERIOD_M5):
        '''
        获取K线信息
        
        Args:
            period: K线周期,PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟,
            PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天。
        '''
        self.ohlc_data = self.exchange.GetRecords(period)  # 获取K线数据
        
    def create_order(self, order_type, price, amount):
        '''
        提交一个挂单信息
        
        Args:
            order_type:挂单类型,'buy'指挂买单,'sell'指挂卖单
            price:挂单价格
            amount:挂单数量
            
        Returns:
            挂单Id号,可用以取消挂单
        '''
        if order_type == 'buy':
            try:
                order_id = self.exchange.Buy(price, amount)  # 提交买单
            except:
                return False  # 买单提交失败
            
        elif order_type == 'sell':
            try:
                order_id = self.exchange.Sell(price, amount)  # 提交卖单
            except:
                return False  # 卖单提交失败
        
        return order_id  # 返回订单ID
    
    def get_orders(self):
        '''
        获取未完成的订单列表
        
        Returns:
            未完成的订单列表
        '''
        self.open_orders = self.exchange.GetOrders()  # 获取未完成订单
        return self.open_orders
    
    def cancel_order(self, order_id):
        '''
        取消一个挂单信息
        
        Args:
            order_id:希望取消的挂单ID号
            
        Returns:
            取消挂单成功返回 True,取消挂单失败返回 False
        '''
        return self.exchange.CancelOrder(order_id)  # 取消订单
        
    def refresh_data(self):
        '''
        刷新信息(账户、市价、深度、K线)
        
        Returns:
            刷新信息成功返回 'refresh_data_finish!' 否则返回相应刷新失败的信息提示
        '''

        if not self.get_ticker():  # 刷新市价信息
            return 'false_get_ticker'

        if not self.get_account():  # 刷新账户信息
            return 'false_get_account'
        
        if not self.get_depth():  # 刷新深度信息
            return 'false_get_depth'
        
        try:
            self.get_ohlc_data()  # 刷新K线信息
        except:
            return 'false_get_K_line_info'
        
        return 'refresh_data_finish!'  # 刷新成功


class MarketMaker:
    def __init__(self, mid_class):
        '''
        初始化做市策略
        
        Args:
            mid_class: 交易所中间层对象
        '''
        self.exchange_mid = mid_class  # 交易所中间层对象
        self.precision_info = self.exchange_mid.get_precision()  # 获取精度信息

        self.done_amount = {'pan_kou': 0}  # 已完成交易量
        # 修正:正确分配精度信息
        self.price_precision = self.precision_info['price_precision']  # 价格精度
        self.amount_precision = self.precision_info['amount_precision']  # 交易量精度
        
        self.traded_pairs = {'pan_kou': []}  # 已挂单的交易对
        self.pending_orders = []  # 未完成的订单状态
        self.pending_order_count = 0  # 挂单次数

        self.buy_amount = 0
        self.sell_amount = 0

        self.fee = 0
        self.fee_rate = 0.08 / 100

        self.chart = {
            "__isStock": True,
            "tooltip": {"xDateFormat": "%Y-%m-%d %H:%M:%S, %A"},
            "title": {"text": "挂单数量"},
            "xAxis": {"type": "datetime"},
            "yAxis": {
                "title": {"text": "挂单数量"},
                "opposite": False
            },
            "series": [
                {"name": "挂单买量", "id": "挂单买量", "data": []},
                {"name": "挂单卖量", "id": "挂单卖量", "dashStyle": "shortdash", "data": []}
            ]
        }

    def refresh_data(self):
        '''
        刷新数据(账户、市价、深度、K线)
        '''
        self.exchange_mid.refresh_data()  # 刷新交易所数据
        self.position_amount = 0 if isinstance(self.exchange_mid.amount, str) else self.exchange_mid.amount  # 持仓量
        self.available_balance = 0 if isinstance(self.exchange_mid.balance, str) else self.exchange_mid.balance  # 账户余额

        self.can_buy_amount = self.available_balance / float(self.exchange_mid.buy_price)  # 可买的数量
        self.mid_price = (self.exchange_mid.sell_price + self.exchange_mid.buy_price) / 2  # 中间价

    def make_trade_by_dict(self, trade_dict):
        '''
        根据交易字典执行交易
        
        Args:
            trade_dict: 交易字典
        '''
        Log('4按照字典开始交易')
        self.refresh_data()  # 刷新数据
        
        if trade_dict['do_trade']:
            Log('当前账户资金: 币数余额: ', self.position_amount, '资金余额: ', self.can_buy_amount)
            Log('检查开仓: 币数限制: ', self.position_amount > trade_dict['amount'], '资金限制: ', self.can_buy_amount > trade_dict['amount'])
            if self.position_amount > trade_dict['amount'] and self.can_buy_amount > trade_dict['amount']:
                buy_id = self.exchange_mid.create_order('buy', trade_dict['buy_price'], trade_dict['amount'])  # 挂买单
                sell_id = self.exchange_mid.create_order('sell', trade_dict['sell_price'], trade_dict['amount'])  # 挂卖单
                
                self.traded_pairs['pan_kou'].append({
                    'buy_id': buy_id, 'sell_id': sell_id, 'init_time': time.time(), 'amount': trade_dict['amount']
                })
                    
                self.last_time = time.time()  # 更新上次交易时间
        
    def handle_pending_orders(self):
        '''
        处理未完成的订单
        '''
        pending_orders = self.exchange_mid.get_orders()  # 获取未完成订单
        if len(pending_orders) > 0:
            for order in pending_orders:
                self.exchange_mid.cancel_order(order['Id'])  # 取消未完成订单
                
    def make_pankou_dict(self, price_range, min_price_step, trade_amount):
        
        '''
        生成盘口挂单字典
        
        Args:
            price_range: 价格范围
            min_price_step: 最小价格间隔
            trade_amount: 每次交易量
        
        Returns:
            盘口挂单字典列表
        '''
        Log('3制作盘口挂单字典', '移动盘口次数', self.pending_order_count)
        mid_price = self.mid_price  # 中间价
        
        price_offset = price_range - self.pending_order_count * min_price_step  # 计算价格偏移量
        do_trade = price_offset > 0

        if do_trade:
            buy_price = mid_price - price_offset  # 计算买价
            buy_price = round(buy_price, self.price_precision)  # 四舍五入买价
            
            sell_price = mid_price + price_offset  # 计算卖价
            sell_price = round(sell_price, self.price_precision)  # 四舍五入卖价

            trade_dict = {
                'do_trade': do_trade,
                'buy_price': buy_price,
                'sell_price': sell_price,
                'amount': trade_amount
            }

            Log('返回盘口挂单字典:', trade_dict)
            return trade_dict
        else:
            Log('重置移动盘口次数:', self.pending_order_count)
            self.pending_order_count = 0  # 重置移动盘口次数
            # 修正:当不能交易时返回None或空字典
            return None
            
    
    def check_order_status(self, current_time):
        '''
        检查订单状态
        
        Args:
            current_time: 当前时间戳
        '''
        Log('1开始订单信息检查')
        Log(self.traded_pairs['pan_kou'])
        self.buy_pending = 0
        self.sell_pending = 0
        for traded_pair in self.traded_pairs['pan_kou'].copy():
            Log('检查订单:', traded_pair['buy_id'], traded_pair['sell_id'])

            try:
                buy_order_status = self.exchange_mid.exchange.GetOrder(traded_pair['buy_id'])  # 获取买单状态
                sell_order_status = self.exchange_mid.exchange.GetOrder(traded_pair['sell_id'])  # 获取卖单状态
            except:
                Log(traded_pair, '取消')
                self.exchange_mid.cancel_order(traded_pair['buy_id'])  # 取消买单
                self.exchange_mid.cancel_order(traded_pair['sell_id'])  # 取消卖单
                self.traded_pairs['pan_kou'].remove(traded_pair)  # 移除订单
                return

            Log('检查订单:', traded_pair['buy_id'], buy_order_status, traded_pair['sell_id'], sell_order_status, [sell_order_status['Status'], buy_order_status['Status']])
            if [sell_order_status['Status'], buy_order_status['Status']] == [0, 0]:
                self.buy_pending += 1
                self.sell_pending += 1
                if current_time % 5 == 0:
                    Log('检查挂单,取消挂单(两未完)', buy_order_status['Status'], sell_order_status['Status'], current_time % 5)
                    self.exchange_mid.cancel_order(traded_pair['buy_id'])  # 取消买单
                    self.exchange_mid.cancel_order(traded_pair['sell_id'])  # 取消卖单
                    self.pending_order_count += 1  # 移动盘口次数次数加1
                    self.traded_pairs['pan_kou'].remove(traded_pair)  # 移除订单

            elif {sell_order_status['Status'], buy_order_status['Status']} == {1, 0}:
                if buy_order_status['Status'] == ORDER_STATE_PENDING:
                    self.buy_pending += 1
                if sell_order_status['Status'] == ORDER_STATE_PENDING:
                    self.sell_pending += 1
                if current_time % 5 == 0:
                    Log('检查挂单,取消挂单(一未完)', buy_order_status['Status'], sell_order_status['Status'])
                    self.done_amount['pan_kou'] += traded_pair['amount']  # 更新交易量
                    if buy_order_status['Status'] == ORDER_STATE_PENDING:
                        self.sell_amount += traded_pair['amount']
                        self.fee += sell_order_status['Amount'] * self.fee_rate * sell_order_status['Price']
                        Log('取消该买订单,增加未完成买列表', traded_pair['buy_id'])
                        self.exchange_mid.cancel_order(traded_pair['buy_id'])  # 取消买单
                        self.pending_orders.append(['buy', buy_order_status['Status']])  # 记录未完成订单
                        Log('清除前:', self.traded_pairs['pan_kou'])
                        Log('清除id:', traded_pair)
                        self.traded_pairs['pan_kou'].remove(traded_pair)  # 移除订单
                        Log('清除后:', self.traded_pairs['pan_kou'])
                    elif sell_order_status['Status'] == ORDER_STATE_PENDING:
                        self.buy_amount += traded_pair['amount']
                        self.fee += buy_order_status['Amount'] * self.fee_rate * buy_order_status['Price']
                        Log('取消该卖订单,增加未完成卖列表', traded_pair['sell_id'])
                        self.exchange_mid.cancel_order(traded_pair['sell_id'])  # 取消卖单
                        self.pending_orders.append(['sell', sell_order_status['Status']])  # 记录未完成订单
                        Log('清除前:', self.traded_pairs['pan_kou'])
                        Log('清除id:', traded_pair)
                        self.traded_pairs['pan_kou'].remove(traded_pair)  # 移除订单
                        Log('清除后:', self.traded_pairs['pan_kou'])
                
            elif [sell_order_status['Status'], buy_order_status['Status']] == [1, 1]:
                Log('两订单都已完成')
                Log('完成状态:', buy_order_status['Status'], sell_order_status['Status'], traded_pair['amount'])
                self.done_amount['pan_kou'] += 2 * traded_pair['amount']  # 更新交易量
                self.buy_amount += traded_pair['amount']
                self.sell_amount += traded_pair['amount']
                self.fee += buy_order_status['Amount'] * self.fee_rate * buy_order_status['Price']
                self.fee += sell_order_status['Amount'] * self.fee_rate * sell_order_status['Price']
                self.traded_pairs['pan_kou'].remove(traded_pair)  # 移除订单
            else:
                Log('两订单处于未知状态:', buy_order_status, sell_order_status)
                Log('未知订单状态:', buy_order_status['Status'], sell_order_status['Status'])
                Log('未知订单信息:', traded_pair)

    def update_status(self):

        self.exchange_mid.refresh_data()

        table1 = {
            "type": "table",
            "title": "账户信息",
            "cols": [
                "初始资金", "现存资金", "盘口买入数量", "盘口卖出数量", "费率", "总收益", "收益率"
            ],
            "rows": [
                [   
                    self.exchange_mid.init_equity,
                    self.exchange_mid.equity,
                    round(self.buy_amount, 4),
                    round(self.sell_amount, 4),
                    round(self.fee, 2),
                    self.exchange_mid.profit,
                    str(self.exchange_mid.profitratio) + "%"
                ],
            ],
        }

        LogStatus(
            f"初始化时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.exchange_mid.init_timestamp))}\n",
            f"`{json.dumps(table1)}`\n",
            f"最后执行时间: {_D()}\n"
        )

        LogProfit(round(self.exchange_mid.profit, 3), '&')

    def plot_pending(self):
        
        Log('盘口挂单数量:', self.buy_pending, self.sell_pending)
        self.obj_chart = Chart(self.chart)
        now_time = int(time.time() * 1000)
        # 更新挂单买量数据
        self.obj_chart.add(0, [now_time, self.buy_pending])
        # 更新挂单卖量数据
        self.obj_chart.add(1, [now_time, self.sell_pending])

def main():
    '''
    主函数,运行做市策略
    '''
    exchange.IO('simulate', True) #OKX现货模拟账户
    exchange.IO("trade_super_margin")

    current_time = 0
    target_amount = 1  # 目标交易量
    
    price_range = 5  # 价格范围
    min_price_step = 1  # 最小价格间隔
    trade_amount = 0.01  # 每次交易量
    
    exchange_mid = MidClass(exchange)  # 初始化交易所中间层
    Log(exchange_mid.refresh_data())  # 刷新数据
    market_maker = MarketMaker(exchange_mid)  # 初始化做市策略
    
    # 修正:初始化trade_dict
    trade_dict = None
    
    while market_maker.done_amount['pan_kou'] < target_amount:  # 循环直到完成目标交易量
        Log(market_maker.traded_pairs['pan_kou'])
        market_maker.check_order_status(current_time)  # 检查订单状态
        Sleep(1000)  # 等待1秒
        market_maker.refresh_data()  # 刷新数据
        
        if len(market_maker.traded_pairs['pan_kou']) < 1: # 价格移动,盘口挂单撤销,等待至所有挂单完毕,制定新的挂单字典
            
            Log('2盘口交易对数量小于1')
            trade_dict = market_maker.make_pankou_dict(price_range, min_price_step, trade_amount)  # 生成盘口挂单字典
            Log('新交易字典', trade_dict)
        
        # 修正:确保trade_dict存在且不为None
        if trade_dict and trade_dict.get('do_trade', False):
            market_maker.make_trade_by_dict(trade_dict)  # 执行交易

        Log('盘口做市数量:', market_maker.done_amount['pan_kou'])  # 记录交易量

        market_maker.plot_pending()
        market_maker.update_status()
        current_time += 1
        
    Log(market_maker.position_amount, market_maker.can_buy_amount)  # 记录持仓量和可买数量
    Log('现存订单:', exchange.GetOrders())  # 记录现存订单

def onexit():
    Log("执行扫尾函数")

    _G("init_balance", None)
    _G("init_stocks", None)
    _G("init_equity", None)