
Continuemos con el artículo anterior:Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (1)Después de discutirlo con los expertos, comenzamos a diseñar una estrategia para el copy trading sincrónico.
Considere estos problemas de diseño:
var isStopFollow = false // 用于标记当前是否跟单
var reStartPwd = null // 用于记录重启密码

Luego, agregue controles interactivos en la página de edición de estrategia para pausar/reiniciar la estrategia (no detiene el trading real, sino que solo pausa la lógica, deja de seguir órdenes y no hace nada). Al hacer una pausa, puede establecer una contraseña de pausa para que, incluso si tiene su CLAVE API extendida,订单同步管理系统类库(Single Server)Ni siquiera una sesión de trading real puede despertar tu estrategia. Al reiniciar el copy trading, ingrese la contraseña preestablecida para activar la función de copy trading.
Código de implementación de funciones relacionadas:
...
// 判断交互指令
if (arr.length == 2) {
// 带控件的按钮
if (arr[0] == "stop/restart") {
// 暂停/重启跟单
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("已经重启跟单,", "清空重启密码。", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("重启密码错误!")
}
}
continue
}

specifiedAmount: especifica el importe del pedido posterior. El valor predeterminado es -1, lo que significa que no se especifica.
zoomAmountRatio: zoom según el monto del pedido en la señal enviada, por ejemplo, la señal enviada es:ETH_USDT,swap,buy,1, multiplique la cantidad del pedido por zoomAmountRatio. El valor predeterminado es -1, lo que significa que no hay escala.
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
Aquí implementamos la cantidad de pedido que se debe seguir en la señal recibida.ZoomoEspecificar valores específicos。
Pedidos puntuales mediante la biblioteca de clases: https://www.fmz.com/strategy/10989 Biblioteca de órdenes de futuros: https://www.fmz.com/strategy/203258
function trade(action) {
// 切换交易对,设置合约
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
}
Como puede ver, para realizar un pedido solo se necesita una frase:$.Sell(amount) 、$.Buy(amount) 、 $.OpenLong(exchange, action.ct, amount) .. esperar.
Anterior订单同步管理系统(Synchronous Server)El código temporal es este:

Empiece a rediseñar ahora订单同步管理系统(Synchronous Server):
// 全局变量
var isStopFollow = false
var reStartPwd = null
function trade(action) {
// 切换交易对,设置合约
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 = {}
// 解析cmd ,例如: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() {
// 清除所有日志
LogReset(1)
if (isSimulateOKEX) {
exchange.IO("simulate", true)
Log("切换到OKEX模拟盘!")
}
// 设置精度
exchange.SetPrecision(pricePrecision, amountPrecision)
// 检查缩放、指定不能同时设置
if (specifiedAmount != -1 && zoomAmountRatio != -1) {
throw "不能同时指定同步量和缩放量"
}
while (true) {
var cmd = GetCommand()
if (cmd) {
Log("cmd: ", cmd)
var arr = cmd.split(":")
// 判断交互指令
if (arr.length == 2) {
// 带控件的按钮
if (arr[0] == "stop/restart") {
// 暂停/重启跟单
if (!isStopFollow) {
isStopFollow = true
reStartPwd = arr[1]
Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
} else if (isStopFollow && arr[1] == reStartPwd) {
isStopFollow = false
reStartPwd = null
Log("已经重启跟单,", "清空重启密码。", "#FF0000")
} else if (isStopFollow && arr[1] != reStartPwd) {
Log("重启密码错误!")
}
}
continue
}
// 允许跟单
if (!isStopFollow) {
// 解析跟单信号交互指令
var objAction = parseCmd(cmd)
if (objAction) {
// 解析正确
var ret = trade(objAction)
} else {
Log("错误的信号指令 cmd:", cmd)
}
}
}
// 显示跟单情况
LogStatus(_D(), isStopFollow ? "停止同步" : "保持同步", "\n")
Sleep(1000)
}
}
Esta vez, la cuenta con órdenes utilizará la cuenta real de Binance para realizar pruebas, y la cuenta real para copiar órdenes utilizará la cuenta de OKEX. Todavía utilizamos la función de prueba utilizada en el artículo anterior (订单同步管理系统类库(Single Server)En la plantillamainfunción).

Acabamos de cambiar la dirección de la transacción a venta en corto y el volumen de la transacción a 0,003 (los contratos basados en Binance USDT pueden colocar órdenes en decimales). Sin embargo, la cuenta OKEX debe ser un número entero (las órdenes de intercambio de OKEX deben realizarse en números enteros), por lo que especifico los parámetros de la estrategia.specifiedAmountes 1.

订单同步管理系统类库(Single Server)La función de prueba desencadena una transacción real.

La estrategia en tiempo real de copiar órdenes recibe la señal y ejecuta la acción de copia:

La bolsa abrió una orden correspondiente.

A continuación, probemos el cierre de la posición y cambiemos la dirección de la orden en la función principal de prueba para cerrar la posición corta de 0,003 contratos.

A continuación, ejecute nuevamente el disco real encargado de tomar los pedidos (订单同步管理系统类库(Single Server))。

La misma operación también se activa copiando el pedido real:

Dirección de la política: Biblioteca de clases del sistema de gestión de sincronización de pedidos (servidor único) Orden de servidor sincrónico
El diseño de la estrategia es solo para comunicación y aprendizaje. Por favor, modifíquelo, ajústelo y optimícelo según las necesidades reales de producción.