Pada artikel pertama, kami memperkenalkan bagaimana menggunakan fenomena Lead-Lag untuk arbitrage secara singkat. Dalam artikel ini, kami terutama akan memperkenalkan arbitrage
Pertama, arbitrager perlu memantau perbedaan harga antara bursa yang berbeda secara real time, terutama harga tanya dan harga penawaran. Dengan melacak harga tanya bursa A dan harga tawaran bursa B, jika harga tanya bursa A lebih rendah dari harga tawaran bursa B, dapat dianggap bahwa ada peluang arbitrage. Misalnya, harga tanya bursa A adalah 10.000 USDT, dan harga tawaran bursa B adalah 10.100 USDT, perbedaan harga adalah 100 USDT, maka ada peluang arbitrage potensial. Tentu saja, kisaran perbedaan harga historis baru-baru ini juga harus diperhitungkan sebagai referensi untuk perbedaan harga pembukaan dan penutupan, dan waktu tunggu juga merupakan salah satu biaya.
Setelah kesempatan arbitrase ditemukan, arbitrer harus membeli aset di bursa dengan harga permintaan yang lebih rendah (seperti Exchange A) dan menjualnya di bursa dengan harga penawaran yang lebih tinggi (seperti Exchange B). Operasi ini dapat otomatis melalui API untuk memastikan eksekusi cepat dan memaksimalkan perbedaan harga. Namun, saat melakukan perdagangan, biaya transaksi (seperti biaya dan slippage) serta kejutan harga harus dipertimbangkan. Asumsikan bahwa biaya Exchange A adalah 0,1%, sedangkan biaya Exchange B adalah 0,2%, dan ada slippage di pasar. Misalnya, ketika membeli 1 Bitcoin di Exchange A, harga transaksi sebenarnya dapat meningkat karena eksekusi pesanan besar, dengan asumsi slippage adalah 0,1%. Kemudian, harga transaksi sebenarnya akan 0,1% lebih tinggi dari yang diharapkan, yang mengakibatkan peningkatan biaya pembelian.
Jika slippage dan biaya diperhitungkan, biaya pembelian dan pendapatan penjualan yang sebenarnya akan berbeda dari harapan.
Langkah terakhir dari arbitrage adalah untuk menutup posisi. Misalnya, setelah periode waktu, harga beli bursa A adalah 10,100 USDT, dan harga jual bursa B adalah 10,150 USDT. Ketika perbedaan harga menyempit dari 100 USDT menjadi 50 USDT, program akan menutup posisi secara otomatis dan mengambil keuntungan. Tentu saja, dalam beberapa kasus, perbedaan harga dapat terus meluas, dan Anda dapat terus membuka posisi sampai dana habis. Alasan mengapa perbedaan harga bursa tidak dapat dipertahankan adalah bahwa arbitrageurs memberikan sebagian besar kekuatan.
Karena keberadaan sejumlah besar arbitrageur dan market maker, perbedaan harga antara bursa yang berbeda tidak akan sangat besar, jika tidak mereka akan segera diselaraskan.
Solusi: - Tunggu perbedaan harga terbentuk secara alami:Pasar cryptocurrency sangat volatile, dan perbedaan harga jangka pendek biasanya terjadi. Menunggu dengan sabar adalah cara terbaik untuk memecahkan masalah ini.- Gunakan strategi pembuat:membeli dan menjual pesanan di buku pesanan pertukaran secara aktif, dan membatalkan pesanan dan menyesuaikan mereka seiring perubahan harga. Jika satu pihak menyelesaikan transaksi, pihak lain akan mengambil pesanan. Ini akan menghasilkan biaya transaksi yang lebih rendah, spread yang lebih kecil, dan memastikan transaksi segera.- Awasi lebih banyak pasangan perdagangan:Jangan hanya fokus pada mata uang arus utama, karena peluang arbitrage mereka biasanya telah ditangkap oleh sejumlah besar arbitrager, menyebabkan perbedaan harga menyempit. Mata uang yang tidak populer dan mata uang yang baru terdaftar mungkin memiliki perbedaan harga yang lebih besar karena likuiditas yang buruk dan kurang persaingan, dan merupakan peluang arbitrage yang patut diperhatikan.- Pilih pertukaran kecil:Bursa kecil biasanya memiliki likuiditas yang buruk dan penyesuaian harga yang lambat, yang memudahkan perbedaan harga yang besar terjadi.- Pilih bursa ambang tinggi:Beberapa bursa memerlukan sertifikasi KYC yang ketat, seperti bursa Korea Upbit. Tempat-tempat ini sulit bagi pedagang biasa untuk masuk, dan ada lebih banyak peluang arbitrase. Tentu saja, Anda perlu menemukan cara untuk mengatasi kesulitan.
Kegagalan untuk mengambil pesanan adalah masalah umum. Ketika program menemukan perbedaan harga dan menempatkan pesanan untuk arbitrase, perbedaan harga sebenarnya tidak begitu besar, dan biasanya ada kerugian. Pada saat ini, respons tercepat dan kecepatan eksekusi sangat penting.
Solusi: - Optimalkan jaringan dan lokasi server:Pilih node yang dekat dengan server bursa untuk mengurangi latensi. Misalnya, memilih bursa kecil dengan likuiditas rendah untuk beroperasi dapat mengurangi kecepatan reaksi pasar dan memanfaatkan kesempatan.- Pemrosesan asinkron dan WebSocket:Menggunakan kode asinkron dan WebSocket untuk terhubung ke kondisi pasar dapat menerima informasi harga secara real time dan merespons dengan cepat untuk menghindari kesempatan yang hilang karena keterlambatan informasi.
Transaksi satu arah adalah ketika satu sisi pesanan diselesaikan tetapi sisi lain gagal menyelesaikan transaksi, yang biasanya terjadi di pasar yang berfluktuasi dengan cepat.
Solusi: - Menetapkan mekanisme stop-loss yang masuk akal:Ketika terjadi transaksi satu arah, Anda dapat mengatur stop loss. Penutupan posisi tepat waktu adalah cara yang efektif untuk mengurangi risiko.- Gunakan harga pasar untuk menempatkan pesanan:Harga pasar dapat menjamin transaksi, tetapi masalahnya adalah bahwa perbedaan harga transaksi tidak terkendali dan dapat mengakibatkan kerugian.
Ketika perbedaan harga ada untuk waktu yang lama, dana dari bursa tertentu akan dibeli dengan cepat, dan arbitrase mungkin tidak dapat melanjutkan operasi arbitrase.
Solusi: - Operasi transfer mata uang:Menggunakan transfer mata uang silang untuk mentransfer dana dan melanjutkan arbitrase.- Menunggu perbedaan harga untuk berbalik:Mengingat biaya waktu penarikan, menunggu perbedaan harga untuk kembali juga merupakan pilihan.
Kode ini bukan kode perdagangan langsung dan hanya untuk tujuan demonstrasi. Tidak memperhitungkan masalah, seperti jumlah pasar, kegagalan akses API, akselerasi pesanan asinkron, 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
}
}
Lead-Lag brick-moving arbitrage adalah strategi arbitrage lintas bursa berdasarkan reaksi lag pasar. Dengan menganalisis perbedaan harga di pasar dengan akurat dan mengeksekusi transaksi dengan cepat, arbitrager dapat memperoleh keuntungan yang stabil di pasar cryptocurrency. Namun, keberhasilan strategi tidak hanya tergantung pada desain strategi itu sendiri, tetapi juga pada eksekusi yang baik dan pemahaman sensitif tentang waktu pasar.