Dans l'article précédent, nous avons présenté les avantages de l'effet de levier trans-échange. Cette fois, nous allons explorer en profondeur comment appliquer l'effet Lead-Lag aux transactions à haute fréquence, où les transactions à haute fréquence nécessitent de capturer de minuscules différences de prix dans un temps très court et de réaliser rapidement des profits.
Voici les résultats:Simplifier le code publicLe code de cette stratégie originale est simple, a été très rentable et n'est actuellement pas disponible, à titre de référence seulement.
Le soi-disant "Lead-Lag" peut être compris comme le fait que les prix de certains échanges (ou certains indicateurs) deviennent plus avancés dans les changements globaux du marché (lead), tandis que d'autres échanges ou autres indicateurs deviennent relativement avancés (lag). Dans cette stratégie, les prix de 1, 2 et 3 représentent respectivement les actions des différents échanges, qui sont des échanges dominants, plus sensibles aux informations du marché ou dont les participants diffèrent en profondeur de transaction.
La stratégie consiste à obtenir presque simultanément des données du carnet d'ordres de différents échanges, telles que le prix d'achat, le prix de vente, le volume de l'ordre, etc.; puis à comparer les prix intermédiaires (c'est-à-dire la moyenne des prix d'achat et de vente) des différents échanges pour déduire la dynamique du marché.
La stratégie se concentre principalement sur les variations de prix sur trois échanges externes (okex, binance et huobipro):
Ici, chaque tendance X est déterminée par la différence entre la hausse des prix actuels et la hausse des prix passés au-delà d'un certain seuil. Après avoir ajouté les signaux de hausse/baisse des prix des trois marchés, si la tendance globale est > 0, la stratégie est achetée; si la tendance est < 0, la stratégie est vendue.
La stratégie n'achète ou vend que lorsque la tendance est confirmée et annule les commandes précédentes avant chaque commande (c'est-à-dire pour éviter que les enchères imprévues entraînent une accumulation de risques). En même temps, le script définit des modules tels que l'effet de levier, le fonctionnement de masse, la surveillance du vent et d'autres modules, indiquant que plusieurs comptes et plusieurs paires de devises sont utilisés en temps réel, ce qui élargit la fréquence de négociation des enchères et l'efficacité de l'utilisation des enchères.
En outre, cette stratégie est une stratégie à haute fréquence, qui ne se concentre pas sur les gains et les pertes de chaque commande et ne nécessite pas de stop-loss.
// 超参设置
const SYMBOL = "BTC_USDT"; // 交易对
const PRICE_INCREMENT = 0.1; // 价格增量
const LEVEL = 10; // 趋势判断的灵敏度
const RATIO = 10; // 下单价格调整比例
const INTERVAL = 200; // 时间间隔(毫秒)
const S_AMOUNT = 0.02; // 默认交易量
const MIN_AMOUNT = 0.005; // 最小交易量
// 初始状态
let buyOrders = [];
let sellOrders = [];
let previousPrices = [0, 0, 0]; // 存储之前的价格
let loop = 0;
// 获取订单簿数据
function fetchOrderBooks() {
let orderBooks = [];
let tasks = [];
// 启动所有交易所的异步获取订单簿任务
for (let i = 0; i < exchanges.length; i++) {
// 假设每个交易所对象都可以调用Go方法
let task = exchanges[i].Go("GetDepth");
tasks.push({ index: i, task: task });
}
// 等待所有任务完成并收集结果
for (let i = 0; i < tasks.length; i++) {
let { index, task } = tasks[i];
try {
// 等待异步任务返回结果
let depth = task.wait(1000);
// 检查返回的数据是否有效
if (!depth || !depth.Bids || !depth.Asks) {
throw new Error("返回的订单簿数据无效");
}
// 将有效的订单簿数据添加到结果数组
orderBooks[index] = depth;
} catch (error) {
// 记录错误日志
Log(`获取交易所${index}订单簿失败: ${error.message}`);
// 添加默认的订单簿数据以避免崩溃
orderBooks[index] = {
Bids: [[0, 0]],
Asks: [[0, 0]]
};
}
}
return orderBooks;
}
// 判断趋势
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); // 上升趋势
} else if (midPrice < previousPrices[i] - LEVEL * PRICE_INCREMENT) {
trends.push(-1); // 下降趋势
} else {
trends.push(0); // 无显著趋势
}
previousPrices[i] = midPrice; // 更新价格记录
}
return trends.reduce((a, b) => a + b, 0); // 返回总体趋势
}
// 取消所有挂单
function cancelOrders(orders) {
for (let orderId of orders) {
try {
exchanges[0].CancelOrder(orderId); // 默认使用主交易所
Log(`取消订单: ${orderId}`);
} catch (error) {
Log(`取消订单失败: ${error.message}`);
}
}
}
// 创建买单
function createBuyOrder(price, amount) {
try {
const orderId = exchanges[0].Buy(price, amount);
buyOrders.push(orderId);
Log(`创建买单: 价格 ${price}, 数量 ${amount}`);
} catch (error) {
Log(`创建买单失败: ${error.message}`);
}
}
// 创建卖单
function createSellOrder(price, amount) {
try {
const orderId = exchanges[0].Sell(price, amount);
sellOrders.push(orderId);
Log(`创建卖单: 价格 ${price}, 数量 ${amount}`);
} catch (error) {
Log(`创建卖单失败: ${error.message}`);
}
}
function main() {
while (true) {
try {
// 获取订单簿数据
const orderBooks = fetchOrderBooks();
// 计算趋势
const trend = calculateTrend(orderBooks);
Log(`当前趋势: ${trend}`);
// 取消挂单
cancelOrders(buyOrders);
cancelOrders(sellOrders);
buyOrders = [];
sellOrders = [];
// 根据趋势下单
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++;
Sleep(INTERVAL);
} catch (error) {
Log(`主逻辑错误: ${error.message}`);
}
}
}
Le marché devient efficace
Lorsque de plus en plus de stratégies de quantification ou de haute fréquence sont impliquées et que la même relation Lead-Lag est découverte, un grand nombre de fonds effacent rapidement ce décalage. Les marchés deviennent de plus en plus incohérents et il est difficile pour les stratégies de tirer profit de petits écarts sans avoir recours à des spéculations de risque ou à des spéculations à court terme.
Modification des restrictions ou des frais d'échange
Avec l'évolution de la structure des frais de transaction entre les différents échanges, la rentabilité des stratégies de négociation à haute fréquence est considérablement réduite une fois que les coûts de transaction dépassent les bénéfices de l'opération. Ou les échanges accélèrent la vitesse de prise de vue, limitent la fréquence, réduisent les retards, et échouent à des stratégies qui reposent sur des retards inconsistants.
Le déclin de la liquidité et le point de glissement
Lorsque le marché est peu négocié, les stratégies à haute fréquence rencontrent souvent des points d'écart plus graves; ou les grosses commandes poussent rapidement les prix, ce qui entraîne une baisse des ventes anticipées et une baisse des bénéfices.
Les fluctuations du marché changent
Certaines stratégies sont particulièrement utiles dans des conditions de forte volatilité ou de cycles particuliers de volatilité, où les stratégies perdent leur environnement propice et peuvent même faire de fréquents pertes lorsque le marché est calme ou où la volatilité diminue.
Le point clé de cette stratégie de trading à haute fréquence est la capture des prix de plusieurs échanges et la synthèse de la tendance à la hausse. Elle s'appuie sur le principe du Lead-Lag pour réaliser des transactions à très haute fréquence et à entrée rapide: observer le prix d'un échange avant de le suivre, puis faire en sorte que les prix des autres échanges suivent pour capturer les écarts instantanés ou les tendances à court terme. Cependant, comme l'a déclaré l'auteur, cette stratégie qui repose sur l'environnement du marché, l'homogénéisation des stratégies, les frais de traitement et les changements de fréquence devient progressivement moins efficace et même perd de sa profitabilité.