O recurso está a ser carregado... Carregamento...

Projeto de Sistema de Gestão da Sincronização de Encomendas Baseado no FMZ Quant (2)

Autora:FMZ~Lydia, Criado: 2022-11-08 11:34:20, Atualizado: 2023-09-15 20:48:46

img

Projeto de Sistema de Gestão da Sincronização de Encomendas Baseado no FMZ Quant (2)

Sistema de Gestão de Sincronização de Encomendas (Servidor Sincrônico)

Continuemos com a discussão do artigo anterior: Projeto do Sistema de Gestão de Sincronização de Encomendas Baseado na Quantificação FMZ (1) (https://www.fmz.com/digest-topic/9729) e começar a conceber uma estratégia de acompanhamento sincronizado das ordens.

Pense em algumas dessas questões de design:

    1. Se você não quiser executar o seguimento de ordem sincronizado temporariamente, é possível pausa-lo? Uma vez suspenso, é proibido iniciar a partir da API estendida, deve ser autenticado pela senha. Implementar esta função adicionando 2 variáveis globais:
var isStopFollow = false   // Used to mark whether the current order is being followed
var reStartPwd = null      // Used to record the restart password

img

Em seguida, adicionamos controles interativos na página de edição de estratégia para pausa estratégia / reiniciar (não para parar o bot real, apenas pausa lógica, não mais ordem de seguimento).Order Synchronization Management System Class Library (Single Server)Quando reiniciar a função de seguir ordens, digite a senha pré-definida para acordar a função de seguir ordens. Código para a execução das funções relevantes:

...
          // 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. Você pode especificar a quantidade de ordens a serem seguidas ou pode ser dimensionado em múltiplos Adicionar parâmetros à estratégia:

img

specifiedAmount: especificar o número de ordens seguidas, o valor por defeito é -1, ou seja, não especificado. zoomAmountRatio: Escalagem de acordo com a quantidade de ordens enviadas, por exemplo, se o sinal enviado for: ETH_USDT,swap,buy,1, multiplicar o valor do valor do montante de ordens por zoomAmountRatio. O padrão é -1, ou seja, sem escalagem.

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

Aqui, é implementado para escalar ou especificar um valor específico para o número de ordens a serem seguidas no sinal recebido.

    1. O código deve ser o mais simples possível, utilizar outras bibliotecas de modelos para fazer uma encomenda.

A biblioteca de classes utilizada pelas ordens spot colocada:https://www.fmz.com/strategy/10989A biblioteca de classes utilizada por 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
  }

Então podemos ver que fazer uma ordem só precisa de uma frase:$.Sell(amount), $.Buy(amount), $.OpenLong(exchange, action.ct, amount). etc.

Código de estratégia:

O código temporário do anteriorOrder Synchronous Management System (Synchronous Server)foi o seguinte:

img

Agora começamos a redesenhar o Sistema de Gerenciamento de Sincronização de Encomendas (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)
    }
}

Teste

Nós testamos a conta de liderança de ordens usando o Binance real bot para este tempo, e nós usamos a conta OKEX para ordem de seguimento real bot.mainFunção na função de ensaio(Order Synchronization Management System Class Library (Single Server)no modelo) utilizado no artigo anterior.

img

Aqui, mudamos a direção da transação para sell, e o volume da transação para 0,003 (As ordens podem ser colocadas em números decimais para os contratos padrão Binance USDT).

img

Em seguida, vamos testar o fechamento da posição alterando a direção da ordem na função principal de teste para fechar a posição curta em 0,003.

img

Em seguida, executá-lo novamente, que é responsável pela ordem de liderança (Order Synchronization Management System Class Library (Single Server)).

A mesma operação foi desencadeada por um robô real que seguiu ordens.

O endereço da estratégia: Biblioteca de classes do sistema de gestão de sincronização de ordens (servidor único) (https://www.fmz.com/strategy/345171) Sistema de gestão de sincronização de encomendas (Servidor síncrono) (https://www.fmz.com/strategy/345172)

A estratégia é concebida apenas para comunicação e aprendizagem, por favor ajuste e otimize de acordo com as necessidades reais.


Relacionados

Mais.