2
fokus pada
439
Pengikut

Penerokaan Praktikal Strategi Arbitraj Penghantaran Spot: Perangkap dari Ideal kepada Realiti

Dicipta dalam: 2025-11-28 14:22:49, dikemas kini pada: 2025-12-16 11:31:06
comments   0
hits   345

Penerokaan Praktikal Strategi Arbitraj Penghantaran Spot: Perangkap dari Ideal kepada Realiti

Mukadimah

Baru-baru ini, seorang rakan bertanya sama ada saya boleh mencipta strategi arbitraj, yang kebetulan kekurangan pada platform Inventor. Saya fikir ia tidak akan sukar, tetapi ia mengambil masa kira-kira sebulan untuk logik asas berfungsi. Jika diimbas kembali sekarang, perangkap yang saya temui dari idea awal hingga pelaksanaannya jauh lebih banyak daripada yang saya bayangkan.

Artikel ini mendokumentasikan masalah praktikal yang dihadapi dan penyelesaian yang dibangunkan semasa pembangunan strategi arbitraj ini.Untuk tujuan pembelajaran dan rujukan sahaja; ia tidak mempunyai nilai pelaburan praktikal.

Logik asas strategi

Terdapat perbezaan harga antara kontrak penghantaran dan harga spot, yang biasanya turun naik sekitar purata tertentu. Apabila perbezaan harga terlalu jauh menyimpang, secara teorinya terdapat peluang arbitraj.

Idea awalnya mudah:

  • Pantau perbezaan harga antara kontrak tempat dan penghantaran
  • Buka posisi apabila perbezaan harga melebihi 2 kali ganda sisihan piawai.
  • Keuntungan dengan menutup posisi apabila perbezaan harga kembali kepada nilai asalnya.

Kedengaran hebat, bukan? Tetapi dalam praktiknya, anda akan mendapati terdapat banyak butiran untuk mengendalikan langkah “membuka posisi”.

Perangkap pertama: kestabilan spread harga

Pada mulanya, kami menggunakan sisihan spread harga sebagai penunjuk langsung, tetapi kami mendapati bahawa kadangkala spread harga akan terus melebar dan tidak pernah kembali kepada keadaan sebelumnya. Kemudian, kami menyedari…Tidak semua spread harga stabil.

Terutamanya apabila tarikh penghantaran semakin hampir, tingkah laku penyebaran boleh berubah. Oleh itu, ujian ADF telah ditambah untuk menentukan sama ada siri penyebaran adalah pegun.

function adfTest(series, maxLag=null){
  const n = series.length;
  if(n<10) throw new Error('series too short');
  if(maxLag===null) maxLag = Math.floor(12*Math.pow(n/100, 1/4));
  
  // ... ADF检验的核心计算逻辑
  
  const res = ols(rows, Ys);
  const tstat = tStat(res.beta, res.cov, 1);
  return { tStat: tstat, pValue: pval, usedLag: p };
}

Pada mulanya, kami menambah beberapa ujian, termasuk ujian nisbah varians, ujian separuh hayat dan ujian KS, tetapi kami mendapati bahawa terlalu banyak ujian mengurangkan bilangan peluang untuk membuka posisi dengan ketara. Akhirnya, kami memudahkannya kepada hanya ujian ADF dan menetapkan ambang nilai-p kepada 0.1.

Lebih penting lagi, satu lagi telah ditambah.Kaunter kegagalan berterusan

if (!adfPass) {
  stationarityFailCount[deliverySymbol] = (stationarityFailCount[deliverySymbol] || 0) + 1;
} else {
  stationarityFailCount[deliverySymbol] = 0;
}

let consecutiveFails = stationarityFailCount[deliverySymbol];
let canTrade = consecutiveFails < CONFIG.consecutiveFailThreshold;

Dagangan adalah dilarang jika ujian gagal tiga kali berturut-turut. Ini boleh mengelakkan pembukaan posisi secara membuta tuli apabila pasaran berada dalam keadaan tidak normal.

Perangkap kedua: Kekeliruan seputar statistik untung rugi masa nyata

Mengira keuntungan dan kerugian untuk akaun niaga hadapan adalah mudah; lihat sahaja perubahan dalam USDT. Tetapi akaun spot adalah berbeza; ia mengandungi kedua-dua USDT dan mata wang kripto. Bagaimanakah anda mengiranya?

