Múltiples bolsas comparten estrategias lógicas para los precios de los tipos de cambio

El autor:¿Qué quieres decir?, Creado: 2022-06-27 21:26:27, Actualizado: 2023-09-18 19:44:32

img

Principios estratégicos

Debido a la liquidez, cuando el mercado tiene grandes fluctuaciones de precios, se forman diferencias de precios instantáneas entre los intercambios. La estrategia es capturar estos momentos para ejecutar transacciones rápidas y completar las compras bajas. Algunos clientes me preguntan por qué tengo tantos intercambios, esto es inevitable, nuestro problema es la diferencia de precios instantánea entre los intercambios, y cuanto más intercambios, más oportunidades de diferencia de precios se forman después del cruce.

La lógica central de la estrategia
  1. Para acceder simultáneamente a la información de transacción de varios intercambios, es necesario acceder simultáneamente, lo que reduce el retraso de transacción obtenido, y acceder simultáneamente a los complementos de herramientas que comparto.Plugins para intercambio simultáneo
  2. Se combina el pedido y el pedido de todos los intercambios para obtener una información de compra combinada, donde el RealPrice es el precio después de deducir las tarifas de tramitación.
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. Se calcula la diferencia de interés más alta a partir de la información de la transacción combinada. Como estamos comprando desde el precio más bajo, compramos desde el precio más bajo y vendemos desde el precio más alto, vendemos desde el precio más bajo. RealPrice > ask.
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. En este punto, hemos obtenido información sobre la diferencia de tipos de interés disponible en el mercado, así como sobre cómo optar por ejecutar o no la transacción, así como sobre la cantidad de transacciones que se realizan, aquí hay algunos puntos para juzgar:
  • Residuos actuales
  • El tamaño de la diferencia de precios (la diferencia de precios es demasiado pequeña para equilibrar el número de monedas, el precio es lo suficientemente grande para maximizar el número de transacciones)
  • Número de pedidos de facturación
    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. Se calcula el número de pedidos para ejecutar transacciones, la estrategia es realizar pedidos simultáneos de forma directa con el punto de deslizamiento.
            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 las ganancias, manejar órdenes fallidas y otras cosas.
Las ganancias reales de esta estrategia

img img img

El disco real actual muestra que la lógica central no cambia y se optimiza para apoyar la multi-moneda.

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

Por último, bienvenido a unirse al intercambio cuantitativo de Autumn:https://t.me/laoqiu_arbitrage


Relacionados

Más.

Las novias también.¿Qué es lo que hace que las tiendas pequeñas corran por la calle?

- ¿ Qué pasa?Y ahora.

H303059288 (incluido el nombre de la empresa)En la actualidad, el nombre de la banda es Akiko Weiwa.