En la carga de los recursos... Cargando...

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

El autor:FMZ~Lydia, Creado: 2022-11-08 11:34:20, Actualizado: 2023-09-15 20:48:46

img

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

Sistema de gestión de sincronización de pedidos (servidor sincrónico)

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:

    1. Si no desea realizar el seguimiento de órdenes sincrónicas temporalmente, ¿es posible pausarlo? Una vez suspendido, está prohibido comenzar desde la API extendida, debe autenticarse con la contraseña. Implementar esta función añadiendo 2 variables globales:
var isStopFollow = false   // Used to mark whether the current order is being followed
var reStartPwd = null      // Used to record the restart password

img

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 
          }
    1. Se puede especificar la cantidad de órdenes a seguir o se puede escalar en múltiples Añadir parámetros a la estrategia:

img

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.

    1. El código debe ser lo más simple posible, utilizar otras bibliotecas de plantillas para realizar un pedido.

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.

Código de estrategia:

El código temporal de lasOrder Synchronous Management System (Synchronous Server)fue el siguiente:

img

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

Prueba

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.mainfunción en la función de ensayo(Order Synchronization Management System Class Library (Single Server)en la plantilla) utilizada en el artículo anterior.

img

Aquí cambiamos la dirección de la transacción a sell, y el volumen de la transacción a 0.003 (Las órdenes se pueden colocar en números decimales para los contratos estándar Binance USDT). Pero el seguimiento de órdenes para la cuenta OKEX debe ser un número entero (las órdenes de intercambio OKEX deben ser un número entero), por lo que especificamos el parámetro de estrategia specifiedAmount como 1.

img

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.

img

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.


Relacionados

Más.