Continuemos a discussão no último artigo:Projeto do sistema de gestão síncrona baseado em ordens FMZ (1), a elaboração de uma estratégia de supervisão sincronizada das ordens. Por favor, considere as seguintes questões de concepção:
var isStopFollow = false // used to mark whether to currently supervise orders or not
var reStartPwd = null // used to record the restart password
Em seguida, adicione controles interativos na página de edição de estratégia para parar / reiniciar a estratégia (não é para parar o bot, basta parar a lógica, para não seguir e supervisionar ordens, sem fazer nada).Order Synchronous Management System Library (Single Server)
Quando reiniciar para supervisionar ordens, digite a senha pré-definida para invocar a função de supervisão de ordens.
Código de implementação da função 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.O montante da encomenda sob supervisão pode ser especificado ou reduzido em função do rácio:
SpecifiedAmount: especificar o montante da ordem sob supervisão; o valor por defeito é -1, ou seja, não especificado.
zoomAmountRatio: zoom de acordo com a quantidade de ordem no sinal enviado. Por exemplo, o sinal enviado é:ETH_USDT,swap,buy,1
, em seguida, multiplicar o valor da quantidade de encomenda por zoomAmountRatio; padrão é -1, ou seja, não ampliado.
var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio
Aqui percebemos queZoomo montante da encomenda, ouespecificar um determinado valor, de acordo com o sinal recebido.
3.Escrever códigos o mais simples possível e utilizar outras bibliotecas de modelos para lidar com as encomendas.
Biblioteca de modelos utilizada para a colocação de ordens spot:https://www.fmz.com/strategy/10989Biblioteca de modelos utilizada para a colocação de ordens 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 conseguinte, pode-se ver que a colocação de uma ordem só precisa de uma declaração:$.Sell(amount)
, $.Buy(amount)
, $.OpenLong(exchange, action.ct, amount)
, etc.
O código temporário no código anteriorOrder Synchronous Management System (Synchronous Server)
é a seguinte:
Agora, vamos desenhar oOrder Synchronous Management System (Synchronous Server)
Mais uma vez:
// 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)
}
}
Desta vez, o Binance real tick test é usado para a conta com ordens, e a conta OKEX é usada para o bot de supervisão de ordens.main
função naOrder Synchronous Management System Library (Single Server)
modelo).
É apenas que nós mudamos a direção de negociação para curto, e o volume de negociação foi alterado para 0,003 (Binance USDT-contratos de margem podem ser colocados em decimais).specifiedAmount
como 1.
O bot da função de teste emOrder Synchronous Management System Library (Single Server)
desencadeou a troca.
A ordem de supervisão estratégia bot recebeu o sinal, e executar a ação de supervisão:
A plataforma abriu a ordem correspondente.
Em seguida, teste as posições de fechamento e mude a direção da ordem na função principal para fechar a posição curta, 0,003.
Em seguida, reinicie o bot que é responsável por realizar ordens (Order Synchronous Management System Library (Single Server)
).
A mesma operação também é desencadeada no bot de supervisão da ordem:
Endereço da estratégia:Ordenação da biblioteca do sistema de gestão síncrona (servidor único) Sistema de gestão sincronizado de encomendas (servidor sincronizado)
Essas estratégias são usadas apenas para comunicação e estudo; para uso real, você precisa modificá-las, ajustá-las e otimizá-las por si mesmo.