Dalam artikel sebelumnya, kita memperkenalkan pertukaran silang
Berikut adalah:penyederhanaan kod awamdan ditukar kepada FMZ API. Prinsip kod strategi asal ini sangat mudah dan pernah sangat menguntungkan. Ia kini tidak tersedia dan hanya untuk rujukan.
Yang dipanggil
Strategi ini memperoleh data buku pesanan dari bursa yang berbeza hampir serentak, seperti harga tawaran, harga permintaan, jumlah pesanan yang menunggu, dll. Kemudian harga pertengahan (iaitu purata harga tawaran dan harga permintaan) dari bursa yang berbeza dibandingkan untuk menyimpulkan dinamik pasaran.
Strategi ini terutamanya memberi tumpuan kepada perubahan harga tiga bursa luar (okex, binance, huobipro):
Di sini, setiap trendX ditentukan oleh perbezaan antara
Strategi ini hanya membeli atau menjual selepas trend disahkan, dan membatalkan pesanan sebelumnya sebelum meletakkan setiap pesanan (iaitu, mengelakkan pesanan menunggu yang tidak disengajakan yang membawa kepada pengumpulan risiko). Pada masa yang sama, skrip juga menetapkan modul seperti leverage, operasi batch, dan pemantauan kawalan risiko, yang bermaksud bahawa beberapa akaun dan beberapa pasangan mata wang digunakan secara serentak dalam perdagangan langsung, dengan itu memperluaskan strategi
Selain itu, strategi ini adalah strategi frekuensi tinggi. anda tidak perlu memberi perhatian kepada keuntungan atau kerugian setiap pesanan, juga anda tidak perlu menghentikan kerugian. anda boleh terus selagi ada kebarangkalian membuat 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}`);
}
}
}
Pasaran menjadi cekap
Apabila lebih banyak strategi kuantitatif atau frekuensi tinggi terlibat dan mencari hubungan Lead-Lag yang sama, sejumlah besar dana akan menghilangkan perbezaan harga dengan cepat.
Sekatan pertukaran atau perubahan yuran
Apabila struktur yuran pertukaran yang berbeza berubah, apabila kos yuran melebihi keuntungan arbitrase, keuntungan strategi perdagangan frekuensi tinggi akan berkurangan.
Kebocoran dan kebocoran kecairan
Apabila jumlah pasaran tidak mencukupi, strategi frekuensi tinggi sering mengalami kemerosotan yang lebih teruk; atau pesanan besar akan mendorong harga dengan cepat, menyebabkan
Perubahan dalam turun naik pasaran
Sesetengah strategi berfungsi dengan baik di bawah
Titik utama strategi perdagangan frekuensi tinggi terletak pada penangkapan harga dari pelbagai bursa dan penghakiman