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

El autor:No lo sé., Creado: 2022-04-06 17:12:00, Actualizado: 2022-04-06 17:20:08

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

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

Continuemos la discusión en el artículo anterior:Diseño de un sistema de gestión sincrónica basado en órdenes FMZ (1), para diseñar una estrategia de supervisión de órdenes sincrónica. Por favor, considere las siguientes preguntas de diseño:

  • 1.Si no desea supervisar sincrónicamente los pedidos durante un tiempo, ¿puede detenerse?Una vez que se detenga, desactive el reinicio desde la API extendida y use la verificación de contraseña. Para implementar esta función, añadir 2 variables globales:
    var isStopFollow = false   // used to mark whether to currently supervise orders or not 
    var reStartPwd = null      // used to record the restart password 
    

img

A continuación, añadir controles interactivos en la página de edición de la estrategia para detener / reiniciar la estrategia (no es para detener el bot, sólo para detener la lógica, para no seguir y supervisar las órdenes, sin hacer nada).Order Synchronous Management System Library (Single Server)Cuando se reinicie para supervisar órdenes, introduzca la contraseña preestablecida para invocar la función de supervisión de órdenes. Código de ejecución de la función relacionada:

...
          // Judge the interactive command
          if (arr.length == 2) {
          	// Buttons with controls
          	if (arr[0] == "stop/restart") {
          		// Stop/restart to supervise orders 
          		if (!isStopFollow) {
          		    isStopFollow = true
          		    reStartPwd = arr[1]
          		    Log("stopped to supervise orders,", "the set restart password is:", reStartPwd, "#FF0000")
          		} else if (isStopFollow && arr[1] == reStartPwd) {
          			isStopFollow = false 
          			reStartPwd = null 
          			Log("restarted to supervise orders,", "clear the restart password.", "#FF0000")
          		} else if (isStopFollow && arr[1] != reStartPwd) {
          			Log("Wrong restart password!")
          		}
          	}
          	continue 
          }
  • 2.El importe de la orden supervisada puede especificarse o ampliarse en función de la relación:

    img

    EspecifiedAmount: especificar el importe de la orden supervisada; el valor por defecto es -1, es decir, no especificado. zoomAmountRatio: zoom de acuerdo con la cantidad ordenada en la señal enviada.ETH_USDT,swap,buy,1, luego multiplicar el valor de la cantidad de pedido por zoomAmountRatio; por defecto es -1, es decir, no se ha acercado.

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

    En este sentido, hemos comprendido queel zoomel importe del pedido, oespecifique un cierto valor, según la señal recibida.

  • 3.Escribe códigos lo más sencillos posible y utiliza otras bibliotecas de plantillas para gestionar los pedidos.

    Biblioteca de plantillas utilizada para la colocación de órdenes al contado:https://www.fmz.com/strategy/10989Biblioteca de plantillas utilizada para la colocación de órdenes de futuros:https://www.fmz.com/strategy/203258

      function trade(action) {
          // Switch the trading pair, and set contract 
          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
      }
    

    Por lo tanto, se puede ver que para realizar un pedido sólo se necesita una declaración:$.Sell(amount), $.Buy(amount), $.OpenLong(exchange, action.ct, amount), etc.

Código de estrategia:

El código temporal en el anteriorOrder Synchronous Management System (Synchronous Server)es la siguiente:

img

Ahora, vamos a diseñar elOrder Synchronous Management System (Synchronous Server)Una vez más:

// Global variables
var isStopFollow = false
var reStartPwd = null 

function trade(action) {
    // Switch the trading pair, and set contract
    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 simulated bot!")
    }

    // set precision 
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // Check specifiedAmount and zoomAmountRatio, for they cannot be set at the same time 
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "cannot set specifiedAmount and zoomAmountRatio at the same time"
    }

    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd: ", cmd)
            var arr = cmd.split(":")

            // Judge the interactive command 
            if (arr.length == 2) {
            	// Buttons with controls 
            	if (arr[0] == "stop/restart") {
            		// Stop/restart to supervise orders 
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("stopped to supervise orders,", "the set restart password is:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("restarted to supervise orders,", "Clear the restart password", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("Wrong restart password!")
            		}
            	}
            	continue 
            }
            
            // Allow to supervise orders 
            if (!isStopFollow) {
                // Parse the interactive command of the order supervising signal
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // Parse correctly 
            	    var ret = trade(objAction)
                } else {
                	Log("Wrong signal cmd:", cmd)
                }
            }
        }
        
        // Display the order supervising status 
        LogStatus(_D(), isStopFollow ? "Stop synchronization" : "Maintain synchronization", "\n")

        Sleep(1000)
    }
}

Prueba

Esta vez, la prueba de tick real de Binance se utiliza para la cuenta con órdenes, y la cuenta OKEX se utiliza para el bot de supervisión de órdenes.mainLa función en elOrder Synchronous Management System Library (Single Server)el modelo).

img

Es sólo que hemos cambiado la dirección de negociación a corto, y el volumen de negociación se cambió a 0.003 (Binance USDT-contratos de margen se pueden colocar en decimales). Sin embargo, la cuenta OKEX con órdenes debe ser un número entero (la orden colocada por OKEX debe ser un número entero), por lo que el parámetro que especifico el parámetro de la estrategiaspecifiedAmountcomo 1.

img

El bot de la función de prueba enOrder Synchronous Management System Library (Single Server)provocó el intercambio.

img

La orden de supervisión de la estrategia bot recibió la señal, y ejecutar la acción de supervisión:

img

La plataforma abrió el pedido correspondiente.

img

A continuación, pruebe las posiciones de cierre y cambie la dirección de la orden en la función principal para cerrar la posición corta, 0,003.

img

Luego reinicie el bot que es responsable de llevar órdenes (Order Synchronous Management System Library (Single Server)).

img

La misma operación también se activa en el bot de supervisión de orden:

img

Dirección de la estrategia:Ordenar la biblioteca del sistema de gestión sincrónica (servidor único) Sistema de gestión sincrónica de pedidos (servidor sincrónico)

Esas estrategias sólo se utilizan para la comunicación y el estudio; para el uso real, usted necesita modificar, ajustar y optimizar por sí mismo.


Más.