Continuemos con la discusión del artículo anterior: Diseño de un sistema de gestión de sincronización de pedidos basado en la cuantificación FMZ (1) (https://www.fmz.com/digest-topic/9729) y comenzar a diseñar una estrategia para el seguimiento sincronizado de los pedidos.
Piensen en algunos de estos problemas de diseño:
var isStopFollow = false // Used to mark whether the current order is being followed
var reStartPwd = null // Used to record the restart password
Luego añadimos controles interactivos en la página de edición de la estrategia para la pausa de la estrategia / reinicio (no para detener el bot real, sólo la pausa lógica, no más orden de seguimiento).Order Synchronization Management System Class Library (Single Server)
Cuando reinicie la función de seguimiento de orden, introduzca la contraseña preestablecida para despertar la función de seguimiento de orden.
Código para la ejecución de las funciones pertinentes:
...
// Judge the interaction command
if (arr.length == 2) {
// Buttons with controls
if (arr[0] == "stop/restart") {
// Pause/restart order-following
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("it has stopped the order-following,", "Set the restart password as:", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("it has restarted the order-following, ", "Clear the restart password.", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("Restart password error!")
}
}
continue
}
specifiedAmount: especificar el número de órdenes seguidas, el valor predeterminado es -1, es decir, no especificado. zoomAmountRatio: Escalado de acuerdo con el monto de las órdenes enviadas, por ejemplo, si la señal enviada es: ETH_USDT,swap,buy,1, multiplica el valor del monto de las órdenes por zoomAmountRatio.
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
Aquí se implementa para escalar o especificar un valor específico para la cantidad de órdenes a seguir en la señal recibida.
La biblioteca de clases utilizada por los pedidos al contado colocados:https://www.fmz.com/strategy/10989La biblioteca de clases utilizada por los pedidos futuros colocados:https://www.fmz.com/strategy/203258
function trade(action) {
// Switch trading pairs and set up contracts
exchange.SetCurrency(action.symbol)
if (action.ct != "spot") {
exchange.SetContractType(action.ct)
}
var retTrade = null
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
if (action.direction == "buy") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
} else if (action.direction == "sell") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
} else if (action.direction == "closebuy") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
} else if (action.direction == "closesell") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
}
return retTrade
}
Así que podemos ver que para hacer un pedido sólo se necesita una frase:$.Sell(amount)
, $.Buy(amount)
, $.OpenLong(exchange, action.ct, amount)
. etc.
El código temporal de lasOrder Synchronous Management System (Synchronous Server)
fue el siguiente:
Ahora comenzamos a rediseñar el Sistema de Gestión de Sincronización de Pedidos (Servidor Sincrónico):
// Global variables
var isStopFollow = false
var reStartPwd = null
function trade(action) {
// Switch trading pairs and set up contracts
exchange.SetCurrency(action.symbol)
if (action.ct != "spot") {
exchange.SetContractType(action.ct)
}
var retTrade = null
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
if (action.direction == "buy") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
} else if (action.direction == "sell") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
} else if (action.direction == "closebuy") {
retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
} else if (action.direction == "closesell") {
retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
}
return retTrade
}
function parseCmd(cmd) {
var objAction = {}
// Parse cmd, such as: ETH_USDT,swap,buy,1
var arr = cmd.split(",")
if (arr.length != 4) {
return null
}
objAction.symbol = arr[0]
objAction.ct = arr[1]
objAction.direction = arr[2]
objAction.amount = arr[3]
return objAction
}
function main() {
// Clear all logs
LogReset(1)
if (isSimulateOKEX) {
exchange.IO("simulate", true)
Log("Switch to OKEX demo!")
}
// Set accuracy
exchange.SetPrecision(pricePrecision, amountPrecision)
// Check zoom and specify it cannot be set at the same time
if (specifiedAmount != -1 && zoomAmountRatio != -1) {
throw "it cannot specify simultaneous volume and scaling volume at the same time"
}
while (true) {
var cmd = GetCommand()
if (cmd) {
Log("cmd: ", cmd)
var arr = cmd.split(":")
// Judge interaction commands
if (arr.length == 2) {
// Buttons with controls
if (arr[0] == "stop/restart") {
// Pause/restart order-following
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("it has stopped the order-following.", "Set the restart password as.", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("it has restarted the order-following", "Clear the restart password.", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("Restart password error!")
}
}
continue
}
// Permission to follow orders
if (!isStopFollow) {
// Resolve the interaction instructions of order-following signal
var objAction = parseCmd(cmd)
if (objAction) {
// The analysis is correct
var ret = trade(objAction)
} else {
Log("Wrong signal command cmd:", cmd)
}
}
}
// Display order-following status
LogStatus(_D(), isStopFollow ? "Stop Synchronization" : "Keep Synchronization", "\n")
Sleep(1000)
}
}
Probamos la cuenta líder de pedidos usando el bot real de Binance para este tiempo, y usamos la cuenta OKEX para el bot real de seguimiento de pedidos.main
función en la función de ensayo(Order Synchronization Management System Class Library (Single Server)
en la plantilla) utilizada en el artículo anterior.
Aquí cambiamos la dirección de la transacción a
A continuación, probemos el cierre de la posición cambiando la dirección del orden en la función principal de prueba para cerrar la posición corta en 0,003.
Luego lo ejecutamos de nuevo, que es responsable de la orden de liderazgo (Order Synchronization Management System Class Library (Single Server)).
La misma operación fue desencadenada por un robot real que seguía órdenes.
La dirección de la estrategia: Biblioteca de clases del sistema de gestión de sincronización de pedidos (servidor único) (https://www.fmz.com/strategy/345171) y Sistema de gestión de sincronización de pedidos (servidor sincrónico) (https://www.fmz.com/strategy/345172)
La estrategia está diseñada sólo para la comunicación y el aprendizaje, por favor ajuste y optimice según las necesidades reales.