7
Seguir
350
Seguidores

Compartiendo la lógica de la estrategia de arbitraje de diferencia de precios spot en múltiples bolsas

Creado el: 2022-06-27 21:26:27, Actualizado el: 2024-12-02 21:35:44
comments   4
hits   9495

Compartiendo la lógica de la estrategia de arbitraje de diferencia de precios spot en múltiples bolsas

Principio de estrategia

Por razones de liquidez, cuando hay una gran cantidad de ventas o de retiradas en el mercado, inevitablemente habrá grandes fluctuaciones de precios y habrá una diferencia de precio momentánea entre las bolsas. La estrategia es capturar estos momentos y ejecutar transacciones rápidas para completar el proceso de comprar barato y vender caro. Algunos clientes me preguntaron por qué tengo tantos intercambios. Esto es inevitable. Lo que nos permite ganar dinero es la diferencia de precio instantánea entre los intercambios. Cuantos más intercambios haya, más oportunidades de diferencia de precio habrá después del cruce.

Lógica central de la estrategia
  1. Obtenga información de mercado de varias bolsas de forma simultánea. Es necesario obtenerla de forma simultánea para reducir el retraso en la obtención de la información de mercado. Para la adquisición simultánea, puede consultar el complemento de la herramienta que compartí.Plugin de intercambio simultáneo múltiple
  2. Combine la demanda y la oferta de todos los intercambios para obtener una información de cotización combinada, donde RealPrice es el precio después de deducir la tarifa de manejo.
function createOrders(depths, askOrders, bidOrders) {
    let asksIndex = 0;
    let bidIndex = 0;
    for (let i = 0; i < depths.length; i++) {
        let exchangeTariff = getExchangeTariff(i);
        let asks = depths[i].Asks;
        let bids = depths[i].Bids;
        for (let j = 0; j < Math.min(asks.length, bids.length, 20); j++) {
            if (asks[j].Amount >= minTakerAmount) {
                askOrders[asksIndex] = {
                    "Price": asks[j].Price,
                    "Amount": asks[j].Amount,
                    "Fee": asks[j].Price * exchangeTariff,
                    "RealPrice": asks[j].Price * (1 + exchangeTariff),
                    "Index": i,
                };
                asksIndex++;
            }
            if (bids[j].Amount >= minTakerAmount) {
                bidOrders[bidIndex] = {
                    "Price": bids[j].Price,
                    "Amount": bids[j].Amount,
                    "Fee": bids[j].Price * exchangeTariff,
                    "RealPrice": bids[j].Price * (1 - exchangeTariff),
                    "Index": i,
                };
                bidIndex++;
            }
        }
    }
    askOrders.sort(function (a, b) {
        return a.RealPrice - b.RealPrice;
    });
    bidOrders.sort(function (a, b) {
        return b.RealPrice - a.RealPrice;
    });
}
  1. Calcule el spread de arbitraje más rentable a partir de la información combinada del mercado. Dado que estamos tomando órdenes, es decir, comprando desde el precio de venta más bajo y vendiendo desde el precio de oferta más alto, siempre que bid.RealPrice > ask.RealPrice, hay espacio para ganancias.