Berikut adalah perincian yang mudah diabaikan:Kos penyimpanan barangan spot akan berubah mengikut dagangan.Contohnya, jika anda membeli satu syiling dengan harga 100 USDT, menjualnya dengan harga 90 USDT, dan kemudian membelinya semula dengan harga 85 USDT, asas kos anda bukan lagi 100 USDT awal. Hanya menggunakan harga yang dibekukan pada masa membuka posisi untuk mengira nilai syiling tidak akan mencerminkan situasi untung rugi sebenar.

Pendekatan yang betul ialahEkstrak harga transaksi purata sebenar daripada objek pesanan.

let openSpotPrice = (openSpotOrder && openSpotOrder.AvgPrice) ? 
  openSpotOrder.AvgPrice : record.openSpotPrice;
let closeSpotPrice = closeSpotOrder.AvgPrice || currentPair.spotPrice;

Kemudian, kadar pulangan dikira berdasarkan harga transaksi sebenar:

// 正套:买现货+卖期货
if (record.direction === 'positive') {
  spotReturnRate = (closeSpotPrice - openSpotPrice) / openSpotPrice;
  deliveryReturnRate = (openDeliveryPrice - closeDeliveryPrice) / openDeliveryPrice;
} else {
  // 反套:卖现货+买期货
  spotReturnRate = (openSpotPrice - closeSpotPrice) / openSpotPrice;
  deliveryReturnRate = (closeDeliveryPrice - openDeliveryPrice) / openDeliveryPrice;
}

let totalReturnRate = spotReturnRate + deliveryReturnRate;
let requiredUSD = openSpotPrice * record.spotAmount;
let actualTotalPnl = totalReturnRate * requiredUSD;

Perhatikan logik pengiraan untung rugi di sini:

  • Set biasaPada masa itu, pasaran spot adalah panjang dan pasaran niaga hadapan adalah pendek, jadi keuntungan/kerugian untuk pasaran spot = (harga penutup - harga pembukaan) / harga pembukaan, dan keuntungan/kerugian untuk pasaran niaga hadapan = (harga pembukaan - harga penutup) / harga pembukaan.
  • terbalikPada masa itu, dagangan spot melibatkan penjualan pendek manakala dagangan niaga hadapan melibatkan pembelian panjang, dalam arah yang bertentangan.

Akhir sekali, keuntungan atau kerugian sebenar bagi setiap transaksi dijumlahkan kepada jumlah keuntungan atau kerugian:

accumulatedProfit += actualTotalPnl;
_G('accumulatedProfit', accumulatedProfit);

Perangkap utama ketiga: perangkap kecairan

Inilah masalah sebenar. Mengapa, selepas 10 tahun beroperasi, Platform Kuantitatif Pencipta mempunyai begitu sedikit strategi arbitraj untuk kontrak niaga hadapan? Jawapannya mudah:Kecairan yang tidak mencukupi dalam pasaran kontrak penghantaran

Soalan 1: Transaksi satu kaki

Arbitraj bukanlah kisah dongeng di mana anda membuka posisi secara serentak. Realitinya ialah:

  • Pesanan segera telah dilaksanakan, tetapi pesanan niaga hadapan masih belum selesai.
  • Atau pesanan niaga hadapan telah dilaksanakan, tetapi pesanan spot telah dibatalkan.

Ini adalah contoh klasik “risiko berkaki satu.” Sebelah kaki berada di dalam, manakala yang satu lagi masih di luar. Pada ketika ini, sebarang turun naik harga bukan lagi arbitraj tetapi kedudukan berat sebelah.

Penyelesaiannya adalah dengan menyertaiMekanisme gulung balik

if (!deliveryOrder) {
  Log('❌ 期货卖单失败,回滚现货');
  exchanges[0].CreateOrder(pair.spotSymbol, 'sell', -1, spotAmount);
  addCooldown(pair.deliverySymbol, pair.coin, '期货卖单失败,已回滚现货');
  return false;
}

Jika mana-mana bahagian gagal, segera buat pesanan pasaran untuk menutup bahagian yang telah dilaksanakan, sekali gus mengurangkan pendedahan risiko bahagian tersebut.

