Dalam artikel pertama, kami memperkenalkan bagaimana menggunakan fenomena Lead-Lag untuk arbitraj secara ringkas. Dalam artikel ini, kami terutamanya akan memperkenalkan arbitraj pertukaran silang
Pertama, perantara perlu memantau perbezaan harga antara pertukaran yang berbeza dalam masa nyata, terutamanya harga tanya dan harga tawaran. Dengan mengesan harga tanya pertukaran A dan harga tawaran pertukaran B, jika harga tanya pertukaran A lebih rendah daripada harga tawaran pertukaran B, ia boleh dianggap bahawa terdapat peluang arbitrase. Sebagai contoh, harga tanya pertukaran A adalah 10,000 USDT, dan harga tawaran pertukaran B adalah 10,100 USDT, perbezaan harga adalah 100 USDT, maka terdapat peluang arbitrase yang berpotensi. Sudah tentu, julat perbezaan harga sejarah baru-baru ini juga harus diambil kira sebagai rujukan untuk perbezaan harga pembukaan dan penutupan, dan masa menunggu juga merupakan salah satu kos.
Apabila peluang arbitrase dijumpai, arbitrager harus membeli aset di bursa dengan harga permintaan yang lebih rendah (seperti Bursa A) dan menjualnya di bursa dengan harga tawaran yang lebih tinggi (seperti Bursa B). Operasi ini boleh diotomatiskan melalui API untuk memastikan pelaksanaan yang cepat dan memaksimumkan perbezaan harga. Walau bagaimanapun, ketika melaksanakan perdagangan, kos transaksi (seperti yuran dan seluncur) serta kejutan harga mesti dipertimbangkan. Asumsikan yuran Bursa A adalah 0.1%, sementara yuran Bursa B adalah 0.2%, dan terdapat seluncur di pasaran. Sebagai contoh, apabila membeli 1 Bitcoin di Bursa A, harga transaksi sebenar mungkin meningkat kerana pelaksanaan pesanan besar, dengan mengandaikan seluncur adalah 0.1%. Kemudian, harga transaksi sebenar akan lebih tinggi 0.1% daripada yang dijangkakan, mengakibatkan peningkatan kos pembelian.
Jika lipatan dan bayaran diambil kira, kos pembelian sebenar dan pendapatan jualan akan berbeza daripada jangkaan.
Langkah terakhir arbitraj adalah untuk menutup kedudukan. Sebagai contoh, selepas tempoh masa, harga beli bursa A adalah 10,100 USDT, dan harga jual bursa B adalah 10,150 USDT. Apabila perbezaan harga menyempitkan dari 100 USDT kepada 50 USDT, program akan menutup kedudukan secara automatik dan mengambil keuntungan. Sudah tentu, dalam beberapa kes, perbezaan harga mungkin terus meluas, dan anda boleh terus membuka kedudukan sehingga dana habis. Sebab mengapa perbezaan harga bursa tidak dapat dikekalkan adalah bahawa arbitrager menyumbang sebahagian besar kuasa.
Oleh kerana terdapat sebilangan besar perantara dan pembuat pasaran, perbezaan harga antara bursa yang berbeza tidak akan sangat besar, jika tidak, mereka akan diselaraskan dengan cepat.
Penyelesaian: - Tunggu perbezaan harga terbentuk secara semula jadi:Pasaran cryptocurrency sangat tidak menentu, dan perbezaan harga jangka pendek biasanya berlaku. Menunggu dengan sabar adalah cara terbaik untuk menyelesaikan masalah ini.- Gunakan strategi pembuat:membeli dan menjual pesanan pada buku pesanan pertukaran secara aktif, dan membatalkan pesanan dan menyesuaikan mereka apabila harga berubah. Jika satu pihak menyelesaikan transaksi, pihak lain akan mengambil pesanan. Ini akan mengakibatkan yuran transaksi yang lebih rendah, spread yang lebih kecil, dan memastikan transaksi segera.- Memantau lebih banyak pasangan dagangan:Jangan hanya memberi tumpuan kepada mata wang arus perdana, kerana peluang arbitrage mereka biasanya telah ditangkap oleh sebilangan besar arbitrager, menyebabkan perbezaan harga menyempit. Mata wang yang tidak popular dan mata wang yang baru disenaraikan mungkin mempunyai perbezaan harga yang lebih besar kerana kecairan yang lemah dan kurang persaingan, dan adalah peluang arbitrage yang patut diperhatikan.- Pilih pertukaran kecil:Bursa kecil biasanya mempunyai kecairan yang lemah dan penyesuaian harga yang perlahan, yang memudahkan perbezaan harga yang besar berlaku.- Pilih pertukaran ambang tinggi:Beberapa bursa memerlukan pensijilan KYC yang ketat, seperti bursa Korea Upbit. Tempat-tempat ini sukar bagi peniaga biasa untuk memasuki, dan terdapat lebih banyak peluang arbitrase. Sudah tentu, anda perlu mencari cara untuk mengatasi kesukaran.
Kegagalan untuk mengambil pesanan adalah masalah biasa. Apabila program mencari perbezaan harga dan meletakkan pesanan untuk arbitrase, perbezaan harga sebenar tidak begitu besar, dan biasanya terdapat kerugian. Pada masa ini, tindak balas dan kelajuan pelaksanaan yang paling cepat adalah penting.
Penyelesaian: - Mengoptimumkan rangkaian dan lokasi pelayan:Pilih nod yang berdekatan dengan pelayan pertukaran untuk mengurangkan latensi. Sebagai contoh, memilih pertukaran kecil dengan kecairan yang rendah untuk beroperasi dapat mengurangkan kelajuan tindak balas pasaran dan merebut peluang.- Pemprosesan asynchronous dan WebSocket:Menggunakan kod asynchronous dan WebSocket untuk menyambung ke keadaan pasaran boleh menerima maklumat harga dalam masa nyata dan bertindak balas dengan cepat untuk mengelakkan peluang yang hilang kerana kelewatan maklumat.
Transaksi satu arah adalah apabila satu pihak pesanan diselesaikan tetapi pihak lain gagal menyelesaikan transaksi, yang biasanya berlaku di pasaran yang berfluktuasi dengan cepat.
Penyelesaian: - Menetapkan mekanisme stop-loss yang munasabah:Apabila transaksi satu arah berlaku, anda boleh menetapkan stop loss. Penutupan kedudukan tepat pada masanya adalah cara yang berkesan untuk mengurangkan risiko.- Gunakan harga pasaran untuk meletakkan pesanan:Harga pasaran boleh menjamin urus niaga, tetapi masalahnya adalah bahawa perbezaan dalam harga urus niaga tidak terkawal dan boleh mengakibatkan kerugian.
Apabila perbezaan harga wujud untuk masa yang lama, dana pertukaran tertentu akan dibeli dengan cepat, dan perantara mungkin tidak dapat meneruskan operasi perantara.
Penyelesaian: - Operasi pemindahan mata wang:Menggunakan pemindahan mata wang silang pertukaran untuk memindahkan dana dan meneruskan arbitrage.- Menunggu perbezaan harga untuk berbalik:Memandangkan kos masa penarikan balik, menunggu perbezaan harga untuk kembali juga merupakan pilihan.
Kod ini bukan kod dagangan langsung dan hanya untuk tujuan demonstrasi. Ia tidak mengambil kira isu-isu, seperti bilangan pasaran, kegagalan akses API, kelajuan pesanan asynchronous, dll.
// Symbol is the arbitrage trading pair, such as BTC/USDT
let symbol = "BTC_USDT";
// Set commissions, slippage, profit margins for opening and closing positions
let fee = 0.1 / 100; // 0.1% Fee
let slippage = 0.1 / 100; // 0.1% slippage
let entryThreshold = 0.005; // Opening threshold: Opening a position when the price difference is greater than 0.5%
let exitThreshold = 0.001; // Closing threshold: Closing when the price difference returns to 0.1%
// The specific operations performed in each loop
function OnTick() {
// Get ticker data from various exchanges
let tickers = exchanges.map(exchange => exchange.GetTicker(symbol));
// Calculate arbitrage opportunities (based on profit margins)
// profitAB: Buy from exchange 0, sell from exchange 1
const profitAB = (tickers[1].bid - tickers[0].ask) / tickers[0].ask - fee * 2 - slippage * 2;
// profitBA: Buy from exchange 1, sell from exchange 0
const profitBA = (tickers[0].bid - tickers[1].ask) / tickers[1].ask - fee * 2 - slippage * 2;
// Print log
Log(`Tickers: Exchange0 Buy: ${tickers[0].ask}, Exchange1 Sell: ${tickers[1].bid}, Profit AB: ${profitAB} USDT`);
Log(`Tickers: Exchange1 Buy: ${tickers[1].ask}, Exchange0 Sell: ${tickers[0].bid}, Profit BA: ${profitBA} USDT`);
// Determine whether to perform arbitrage operations based on profits
if (profitAB > entryThreshold) { // Open a position when the profit is greater than the opening threshold
Log(`Arbitrage opportunity: Buy BTC from exchange 0, sell from exchange 1, profit: ${profitAB} USDT`);
executeArbitrage(0, 1, tickers[0].ask, tickers[1].bid, profitAB); // Buy from exchange 0 and sell from exchange 1
} else if (profitBA > entryThreshold) {
Log(`Arbitrage opportunity: Buy BTC from exchange 1, sell from exchange 0, profit: ${profitBA} USDT`);
executeArbitrage(1, 0, tickers[1].ask, tickers[0].bid, profitBA); // Buy from exchange 1 and sell from exchange 0
} else if (profitAB < exitThreshold) { // If the spread reverts, close the position
Log(`Close position: Arbitrage opportunity bought from exchange 0 and sold on exchange 1, profit has returned to the close threshold`);
closeArbitrage(0, 1, tickers[0].ask, tickers[1].bid); // Execute the closing operation
} else if (profitBA < exitThreshold) {
Log(`Close position: Arbitrage opportunity bought from exchange 1 and sold on exchange 0, profit has returned to the closing threshold`);
closeArbitrage(1, 0, tickers[1].ask, tickers[0].bid); // Execute the closing operation
} else {
Log("Not enough profit to take profit or close the position");
}
}
// Executing arbitrage trades
function executeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// Get account balance (assuming BTC balance)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
// Assume that the transaction volume is 0.1 BTC per transaction
let amount = Math.min(amountBTC, 0.1);
// Ensure sufficient trading volume
if (amount <= 0) {
Log("Insufficient balance to conduct arbitrage");
return;
}
// Place a buy order on the buying exchange
Log(`Place an order to buy ${amount} BTC @ ${buyPrice} on exchange ${buyExchangeIndex}`);
buyExchange.Buy(symbol, buyPrice * (1 + slippage), amount);
// Place a sell order on the selling exchange
Log(`Place an order to sell ${amount} BTC @ ${sellPrice} on exchange ${sellExchangeIndex}`);
sellExchange.Sell(symbol, sellPrice * (1 - slippage), amount);
}
// Closing position operation
function closeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// Get account balance (assuming BTC balance)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
let amount = Math.min(amountBTC, 0.1);
// Place a sell order on the buying exchange
Log(`Close and sell ${amount} BTC @ ${buyPrice} on exchange ${buyExchangeIndex}`);
buyExchange.Sell(symbol, buyPrice * (1 - slippage), amount);
// Place a buy order on the selling exchange
Log(`Close buy ${amount} BTC @ ${sellPrice} on exchange ${sellExchangeIndex}`);
sellExchange.Buy(symbol, sellPrice * (1 + slippage), amount);
}
// Main loop
function main() {
while (true) {
OnTick();
Sleep(1000); // Execute once every second
}
}
Arbitraj bergerak batu bata adalah strategi arbitraj silang pertukaran berdasarkan tindak balas lag pasaran. Dengan menganalisis perbezaan harga di pasaran dengan tepat dan melaksanakan transaksi dengan cepat, arbitraj boleh memperoleh keuntungan yang stabil di pasaran mata wang kripto. Walau bagaimanapun, kejayaan strategi tidak hanya bergantung pada reka bentuk strategi itu sendiri, tetapi juga pada pelaksanaan yang baik dan pemahaman sensitif mengenai masa pasaran.