function getArbitrageOrders(askOrders, bidOrders) {
    let ret = [];
    for (let i = 0; i < askOrders.length; i++) {
        for (let j = 0; j < bidOrders.length; j++) {
            let bidOrder = bidOrders[j];
            let askOrder = askOrders[i];
            if (bidOrder.Index === askOrder.Index) {
                continue
            }
            let minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
            if (bidOrder.RealPrice - askOrder.RealPrice > minMigrateDiffPrice) {
                ret.push({
                    "Ask": askOrder,
                    "Bid": bidOrder,
                })
            }
        }
    }
    if (ret.length === 0) {
        ret.push({
            "Ask": askOrders[0],
            "Bid": bidOrders[0],
        });
    }
    //按最优价差排序
    ret.sort((a, b) => {
        return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
    });
    return ret;
}
  1. Ahora que hemos obtenido la información sobre el margen de arbitraje en el mercado, ¿cómo decidimos si ejecutamos la transacción y cuánto negociar? A continuación, se indican algunos puntos clave que se deben tener en cuenta:
  • Activos restantes corrientes
  • El tamaño del spread (si el spread es demasiado pequeño, solo equilibrará la cantidad de moneda, y si el spread es lo suficientemente grande, maximizará el número de transacciones)
  • Número de pedidos pendientes
    var askOrder = arbitrageOrder.Ask;
    var bidOrder = arbitrageOrder.Bid;
    var perAmountFee = arbitrageOrder.Ask.Fee + arbitrageOrder.Bid.Fee;
    var minRealDiffPrice = (askOrder.Price + bidOrder.Price) / 2 * minDiffPricePercent / 100;
    var minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
    var curRealDiffPrice = arbitrageOrder.Bid.RealPrice - arbitrageOrder.Ask.RealPrice;
    var buyExchange = exchanges[arbitrageOrder.Ask.Index];
    var sellExchange = exchanges[arbitrageOrder.Bid.Index];
    var buySellAmount = 0;
    if (curRealDiffPrice > minRealDiffPrice) {
        buySellAmount = math.min(
            bidOrder.Amount,
            askOrder.Amount,
            maxTakerAmount,
            runningInfo.Accounts[bidOrder.Index].CurStocks,
            runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
        );
    } else if (bidOrder.Index !== askOrder.Index) {
        if (migrateCoinEx == -1) {
            if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks - runningInfo.Accounts[askOrder.Index].CurStocks > maxAmountDeviation) {
                buySellAmount = math.min(
                    bidOrder.Amount,
                    askOrder.Amount,
                    maxTakerAmount,
                    runningInfo.Accounts[bidOrder.Index].CurStocks,
                    runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price,
                    runningInfo.Accounts[bidOrder.Index].CurStocks - ((runningInfo.Accounts[bidOrder.Index].CurStocks + runningInfo.Accounts[askOrder.Index].CurStocks) / 2)
                );
                if (buySellAmount >= minTakerAmount) {
                    Log("启动交易所平衡!");
                }
            }
        } else if (migrateCoinEx == askOrder.Index) {
            if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks > 0) {
                buySellAmount = math.min(
                    bidOrder.Amount,
                    askOrder.Amount,
                    maxTakerAmount,
                    runningInfo.Accounts[bidOrder.Index].CurStocks,
                    runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
                );
                if (buySellAmount >= minTakerAmount) {
                    Log("启动货币迁移:", exchanges[bidOrder.Index].GetName(), "-->", exchanges[askOrder.Index].GetName());
                }
            }
        }
    }
  1. Una vez calculada la cantidad del pedido, se puede ejecutar la transacción. La estrategia utiliza el método de agregar directamente el deslizamiento para tomar pedidos y colocarlos al mismo tiempo.
            var buyWait = buyExchange.Go("Buy", _N(askOrder.Price * (1.01), pricePrecision), buySellAmount);
            var sellWait = sellExchange.Go("Sell", _N(bidOrder.Price * (0.99), pricePrecision), buySellAmount);
            var startWaitTime = new Date().getTime()
            Sleep(3000);
            var buyOrder = buyWait.wait()
            var sellOrder = sellWait.wait()
  1. Lo que queda es la lógica de calcular ganancias, manejar stop loss para órdenes fallidas, etc.
Los beneficios reales de esta estrategia

Compartiendo la lógica de la estrategia de arbitraje de diferencia de precios spot en múltiples bolsas Compartiendo la lógica de la estrategia de arbitraje de diferencia de precios spot en múltiples bolsas Compartiendo la lógica de la estrategia de arbitraje de diferencia de precios spot en múltiples bolsas

Visualización actual en tiempo real, la lógica central permanece sin cambios, optimizada para admitir múltiples monedas

https://www.fmz.com/robot/464965

Por último, le damos la bienvenida a Laoqiu Quantitative Exchange: https://t.me/laoqiu_arbitrage