Soalan 2: Pesanan pasaran juga boleh ditolak.

Lebih tidak masuk akal lagi, kadangkala pesanan pasaran juga gagal. Ini mungkin disebabkan oleh kawalan risiko pertukaran atau kedalaman pasaran yang tidak mencukupi; pendek kata, pesanan itu tidak akan berjaya.

Jadi saya melakukannya.Mekanisme berganda pesanan pasaran + pesanan had

function createOrderWithFallback(exchange, symbol, direction, amount, limitPrice, orderType, maxRetry = 3) {
  let useMarketOrder = (limitPrice === -1);
  
  // 先尝试限价单
  if (!useMarketOrder) {
    orderId = exchange.CreateOrder(symbol, direction, limitPrice, amount);
    if (!orderId) {
      Log(`❌ 限价单提交失败,改用市价单`);
      useMarketOrder = true;
    }
  }
  
  // 限价单失败则用市价单
  if (useMarketOrder && !orderId) {
    orderId = exchange.CreateOrder(symbol, direction, -1, marketAmount);
  }
  
  // ... 检查订单状态,失败则重试
}

Sistem ini boleh mencuba semula sehingga maksimum 3 kali, dengan setiap percubaan menggunakan pesanan pasaran sebagai jaringan keselamatan.

Soalan 3: Perangkap Amaun dalam Pesanan Pembelian Spot

Perangkap ini amat tersembunyi dan memerlukan lebih berhati-hati. Kuantiti untuk pesanan pasaran niaga hadapan ialah…Bilangan syilingWalau bagaimanapun, kuantiti yang dipesan semasa membeli pesanan pasaran spot ialah…Jumlah USDT

Di sini, logik penukaran telah ditambah secara khusus:

function getActualAmount(useMarket) {
  if (isSpotBuy && useMarket) {
    // 现货市价买单:需要用USDT金额
    let currentPrice = getDepthMidPrice(exchange, symbol);
    let usdtAmount = amount * currentPrice;
    Log(`  💡 现货买单转换: ${amount.toFixed(6)} 币 → ${usdtAmount.toFixed(4)} USDT`);
    return usdtAmount;
  }
  return amount;
}

Jumlah mata wang kripto yang digunakan dalam pesanan had ditukar secara automatik kepada USDT untuk pesanan pasaran.

Perangkap keempat: ilusi peluang arbitraj

Satu lagi masalah yang mengecewakan ialah isyarat arbitraj dikesan, dan anda bersedia untuk membuka posisi, tetapi peluang itu telah hilang apabila anda membuat pesanan.

Harga turun naik dalam masa nyata, dan keadaan pasaran mungkin telah berubah antara pengesanan isyarat dan pelaksanaan sebenar sesuatu posisi. Spread harga mungkin telah mengecil, dan peluang arbitraj mungkin telah hilang. Jika anda masih membuka posisi dengan bodoh pada ketika ini, anda hanya membuang yuran komisen.

Jadi ia telah ditambah.Mekanisme pengesahan sekunder

// 开仓前重新获取实时价格并验证套利机会
Log('🔄 重新获取实时Depth盘口价格并验证套利机会...');

let realtimeSpotPrice = getDepthMidPrice(exchanges[0], pair.spotSymbol, true);
let realtimeDeliveryPrice = getDepthMidPrice(exchanges[1], pair.deliverySymbol, true);

let realtimeSpread = realtimeDeliveryPrice - realtimeSpotPrice;
let realtimeSpreadRate = realtimeSpread / realtimeSpotPrice;

// 重新计算实时Z-Score
let realtimeZScore = (realtimeSpreadRate - mu) / (sigma || 1e-6);

// 验证:实时Z-Score是否仍然满足开仓条件
if (absRealtimeZ < CONFIG.zScoreEntry) {
  Log('❌ 套利机会已消失!');
  Log('  取消开仓,避免亏损');
  return false;
}

Sebelum membuat pesanan, ambil semula harga masa nyata, kira semula Skor-Z dan hanya laksanakan pesanan jika anda pasti peluang itu masih wujud.

Perangkap kelima: Isu legasi berkaitan dengan kedudukan niaga hadapan.

