В первой статье, вероятно, рассказывается о том, как проводится сдвиг между биржами. Основной принцип сдвига заключается в том, что сдвиг между биржами осуществляется путем использования ценового задержки между различными биржами ("эффекта Lead-Lag"), поскольку рыночная ликвидность, скорость транзакций и задержка сети различаются в различных биржах, что приводит к тому, что цены одной и той же монеты часто варьируются на разных биржах. Сдвижники могут быстро сдвигаться, наблюдая за этим задержным изменением цен, и получать рискованную прибыль.
Во-первых, фаворитам необходимо в режиме реального времени контролировать ценовые различия между различными биржами, особенно цены продажи и покупки. Следя за ценой продажи и покупки на бирже А и на бирже В, можно считать, что существует возможность фаворитизма, если цена продажи на бирже А ниже цены покупки на бирже В. Например, цена продажи на бирже А составляет 10 000 USDT, цена покупки на бирже В - 10 100 USDT, при этом цена отличается от 100 USDT, что является потенциальной возможностью фаворитизма.
После обнаружения оптовой возможности, оптовый покупатель должен купить актив на бирже с более низкой ценой продажи (например, на бирже А) и продать на бирже с более высокой ценой покупки (например, на бирже Б). Эта операция может быть выполнена с помощью автоматизации API, чтобы обеспечить быстрое выполнение и максимальное использование разницы в цене. Однако при выполнении сделки необходимо учитывать затраты на транзакции (например, сборы и сдвиги) и ценовые шоки. Предположим, что сборы на бирже А составляют 0,1%, а сборы на бирже Б - 0,2%, при этом существует рынок.
Если учесть сдвиги и расходы на обслуживание, то фактические затраты на покупку и доходы от продажи будут отличаться от ожиданий.
Последний шаг в сделке заключается в ликвидации. Например, через некоторое время, когда цена покупки на бирже А составляет 10,100 USDT, а цена продажи на бирже В - 10,150 USDT, когда разница цены сокращается с 100 USDT до 50 USDT, процедура автоматически завершается. Конечно, в некоторых случаях разница может продолжать расширяться, можно продолжить торговлю, зная, что деньги исчерпаны.
Из-за наличия большого количества дилеров и рыночных трейдеров разница в ценах на различных биржах не очень большая, иначе она быстро сглаживается.
Неудачные заказы являются распространенной проблемой, когда процедура обнаруживает, что разница в дифференцированном заказе не так велика, и в результате фактическая сделка часто приносит убытки.
Одноногие сделки означают, что одна сторона завершила операцию, а другая не смогла, что обычно происходит при быстрых рыночных колебаниях.
При длительном существовании дифференциации средства на бирже быстро полностью выкупаются, и дифференциатор может не иметь возможности продолжить дифференциацию. В этом случае дифференциатору необходимо быстро перевести средства или скорректировать позиции.
Код не является кодом реального диска и используется только для демонстрации, если не учитывать количество дисков, ошибки при неудачном доступе к API, асинхронное ускорение заказа и т. д.
// symbol 是套利的交易对,比如 BTC/USDT
let symbol = "BTC_USDT";
// 设置手续费、滑点、开仓和平仓的利润率
let fee = 0.1 / 100; // 0.1% 手续费
let slippage = 0.1 / 100; // 0.1% 滑点
let entryThreshold = 0.005; // 开仓阈值:价差大于0.5%时开仓
let exitThreshold = 0.001; // 平仓阈值:价差回归到0.1%时平仓
// 每次循环执行的具体操作
function OnTick() {
// 获取各个交易所的行情数据
let tickers = exchanges.map(exchange => exchange.GetTicker(symbol));
// 计算套利机会(基于利润率)
// profitAB: 从交易所0买入,从交易所1卖出
const profitAB = (tickers[1].bid - tickers[0].ask) / tickers[0].ask - fee * 2 - slippage * 2;
// profitBA: 从交易所1买入,从交易所0卖出
const profitBA = (tickers[0].bid - tickers[1].ask) / tickers[1].ask - fee * 2 - slippage * 2;
// 打印日志
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`);
// 根据利润判断是否执行套利操作
if (profitAB > entryThreshold) { // 当利润大于开仓阈值时开仓
Log(`套利机会:从交易所0买入BTC,从交易所1卖出,利润:${profitAB} USDT`);
executeArbitrage(0, 1, tickers[0].ask, tickers[1].bid, profitAB); // 从交易所0买入并在交易所1卖出
} else if (profitBA > entryThreshold) {
Log(`套利机会:从交易所1买入BTC,从交易所0卖出,利润:${profitBA} USDT`);
executeArbitrage(1, 0, tickers[1].ask, tickers[0].bid, profitBA); // 从交易所1买入并在交易所0卖出
} else if (profitAB < exitThreshold) { // 如果价差回归,平仓
Log(`平仓:从交易所0买入并在交易所1卖出的套利机会,利润已回归至平仓阈值`);
closeArbitrage(0, 1, tickers[0].ask, tickers[1].bid); // 执行平仓操作
} else if (profitBA < exitThreshold) {
Log(`平仓:从交易所1买入并在交易所0卖出的套利机会,利润已回归至平仓阈值`);
closeArbitrage(1, 0, tickers[1].ask, tickers[0].bid); // 执行平仓操作
} else {
Log("没有足够的利润进行套利或平仓");
}
}
// 执行套利交易
function executeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// 获取账户余额(假设为BTC余额)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
// 假设每次交易量为 0.1 BTC
let amount = Math.min(amountBTC, 0.1);
// 确保交易量充足
if (amount <= 0) {
Log("余额不足,无法进行套利");
return;
}
// 在买入交易所挂单买入
Log(`在交易所${buyExchangeIndex} 下单买入 ${amount} BTC @ ${buyPrice}`);
buyExchange.Buy(symbol, buyPrice * (1 + slippage), amount);
// 在卖出交易所挂单卖出
Log(`在交易所${sellExchangeIndex} 下单卖出 ${amount} BTC @ ${sellPrice}`);
sellExchange.Sell(symbol, sellPrice * (1 - slippage), amount);
}
// 平仓操作
function closeArbitrage(buyExchangeIndex, sellExchangeIndex, buyPrice, sellPrice) {
let buyExchange = exchanges[buyExchangeIndex];
let sellExchange = exchanges[sellExchangeIndex];
// 获取账户余额(假设为BTC余额)
let accountBuy = buyExchange.GetAccount();
let accountSell = sellExchange.GetAccount();
let amountBTC = Math.min(accountBuy.Balance / buyPrice, accountSell.Amount);
let amount = Math.min(amountBTC, 0.1);
// 在买入交易所挂单卖出
Log(`在交易所${buyExchangeIndex} 平仓卖出 ${amount} BTC @ ${buyPrice}`);
buyExchange.Sell(symbol, buyPrice * (1 - slippage), amount);
// 在卖出交易所挂单买入
Log(`在交易所${sellExchangeIndex} 平仓买入 ${amount} BTC @ ${sellPrice}`);
sellExchange.Buy(symbol, sellPrice * (1 + slippage), amount);
}
// 主循环
function main() {
while (true) {
OnTick();
Sleep(1000); // 每秒钟执行一次
}
}
Lead-Lag Moving Swap - это стратегия сдерживания сделок на протяжении многих бирж, основанная на реакции рынка на задержку. Благодаря точному анализу ценовых различий на рынке и быстрому выполнению сделок, сдерживатели могут получать устойчивую прибыль на рынке цифровых валют. Однако успех этой стратегии зависит не только от самой разработки стратегии, но и от хорошей исполнительности и чувствительности к времени рынка.