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.
En este artículo, la estrategia de la minería es mostrada.
¡Los socios que tengan buenas ideas de estrategias de minería son bienvenidos a dejar comentarios!
¡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:
¡Sí! La estrategia necesita un nombre, por lo que puedes llamarla adivinar el tamaño (dYdX version).
La revisión es sólo para referencia, >_
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.
Esta estrategia es solo para uso educativo, de referencia y de uso personal.No hay~No hay¡No utilices el disco real!
- ¿ 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.