Kadangkala, apabila strategi dimulakan semula atau posisi sebelumnya ditutup, mungkin terdapat posisi baki dalam akaun niaga hadapan. Jika ini tidak ditangani, posisi baharu akan bertindih dengan posisi lama, yang membawa kepada saiz posisi di luar kawalan.

Jadi ia telah ditambah.Pembubaran paksa sebelum membuka posisiLogiknya:

// 检查期货现有仓位并平仓
let existingPosition = getPositionBySymbol(pair.deliverySymbol);

if (existingPosition && Math.abs(existingPosition.Amount) > 0) {
  Log('⚠️ 检测到该合约的现有仓位,执行平仓操作...');
  
  let closeDirection = existingPosition.Type === PD_LONG ? 'closebuy' : 'closesell';
  let closeAmount = Math.abs(existingPosition.Amount);
  
  let closeOrder = createOrderWithFallback(
    exchanges[1],
    pair.deliverySymbol,
    closeDirection,
    closeAmount,
    -1,
    '期货'
  );
  
  if (!closeOrder) {
    Log('❌ 平仓现有持仓失败,终止开仓');
    addCooldown(pair.deliverySymbol, pair.coin, '平仓现有持仓失败');
    return false;
  }
}

Sebelum membuka sesuatu posisi, semak dahulu. Jika terdapat sebarang posisi yang tinggal, tutuplah posisi tersebut untuk memastikan akaun anda bersih.

Perangkap utama keenam: Perangkap lag data Ticker

Ini adalah keseluruhan proses pembangunan strategiPaling tersembunyi dan paling membawa mautSalah satu masalahnya.

Selepas strategi itu mula berjalan, satu fenomena aneh telah diperhatikan:

  • Isyarat arbitraj telah dikesan, dan sudah tiba masanya untuk membuka posisi.
  • Harga pesanan had optimum dikira dengan menambah dan menolak perbezaan harga daripada harga Tiket.
  • Akibatnya, pesanan itu masih belum selesai, menunggu untuk dipenuhi.
  • Setelah menunggu lama tanpa sebarang transaksi selesai, pesanan itu dibatalkan.

Cuba gunakan pesanan pasaran sebaliknya? Hasilnya lebih teruk lagi:

  • Pesanan pasaran telah berjaya dilaksanakan.
  • Walau bagaimanapun, harga transaksi adalah sama sekali berbeza daripada spread arbitraj yang dijangkakan.
  • Peluang arbitraj yang dirancang ternyata tidak menguntungkan selepas transaksi selesai.

Apa sebenarnya yang berlaku? Selepas berulang kali membandingkan data dagangan langsung bursa, masalahnya akhirnya ditemui:

Ticker vs Kedalaman: Perbezaan Asas Antara Data

Data ticker mencerminkan harga transaksi sebenar terkini.Ini kedengaran baik, tetapi bagi pasaran dengan kecairan rendah seperti kontrak penghantaran, masalah timbul:

时间轴:
10:00:00 - 有人以50000成交了1张合约 → Ticker价格更新为50000
10:00:05 - 盘口挂单:买49800 / 卖50200(但没有成交)
10:00:10 - 盘口挂单:买49850 / 卖50150(但没有成交)
...
10:05:00 - Ticker价格仍然是50000(因为5分钟内没有新的成交)

Adakah anda perasan masalahnya?Harga Ticker sebanyak 50,000 sudah menjadi sejarah 5 minit yang lalu.Walau bagaimanapun, harga pasaran sebenar semasa (harga buku pesanan) mungkin telah menjadi 4985050150.

Jika anda menggunakan harga Ticker sebanyak 50,000 untuk mengira peluang arbitraj dan membuat pesanan had, maka:

  1. Kesilapan penghakimanIsyarat arbitraj dikira berdasarkan harga yang ketinggalan zaman.
  2. Pesanan gagalHarga pada pesanan had terlalu jauh daripada harga pasaran sebenar, menjadikannya mustahil untuk menyelesaikan transaksi.
  3. Kerugian pasaranPesanan pasaran telah digunakan untuk memaksa perdagangan, tetapi harga sebenar adalah sama sekali berbeza daripada yang dijangkakan.

Mengapakah ticker untuk kontrak penghantaran amat tidak boleh dipercayai?

