avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

Creado el: 2022-02-16 12:11:36, Actualizado el: 2023-09-15 20:46:46
comments   0
hits   1432

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

Orden de servidor sincrónico

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:

  • 1. Si no quieres seguir órdenes sincrónicamente por el momento, ¿puedes pausarlas? Una vez en pausa, se prohíbe el lanzamiento desde la API de extensión mediante la autenticación con contraseña. Para implementar esta función, agregue dos variables globales:
  var isStopFollow = false   // 用于标记当前是否跟单
  var reStartPwd = null      // 用于记录重启密码

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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 
            }
  • 2. Puede especificar la cantidad del pedido o ampliarla o reducirla. Añadir parámetros a la estrategia:

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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

  • 3. Mantenga el código lo más conciso posible y utilice otras bibliotecas de plantillas para el procesamiento de pedidos.

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.

Código de estrategia:

Anterior订单同步管理系统(Synchronous Server)El código temporal es este:

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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)
    }
}

prueba

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).

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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.

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

La bolsa abrió una orden correspondiente.

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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.

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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

Diseño de un sistema de gestión de sincronización de órdenes basado en cuantificación FMZ (2)

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.