En la carga de los recursos... Cargando...

El ejemplo de diseño de estrategias dYdX - estrategias de transacción al azar

El autor:Los inventores cuantifican - sueños pequeños, Creado: 2021-11-03 15:40:56, Actualizado: 2023-09-15 21:02:48

img

Ejemplo de diseño de la estrategia dYdX

En respuesta a la demanda de muchos usuarios, la plataforma FMZ recientemente ha apoyado la plataforma de intercambio descentralizado dYdX. Los socios con estrategias pueden ser agradables para minar dYdX. Hace mucho tiempo que quería escribir una estrategia de comercio aleatorio, ganar dinero y ganar dinero sin ningún propósito es practicar y enseñar estrategias de diseño.

Primero hay una ola de minería.

En este artículo, la estrategia de la minería es mostrada.

img

¡Los socios que tengan buenas ideas de estrategias de minería son bienvenidos a dejar comentarios!

Diseño de estrategias de trading aleatorias

¡Vamos a pensarlo! Planeamos diseñar una estrategia sin mirar los indicadores, sin mirar los precios, la única opción es hacer más, hacer poco, lo que se bloquea es la probabilidad. Entonces determinamos cuánto espacio hay con números aleatorios de 1 a 100.

Hacer varias condiciones: número aleatorio de 1 a 50. Condición de espacio: número aleatorio de 51 a 100.

Más espacios son 50 números. A continuación, vamos a pensar en cómo equilibrar, ya que es una apuesta, entonces hay que tener un estándar de pérdida y ganancia. Entonces, en el comercio, establecemos un límite fijo, un límite de pérdida como un estándar de pérdida y ganancia.

Las transacciones no son sin costo, hay puntos de deslizamiento, cargos y otros factores suficientes para llevar nuestra probabilidad de ganar en transacciones aleatorias a menos del 50%. Si es una apuesta, entonces no debería ser muy probable que pierda 10 operaciones aleatorias consecutivas de 8 veces. Así que quiero diseñar un número pequeño de unidades en la primera operación, y si pierde, a continuación, aumentar el siguiente número para continuar con la orden aleatoria.

Está bien, la estrategia es tan simple como diseñarla.

El código fuente del diseño:

var openPrice = 0 
var ratio = 1
var totalEq = null 
var nowEq = null 

function cancelAll() {
    while (1) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            break
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(500)
        }
        Sleep(500)
    }
}

function main() {
    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }

    exchange.SetContractType(ct)

    var initPos = _C(exchange.GetPosition)
    if (initPos.length != 0) {
        throw "策略启动时有持仓!"
    }
    
    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    
    if (!IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = _C(exchange.GetAccount).Balance   // equity
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    } else {
        totalEq = _C(exchange.GetAccount).Balance
    }
    
    while (1) {
        if (openPrice == 0) {
            // 更新账户信息,计算收益
            var nowAcc = _C(exchange.GetAccount)
            nowEq = IsVirtual() ? nowAcc.Balance : nowAcc.Balance  // equity
            LogProfit(nowEq - totalEq, nowAcc)
            
            var direction = Math.floor((Math.random()*100)+1)   // 1~50 , 51~100
            var depth = _C(exchange.GetDepth)
            if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                Sleep(1000)
                continue 
            }
            if (direction > 50) {
                // long
                openPrice = depth.Bids[1].Price
                exchange.SetDirection("buy")
                exchange.Buy(Math.abs(openPrice) + slidePrice, amount * ratio)
            } else {
                // short
                openPrice = -depth.Asks[1].Price
                exchange.SetDirection("sell")
                exchange.Sell(Math.abs(openPrice) - slidePrice, amount * ratio)
            }       
            Log("下", direction > 50 ? "买单" : "卖单", ",价格:", Math.abs(openPrice))
            continue
        }

        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            var pos = _C(exchange.GetPosition)
            if (pos.length == 0) {
                openPrice = 0
                continue
            }
            
            // 平仓检测
            while (1) {
                var depth = _C(exchange.GetDepth)
                if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                    Sleep(1000)
                    continue 
                }
                var stopLossPrice = openPrice > 0 ? Math.abs(openPrice) - stopLoss : Math.abs(openPrice) + stopLoss 
                var stopProfitPrice = openPrice > 0 ? Math.abs(openPrice) + stopProfit : Math.abs(openPrice) - stopProfit
                var winOrLoss = 0 // 1 win , -1 loss 
                
                // 画线
                $.PlotLine("bid", depth.Bids[0].Price)
                $.PlotLine("ask", depth.Asks[0].Price)
                
                // 止损
                if (openPrice > 0 && depth.Bids[0].Price < stopLossPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
                    winOrLoss = -1
                } else if (openPrice < 0 && depth.Asks[0].Price > stopLossPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = -1
                }
                
                // 止盈
                if (openPrice > 0 && depth.Bids[0].Price > stopProfitPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)  
                    winOrLoss = 1
                } else if (openPrice < 0 && depth.Asks[0].Price < stopProfitPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = 1
                }
                
                // 检测挂单
                Sleep(2000)
                var orders = _C(exchange.GetOrders)                
                if (orders.length == 0) {
                    pos = _C(exchange.GetPosition)
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }                    
                } else {
                    // 撤销挂单
                    cancelAll()
                    Sleep(2000)
                    pos = _C(exchange.GetPosition)
                    // 撤销后更新持仓,需要再次检查
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }    
                }
                
                var tbl = {
                    "type" : "table", 
                    "title" : "info", 
                    "cols" : ["totalEq", "nowEq", "openPrice", "bid1Price", "ask1Price", "ratio", "pos.length"], 
                    "rows" : [], 
                }
                tbl.rows.push([totalEq, nowEq, Math.abs(openPrice), depth.Bids[0].Price, depth.Asks[0].Price, ratio, pos.length])
                tbl.rows.push(["pos", "type", "amount", "price", "--", "--", "--"])
                for (var j = 0 ; j < pos.length ; j++) {
                    tbl.rows.push([j, pos[j].Type, pos[j].Amount, pos[j].Price, "--", "--", "--"])
                }
                LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
            }
        } else {
            // 撤销挂单
            // 重置openPrice
            cancelAll()
            openPrice = 0
        }
        Sleep(1000)
    }
}

Los parámetros de la estrategia:

img

¡Sí! La estrategia necesita un nombre, por lo que puedes llamarla adivinar el tamaño (dYdX version).

Las pruebas

La revisión es sólo para referencia, >_

img

img

img

img

La prueba está terminada, no hay ningún BUG. Pero siento que estoy a la altura del sistema de prueba... T_T, el disco está funcionando.

En realidad, es una carrera

img

img

img

Esta estrategia es solo para uso educativo, de referencia y de uso personal.No hay~No hay¡No utilices el disco real!


Relacionados

Más.

- ¿ Por qué?Si Dydx es una plataforma de intercambio descentralizada, puede considerarse una estrategia de negociación de la red in situ. También hay una plataforma de intercambio descentralizada, que requiere tiempo para confirmar si las compras y las ventas son exitosas, en lugar de un intercambio centralizado que requiere una confirmación rápida y rápida.

Hyc1743El pequeño blanco, ¿por qué no puede correr?

Los inventores cuantifican - sueños pequeñosDYdX es un disco de verdad, un contrato permanente que tengo abierto.

Los inventores cuantifican - sueños pequeñosEl código fuente de la estrategia es sólo el código de la estrategia, también tiene que configurar los parámetros. Los parámetros tienen una captura de pantalla en el artículo.