Kecairan kontrak penghantaran jauh lebih teruk daripada kontrak spot:

  • Pasaran SpotSebilangan besar transaksi berlaku setiap saat, dan harga Ticker dikemas kini hampir dalam masa nyata dengan sedikit kelewatan.
  • Kontrak PenghantaranIa mungkin mengambil masa beberapa minit atau lebih lama untuk transaksi berlaku; harga Ticker agak ketinggalan.

Bagi kontrak dengan kecairan yang lemah, sisihan antara harga ticker dan harga buku pesanan sebenar mungkin mencapai:

  • Julat biasa: 0.1% - 0.5%
  • Tempoh turun naik: 1% - 3% atau lebih

Bagi strategi arbitraj, sisihan ini membawa maut. Kelebihan perbezaan harga yang dijangkakan mungkin hanya 0.5%, tetapi harga transaksi sebenar ternyata sama sekali berbeza.

Penyelesaian: Gantikan Ticker dengan data cakera Kedalaman

Oleh kerana Ticker tidak boleh dipercayai, mari kita gunakan…Data kedalaman (kedalaman buku pesanan)

function getDepthMidPrice(exchange, symbol, logDetail = false) {
    let depth = exchange.GetDepth(symbol);
    if (!depth || !depth.Bids || depth.Bids.length === 0 || 
        !depth.Asks || depth.Asks.length === 0) {
        Log(`❌ 获取${symbol}盘口失败`);
        return null;
    }
    
    let bestBid = depth.Bids[0].Price;  // 最优买价
    let bestAsk = depth.Asks[0].Price;  // 最优卖价
    let midPrice = (bestBid + bestAsk) / 2;  // 中间价
    
    if (logDetail) {
        let spread = bestAsk - bestBid;
        let spreadRate = spread / midPrice * 100;
        Log(`📊 ${symbol} 盘口: Bid=${bestBid.toFixed(2)}, Ask=${bestAsk.toFixed(2)}, Mid=${midPrice.toFixed(2)}, Spread=${spread.toFixed(2)} (${spreadRate.toFixed(3)}%)`);
    }
    
    return midPrice;
}

Kelebihan Data Kedalaman:

  • Masa nyataMencerminkan status sebenar semasa buku pesanan, tanpa sebarang kelewatan.
  • ketepatanPesanan anda akan dipadankan dengan buku pesanan ini, dan ini adalah harga pasaran sebenar.
  • KebolehkendalianPesanan had yang dikira berdasarkan harga buku pesanan mempunyai kebarangkalian yang lebih tinggi untuk dilaksanakan.

Sistem strategi penetapan harga berganda

Akhirnya diterima pakaiPenyelesaian hibrid Ticker + Depth

1. Gunakan Ticker untuk mengekalkan jujukan data sejarah.

// 用Ticker更新历史价差序列(保持连续性)
let spotTicker = exchanges[0].GetTicker(pair.spotSymbol);
let deliveryTicker = exchanges[1].GetTicker(pair.deliverySymbol);

pair.spotPrice = spotTicker.Last;
pair.deliveryPrice = deliveryTicker.Last;
pair.spread = pair.deliveryPrice - pair.spotPrice;

// 历史序列用于ADF检验、Z-Score计算
priceHistory[pair.deliverySymbol].push({
    time: Date.now(),
    spreadRate: pair.spread / pair.spotPrice,
    spread: pair.spread,
    spotPrice: pair.spotPrice,
    deliveryPrice: pair.deliveryPrice
});

Mengapa Ticker masih digunakan untuk data sejarah? Kerana ia perlu.Kesinambungan dataJika data sejarah juga diwakili menggunakan Kedalaman, turun naik harga buku pesanan akan menyebabkan ketakselanjaran dalam jujukan sejarah, yang mempengaruhi ketepatan analisis statistik.

2. Gunakan Depth untuk penilaian masa nyata dan pengesahan pembukaan kedudukan.

// 开仓前用Depth重新验证套利机会
let realtimeSpotPrice = getDepthMidPrice(exchanges[0], pair.spotSymbol, true);
let realtimeDeliveryPrice = getDepthMidPrice(exchanges[1], pair.deliverySymbol, true);

