Dalam artikel sebelumnya, kami memperkenalkan cross-exchange
Berikut adalah:penyederhanaan kode publikdan dikonversi ke FMZ API. Prinsip kode dari strategi asli ini sangat sederhana dan pernah sangat menguntungkan.
Yang disebut
Strategi ini memperoleh data buku pesanan dari bursa yang berbeda hampir secara sinkron, seperti harga penawaran, harga permintaan, volume pesanan yang menunggu, dll. Kemudian harga tengah (yaitu rata-rata harga penawaran dan harga permintaan) dari bursa yang berbeda dibandingkan untuk menyimpulkan dinamika pasar.
Strategi ini terutama berfokus pada perubahan harga dari tiga bursa eksternal (okex, binance, huobipro):
Di sini, setiap tren X ditentukan oleh perbedaan antara
Strategi ini hanya membeli atau menjual setelah tren dikonfirmasi, dan membatalkan order sebelumnya sebelum menempatkan setiap order (yaitu, menghindari pesanan yang menunggu secara tidak sengaja yang menyebabkan akumulasi risiko). Pada saat yang sama, skrip juga mengatur modul seperti leverage, operasi batch, dan pemantauan kontrol risiko, yang berarti bahwa beberapa akun dan beberapa pasangan mata uang digunakan secara bersamaan dalam perdagangan langsung, sehingga memperluas strategi
Selain itu, strategi ini adalah strategi frekuensi tinggi. Anda tidak perlu memperhatikan keuntungan atau kerugian dari setiap order, juga Anda tidak perlu menghentikan kerugian. Anda dapat melanjutkan selama ada probabilitas menghasilkan keuntungan.
// Hyperparameter settings
const SYMBOL = "BTC_USDT"; // Trading pair
const PRICE_INCREMENT = 0.1; // Price increment
const LEVEL = 10; // Sensitivity of trend judgment
const RATIO = 10; // Order price adjustment ratio
const INTERVAL = 200; // Time interval (milliseconds)
const S_AMOUNT = 0.02; // Default transaction volume
const MIN_AMOUNT = 0.005; // Minimum transaction volume
// Initial state
let buyOrders = [];
let sellOrders = [];
let previousPrices = [0, 0, 0]; // Store the previous price
let loop = 0;
// Get order book data
function fetchOrderBooks() {
let orderBooks = [];
let tasks = [];
// Start asynchronous order book acquisition tasks for all exchanges
for (let i = 0; i < exchanges.length; i++) {
// Assume that each exchange object can call the Go method
let task = exchanges[i].Go("GetDepth");
tasks.push({ index: i, task: task });
}
// Wait for all tasks to complete and collect results
for (let i = 0; i < tasks.length; i++) {
let { index, task } = tasks[i];
try {
// Waiting for an asynchronous task to return a result
let depth = task.wait(1000);
// Check if the returned data is valid
if (!depth || !depth.Bids || !depth.Asks) {
throw new Error("The returned order book data is invalid");
}
// Add valid order book data to the result array
orderBooks[index] = depth;
} catch (error) {
// Recording error logs
Log(`Failed to obtain the order book of exchange ${index}: ${error.message}`);
// Added default order book data to avoid crashes
orderBooks[index] = {
Bids: [[0, 0]],
Asks: [[0, 0]]
};
}
}
return orderBooks;
}
// Judge the trends
function calculateTrend(orderBooks) {
let trends = [];
for (let i = 0; i < orderBooks.length; i++) {
const midPrice = (orderBooks[i].Bids[0][0] + orderBooks[i].Asks[0][0]) / 2;
if (midPrice > previousPrices[i] + LEVEL * PRICE_INCREMENT) {
trends.push(1); // Upward trend
} else if (midPrice < previousPrices[i] - LEVEL * PRICE_INCREMENT) {
trends.push(-1); // Downward trend
} else {
trends.push(0); // No significant trend
}
previousPrices[i] = midPrice; // Update price record
}
return trends.reduce((a, b) => a + b, 0); // Return to overall trend
}
// Cancel all pending orders
function cancelOrders(orders) {
for (let orderId of orders) {
try {
exchanges[0].CancelOrder(orderId); // Use the main exchange by default
Log(`Cancel order: ${orderId}`);
} catch (error) {
Log(`Failed to cancel order: ${error.message}`);
}
}
}
// Create a buy order
function createBuyOrder(price, amount) {
try {
const orderId = exchanges[0].Buy(price, amount);
buyOrders.push(orderId);
Log(`Create a buy order: price ${price}, quantity ${amount}`);
} catch (error) {
Log(`Failed to create buy order: ${error.message}`);
}
}
// Create a sell order
function createSellOrder(price, amount) {
try {
const orderId = exchanges[0].Sell(price, amount);
sellOrders.push(orderId);
Log(`Create a sell order: price ${price}, quantity ${amount}`);
} catch (error) {
Log(`Failed to create sell order: ${error.message}`);
}
}
function main() {
while (true) {
try {
// Get order book data
const orderBooks = fetchOrderBooks();
// Calculate trends
const trend = calculateTrend(orderBooks);
Log(`Current trend: ${trend}`);
// Cancel pending order
cancelOrders(buyOrders);
cancelOrders(sellOrders);
buyOrders = [];
sellOrders = [];
// Order based on trends
if (trend > 0 && loop > 0) {
const price = _N(orderBooks[0].Bids[0][0] + RATIO * PRICE_INCREMENT, 2);
const amount = _N(Math.max(S_AMOUNT, MIN_AMOUNT), 4);
createBuyOrder(price, amount);
} else if (trend < 0 && loop > 0) {
const price = _N(orderBooks[0].Asks[0][0] - RATIO * PRICE_INCREMENT, 2);
const amount = _N(Math.max(S_AMOUNT, MIN_AMOUNT), 4);
createSellOrder(price, amount);
}
// Loop count and interval
loop++;
Sleep(INTERVAL);
} catch (error) {
Log(`Main logic error: ${error.message}`);
}
}
}
Pasar menjadi efisien
Ketika semakin banyak strategi kuantitatif atau frekuensi tinggi yang terlibat dan menemukan hubungan Lead-Lag yang sama, sejumlah besar dana akan menghilangkan perbedaan harga dengan cepat.
Pembatasan nilai tukar atau perubahan biaya
Karena struktur biaya dari berbagai bursa berubah, begitu biaya biaya melebihi keuntungan arbitrase, profitabilitas strategi perdagangan frekuensi tinggi akan sangat berkurang. Atau jika bursa mempercepat kecepatan pencocokan, membatasi frekuensi dan kuantitas, dan mengurangi keterlambatan, itu juga akan membatalkan strategi yang awalnya bergantung pada keterlambatan yang tidak konsisten.
Kebocoran likuiditas dan slippage
Ketika volume pasar tidak cukup, strategi frekuensi tinggi sering mengalami kemiringan yang lebih parah; atau pesanan besar akan mendorong harga naik dengan cepat, menyebabkan
Perubahan volatilitas pasar
Beberapa strategi bekerja dengan sangat baik di bawah
Titik kunci dari strategi perdagangan frekuensi tinggi terletak pada penangkapan harga dari beberapa bursa dan penilaian