Há muitos amigos no círculo de criptomoedas que precisam de um bot de supervisão de ordens, mas eles estão sofrendo com o longo tempo para começar com o design programático quando têm zero básico.
A função deste bot é perceber que quando uma conta tem uma operação de compra ou venda, outras contas de supervisão de ordem seguirão e executarão a operação também. Então, primeiro definimos dois assuntos:
Após esta exigência ter sido inicialmente esclarecida, continuamos a pensar no próximo passo: como podemos identificar cada ação do relato de referência?
Monitorar a conta de referência. É muito simples para as contas de negociação à vista. Nós só precisamos comparar o valor do símbolo nos dados de informações da conta mais recente com o valor do símbolo atual nos dados de informações da conta mais recente obtidos. Se o valor do símbolo nos últimos dados de informações da conta atualmente obtidos for maior do que o registro anterior, prova que a conta de referência realizou uma operação de compra e a execução foi bem-sucedida.
Quando for constatado que a conta de referência realizou uma operação, o último registo de dados da conta deve ser actualizado para o comparar com as informações da conta obtidas na próxima vez, a fim de determinar se existe uma nova ação de negociação.
A descrição do código de estratégia da lógica acima:
// detect order supervising
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks) // detect the currency amount changes
var func = null
if (amount > 0) { // the amount increased
func = $.Buy // buy
} else if (amount < 0) { // the amount decreased
func = $.Sell // sell
} else {
continue
}
// execute order supervising
Log("Order supervising! Amount:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) { // when i equals 0, it indicates the reference platform, not to be processed; process other order supervising platforms
func(exchanges[i], Math.abs(amount)) // execute the specified trading function, and it could be $.Buy or $.Sell, which needs to be determined by observing whether amount is larger than 0 or less than 0
}
// update the information record of the reference account after order supervising
initAcc = nowAcc // update the latest account information of the reference platform, to compare it with the next one
A principal lógica de detecção da estratégia é o código acima.$.Buy
e$.Sell
O valor da posição em risco deve ser calculado de acordo com o método de classificação da posição em risco.
Adicionar algumas exibições da barra de estado para a estratégia para facilitar o monitoramento dos dados de cada conta.
function test() {
// test function
var ts = new Date().getTime()
if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
Sleep(1000 * 60 * 10)
var x = Math.random()
if (x > 0.5) {
$.Buy(exchange, x / 10)
} else {
$.Sell(exchange, x / 10)
}
}
}
function main() {
LogReset(1)
if (exchanges.length < 2) {
throw "no platform of order supervising"
}
var exName = exchange.GetName()
// detect the reference platform
if (exName.includes("Futures_")) {
throw "only support sport order supervising"
}
Log("start monitoring", exName, "platform", "#FF0000")
// detect the order supervising platforms
for (var i = 1 ; i < exchanges.length ; i++) {
if (exchanges[i].GetName().includes("Futures_")) {
throw "Do not support the order supervising of futures platfroms"
}
}
var initAcc = _C(exchange.GetAccount)
while(1) {
if(IsVirtual()) {
// test function
test()
}
Sleep(5000)
// update the current information of the reference account
var nowAcc = _C(exchange.GetAccount)
// the account information of the reference platform
var refTbl = {
type : "table",
title : "reference platform",
cols : ["name", "symbol", "frozen symbol", "assets", "frozen assets"],
rows : []
}
refTbl.rows.push([exName, nowAcc.Stocks, nowAcc.FrozenStocks, nowAcc.Balance, nowAcc.FrozenBalance])
// the account information of the order supervising platform
var followTbl = {
type : "table",
title : "order supervising platform",
cols : ["name", "symbol", "frozen symbol", "assets", "frozen assets"],
rows : []
}
for (var i = 1 ; i < exchanges.length ; i++) {
var acc = _C(exchanges[i].GetAccount)
var name = exchanges[i].GetName()
followTbl.rows.push([name, acc.Stocks, acc.FrozenStocks, acc.Balance, acc.FrozenBalance])
}
// status bar display
LogStatus(_D(), "\n`" + JSON.stringify(refTbl) + "`", "\n`" + JSON.stringify(followTbl) + "`")
// detect order supervising
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks)
var func = null
if (amount > 0) {
func = $.Buy
} else if (amount < 0) {
func = $.Sell
} else {
continue
}
// execute order supervising
Log("Order supervising! Amount:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) {
func(exchanges[i], Math.abs(amount))
}
// update the information record of the reference account after order supervising
initAcc = nowAcc
}
}
Vamos testá-lo no bot real, pela plataforma de simulação FMZ wexApp para testar. Aqui eu adicionei três contas wexApp, que são todas contas independentes. Uma delas serve como uma plataforma de referência, e as outras duas servem como plataformas de supervisão de pedidos.
Depois, colocamos manualmente uma ordem no terminal de negociação da FMZ para ver se o bot podia supervisionar automaticamente a ordem.
Podem ver que o bot detectou a troca e realizou a operação de supervisão de ordens.
Estratégia completa:https://www.fmz.com/strategy/255182
A estratégia é apenas para estudo. Quando houver alguma dúvida, gostaríamos que deixassem comentários sobre isso.