// 基于Depth价格重新计算Z-Score
let realtimeSpread = realtimeDeliveryPrice - realtimeSpotPrice;
let realtimeSpreadRate = realtimeSpread / realtimeSpotPrice;
let realtimeZScore = (realtimeSpreadRate - mu) / (sigma || 1e-6);

// 二次验证:套利机会是否仍然存在
if (Math.abs(realtimeZScore) < CONFIG.zScoreEntry) {
    Log('❌ 套利机会已消失(基于Depth实时价格)');
    return false;
}

3. Kira harga pesanan had menggunakan Depth.

// 基于Depth价格和平均价差计算限价单价格
let spreadDeviation = realtimeSpread - avgSpread;
let adjustmentRatio = Math.min(
    Math.abs(spreadDeviation) * CONFIG.limitOrderSpreadRatio,
    spreadStd * 0.5
);

if (direction === 'positive') {
    spotLimitPrice = realtimeSpotPrice + adjustmentRatio;
    deliveryLimitPrice = realtimeDeliveryPrice - adjustmentRatio;
} else {
    spotLimitPrice = realtimeSpotPrice - adjustmentRatio;
    deliveryLimitPrice = realtimeDeliveryPrice + adjustmentRatio;
}

Harga pesanan had yang dikira dengan cara ini adalah berdasarkan buku pesanan sebenar, yang meningkatkan kebarangkalian pelaksanaan dengan ketara.

4. Kira untung rugi masa nyata menggunakan Depth.

function calculateUnrealizedPnL(record, currentPair) {
    // 优先用Depth价格计算实时盈亏
    let currentSpotPrice = getDepthMidPrice(exchanges[0], currentPair.spotSymbol);
    let currentDeliveryPrice = getDepthMidPrice(exchanges[1], currentPair.deliverySymbol);
    
    // Depth获取失败才回退到Ticker
    if (!currentSpotPrice || !currentDeliveryPrice) {
        currentSpotPrice = currentPair.spotPrice;
        currentDeliveryPrice = currentPair.deliveryPrice;
    }
    
    // 计算盈亏...
}

Perbandingan kesan pertempuran sebenar

Isu-isu semasa menggunakan Ticker:

检测到套利信号(基于Ticker)
→ 计算限价单价格
→ 下单等待
→ 长时间不成交(价格已经不对了)
→ 改用市价单
→ 成交价格和预期差很多
→ 套利失败或微利

Penambahbaikan selepas menggunakan Depth:

检测到套利信号(基于Ticker历史)
→ 用Depth重新验证(机会仍在)
→ 基于Depth计算限价单价格
→ 下单,价格贴近盘口
→ 较快成交
→ 成交价格符合预期
→ 套利成功

Pengoptimuman penetapan harga pesanan had harga

Jika kita akan menggunakan pesanan had, bagaimana kita menetapkan harga? Jika kita menetapkannya terlalu agresif, transaksi tidak akan berjaya; jika kita menetapkannya terlalu konservatif, kita tidak akan mendapat harga yang baik.

Berdasarkan harga kedalaman, pendekatan di sini ialah:Pelarasan secara dinamik berdasarkan sisihan antara spread harga semasa dan spread harga purata.

let spreadDeviation = realtimeSpread - avgSpread;
let adjustmentRatio = Math.min(
  Math.abs(spreadDeviation) * CONFIG.limitOrderSpreadRatio,
  spreadStd * 0.5
);

// 限制调整幅度在合理区间
let minAdjustment = realtimeSpotPrice * 0.0005;
let maxAdjustment = realtimeSpotPrice * 0.005;
adjustmentRatio = Math.max(minAdjustment, Math.min(maxAdjustment, adjustmentRatio));

Jika ia satu set lengkap (dengan perbezaan harga yang besar):

  • Harga belian spot = Titik tengah kedalaman + julat pelarasan
  • Harga jualan niaga hadapan = Titik tengah kedalaman - Julat pelarasan

Ini membolehkan transaksi diselesaikan pada perbezaan harga yang menguntungkan, sambil mengelakkan terlalu jauh dari buku pesanan dan dengan itu tidak mengakibatkan transaksi terlepas.

Mekanisme tempoh sejuk

