Diseño de un sistema de gestión sincronizada de pedidos basado en la FMZ

El autor:Un sueño pequeño., Creado: 2022-02-16 12:11:36, Actualizado: 2023-09-15 20:46:46

img

Diseño de un sistema de gestión sincronizada de pedidos basado en la FMZ

Sistema de gestión de pedidos sincronizados (Synchronous Server)

Continuamos con el artículo anterior:Diseño de un sistema de gestión sincronizada de pedidos basado en la FMZEn la actualidad, la mayoría de los usuarios de Twitter están en la misma situación.

Consideremos algunos problemas de diseño:

  • 1, si no desea sincronizar la lista, puede suspenderse. Una vez suspendido, se prohíbe iniciar desde la API de extensión y usar la verificación de contraseñas. Para implementar esta función, se añaden dos variables globales:

    var isStopFollow = false   // 用于标记当前是否跟单
    var reStartPwd = null      // 用于记录重启密码
    

    img

    Luego, en la página de edición de la política, se agrega un control interactivo para detener/reiniciar la política (no detener este disco, solo detener lógicamente, no seguir la lista, no hacer nada).订单同步管理系统类库(Single Server)El disco duro tampoco puede despertar su política. Al reiniciar la lista de seguimiento, ingrese el mensaje predeterminado para despertar la función de seguimiento. El código de implementación de las funciones correspondientes:

    ...
              // 判断交互指令
              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 de unidades de la lista o puede escalar por múltiples Añadir parámetros a la política:

    img

    specifiedAmount: especifica el número de listas de seguimiento, por defecto -1, es decir, no se especifica. zoomAmountRatio: la escalación de la cantidad inferior de una señal enviada, por ejemplo:ETH_USDT,swap,buy,1, multiplicando el valor de la menor cantidad de unidades por zoomAmountRatio.

        var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
        amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
    

    Aquí se realiza la cantidad de ordenes que se requieren para la secuencia de comandos de la señal recibida.La escalación¿Qué es esto?Especifique un valor específico

  • 3. El código debe ser lo más simple posible, y el procesamiento de la siguiente orden debe utilizar otras librerías de clases de plantillas.

    Las clases de uso de la base de datos de compra en efectivo:https://www.fmz.com/strategy/10989Los futuros que se utilizan en el catálogo: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
      }
    

    Así que, como ves, la siguiente lista sólo requiere una frase:$.Sell(amount)$.Buy(amount)$.OpenLong(exchange, action.ct, amount)Y luego...

El código de la estrategia:

Anteriormente订单同步管理系统(Synchronous Server)El código provisional es el siguiente:

img

Y ahora, el rediseño.订单同步管理系统(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)
    }
}

Las pruebas

Esta vez, la cuenta de banda usó la prueba de disco Binance, y la cuenta de banda usó la prueba de disco OKEX.订单同步管理系统类库(Single Server)En la plantillamainLa función) ⋅

img

Sin embargo, cambiamos la dirección de la transacción a cero, y el volumen de la transacción a 0.003 ((Binan USDT Los contratos locales pueden ser ordenados con números decimales)). Pero la cuenta de OKEX tiene que ser un número entero (la cuenta de OKEX tiene que ser un número entero), así que el parámetro Especifico el parámetro de la estrategia.specifiedAmountEs el 1⁄4.

img

订单同步管理系统类库(Single Server)El disco de prueba de la función activa la transacción.

img

La estrategia de seguimiento de disco real recibe una señal y ejecuta la acción de seguimiento:

img

El intercambio emitió la orden correspondiente.

img

A continuación, se prueba el equilibrio, cambiando la dirección de la orden inferior en la función principal de prueba para aplanar el emplazamiento en blanco 0.003.

img

Y luego se vuelve a ejecutar este disco que es responsable de la cinta.订单同步管理系统类库(Single Server))。

img

La misma operación se activa con el disco duro:

img

La dirección de la estrategia:Sistema de gestión de órdenes sincronizado (Single Server) Sistema de gestión de pedidos sincronizados (Synchronous Server)

El diseño de la estrategia es sólo para el intercambio de aprendizaje, la producción real requiere su propia modificación, ajuste y optimización.


Relacionados

Más.