Sebarang percubaan yang gagal untuk membuka posisi menunjukkan masalah dalam pasaran, yang mungkin disebabkan oleh kecairan yang tidak mencukupi atau turun naik yang berlebihan. Dalam kes sedemikian, anda tidak seharusnya segera mencuba lagi; sebaliknya, anda harus bertenang.

Oleh itu, penalti telah ditambah kepada setiap pasangan dagangan yang gagal.Tempoh penyejukan 10 minit

function addCooldown(deliverySymbol, coin, reason) {
  pairCooldowns[deliverySymbol] = Date.now() + CONFIG.cooldownDuration;
  Log(`⏸️ ${deliverySymbol} 进入10分钟冷却期`);
  Log(`   原因: ${reason}`);
  _G('pairCooldowns', pairCooldowns);
}

Semasa tempoh bertenang, tiada posisi akan dibuka untuk pasangan dagangan ini bagi mengelakkan kegagalan berulang dan yuran transaksi yang sia-sia.

Kekurangan semasa dan bidang yang perlu diperbaiki

Strategi ini masih merupakan satu usaha yang sedang dijalankan, dan terdapat banyak bidang yang boleh dioptimumkan:

1. Isu kelewatan Pada masa ini, harga diperoleh menggunakan kaedah tinjauan pendapat, yang mengakibatkan kependaman yang ketara. Beralih kepada WebSocket untuk kemas kini harga masa nyata akan meningkatkan kelajuan respons dengan ketara.

2. Pengoptimuman kawalan risiko Kaedah stop-loss semasa agak mudah dan ringkas, dan anda boleh mempertimbangkan:

  • Henti rugi dinamik (diselaraskan berdasarkan turun naik)
  • Henti rugi berasaskan masa (pembubaran paksa disebabkan oleh masa pegangan yang berlebihan)
  • Maksimum kawalan penarikan balik

3. Pengurusan Gelinciran Strategi penetapan harga untuk pesanan had boleh dibuat lebih pintar, seperti pelarasan secara dinamik berdasarkan faktor seperti kedalaman buku pesanan dan jumlah transaksi terkini.

4. Aplikasi lanjut bagi data Kedalaman Ia boleh menganalisis ketidakseimbangan buku pesanan, meramalkan trend harga dan meningkatkan kadar kejayaan arbitraj.

ringkaskan

Strategi arbitraj kedengaran menarik, tetapi dalam praktiknya, jelas bahawa terdapat banyak perangkap antara ideal dan realiti.

  • Perangkap ujian kestationaritan
  • Perangkap dalam Statistik Untung Rugi
  • Perangkap kecairan yang tidak mencukupi
  • Perangkap transaksi satu kaki
  • Perangkap Kegagalan Pesanan Pasaran
  • Perangkap dalam jumlah pembelian tempat
  • Perangkap Peluang Arbitraj yang Hilang
  • Lubang kedudukan baki
  • Kecacatan yang paling membawa maut ialah lag dalam mekanisme Ticker.

Khususnya, isu data Ticker yang ketinggalan merupakan masalah dalam keseluruhan proses pembangunan strategi.Paling mudah diabaikan tetapi dengan impak yang paling besarPerangkapnya. Untuk pasaran kontrak penghantaran dengan kecairan yang rendah:

Prinsip teras: Gunakan Ticker untuk mengekalkan kesinambungan sejarah dan gunakan Depth untuk merebut peluang masa nyata.

  • Ticker sesuai untuk analisis data sejarah (ujian ADF, pengiraan Skor-Z).
  • Kedalaman sesuai untuk penilaian masa nyata dan pelaksanaan perdagangan (pengesahan pembukaan kedudukan, penetapan harga pesanan had, pengiraan untung rugi).

Artikel ini merekodkan masalah yang dihadapi dan penyelesaiannya semasa proses penerokaan, dan diharapkan ia dapat memberi rujukan kepada semua orang.Untuk menegaskan semula, artikel ini hanyalah untuk tujuan pendidikan dan perbincangan. Kod ini masih dalam pembangunan dan tidak boleh digunakan secara langsung dalam perdagangan langsung.

Jika anda menggunakan strategi yang serupa, sila bincangkannya dengan saya. Pasaran ini kompleks, dan kerumitan inilah yang menjadikan perdagangan kuantitatif begitu mencabar.

Kod sumber strategi: https://www.fmz.com/strategy/519280