avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Implementar um robô simples de negociação à vista de moeda digital

Criado em: 2021-02-18 16:09:43, atualizado em: 2023-09-26 20:57:30
comments   6
hits   3831

Implementar um robô simples de negociação à vista de moeda digital

Implementar um robô simples de negociação à vista de moeda digital

Há muitos traders manuais no mundo das criptomoedas que precisam de robôs imitadores, mas eles estão preocupados com o fato de que leva muito tempo para começar a usar o design programático quando não têm conhecimento básico. Com base nesse tipo de demanda, neste artigo projetaremos um robô simples de copy trading para ajudar amigos no círculo de criptomoedas que não têm conhecimento básico de negociação algorítmica.

Primeiro, vamos analisar as necessidades. A função deste robô é garantir que quando uma conta tiver uma operação de compra ou venda, outras contas de cópia seguirão o exemplo e executarão esta operação. Portanto, primeiro esclarecemos dois assuntos:

  • Conta de referência: uma conta monitorada que monitora cada movimentação desta conta.
  • Conta de cópia: A conta que segue ordens. Quando uma ação ocorre na conta de referência, a conta de cópia executa a mesma ação.

Agora que identificamos preliminarmente essa necessidade, precisamos continuar pensando no próximo passo. Como identificamos as ações das contas de referência?

O monitoramento de contas de referência é muito simples para contas spot. Precisamos apenas comparar o número de moedas nos dados de informações de conta mais recentes com o número de moedas nos dados de informações de conta mais recentes obtidos atualmente. Se o número de moedas nos dados de informações da conta mais recentes obtidos atualmente for maior que o registro anterior, isso prova que a conta de referência executou uma operação de compra e a compra foi bem-sucedida. Caso contrário, se houver menos moedas, é realizada uma operação de venda para a conta de referência. Depois que descobrimos essa ação, simplesmente deixamos outras contas de câmbio realizarem a mesma operação.

Quando uma transação é considerada executada em uma conta de referência, o registro de dados da conta mais recente deve ser atualizado para comparação com as informações da conta obtidas na próxima vez para determinar se há alguma nova ação de transação.

A lógica acima é descrita pelo código de estratégia:

        // 检测跟单
        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
        }
        
        // 执行跟单
        Log("跟单!数量:", Math.abs(amount), "#FF0000")
        for (var i = 1 ; i < exchanges.length ; i++) {    // i 等于 0 时,是参考交易所,不处理,处理其它的跟单交易所        
            func(exchanges[i], Math.abs(amount))          // 执行具体的交易函数,可能是$.Buy 或者是 $.Sell ,具体看amount 是大于0,还是小于0
        }
        
        // 执行跟单之后更新参考交易所账户信息记录
        initAcc = nowAcc                                  // 更新参考交易所最近一次的账户信息,用于下次对比

A principal lógica de detecção da estratégia é o código acima. Para simplificar o design, a estratégia usa o modelo oficial da FMZ [Biblioteca de Negociação de Moedas Digitais].$.Buy , $.SellTodas essas são funções deste modelo e sua função é executar operações de pedidos.

Adicione algumas exibições de barra de status à estratégia para facilitar o monitoramento dos dados de cada conta. A estratégia completa é a seguinte:

function test() { 
    // 测试函数
    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 "没有跟单的交易所"
    }
    var exName = exchange.GetName()
    // 检测参考交易所
    if (exName.includes("Futures_")) {
        throw "仅支持现货跟单"
    }
    Log("开始监控", exName, "交易所", "#FF0000")
    
    // 检测跟单交易所
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName().includes("Futures_")) {
            throw "不支持期货交易所跟单"
        }
    }
    
    var initAcc = _C(exchange.GetAccount)
    while(1) {
        if(IsVirtual()) {
           // 测试函数
           test()  
        }  
        Sleep(5000)
        
        // 更新参考账户当前的账户信息
        var nowAcc = _C(exchange.GetAccount)
        
        // 参考交易所账户信息
        var refTbl = {
            type : "table", 
            title : "参考交易所",
            cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
            rows : []
        }
        refTbl.rows.push([exName, nowAcc.Stocks, nowAcc.FrozenStocks, nowAcc.Balance, nowAcc.FrozenBalance])
        
        // 跟单交易所账户信息
        var followTbl = {
            type : "table", 
            title : "跟单交易所",
            cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
            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])
        }
        
        // 状态栏显示
        LogStatus(_D(), "\n`" + JSON.stringify(refTbl) + "`", "\n`" + JSON.stringify(followTbl) + "`")
        
        // 检测跟单
        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
        }
        
        // 执行跟单
        Log("跟单!数量:", Math.abs(amount), "#FF0000")
        for (var i = 1 ; i < exchanges.length ; i++) {            
            func(exchanges[i], Math.abs(amount))
        }
        
        // 执行跟单之后更新参考交易所账户信息记录
        initAcc = nowAcc
    }
}

Vamos fazer um teste em tempo real usando o teste de câmbio simulado wexApp da FMZ. Aqui adicionei três contas wexApp, que são independentes uma da outra. Um deles serve como troca de referências, e os outros dois servem como troca de cópias.

Implementar um robô simples de negociação à vista de moeda digital

Em seguida, usamos o terminal de negociação da FMZ para fazer uma ordem manualmente e ver se o robô seguirá a ordem automaticamente.

Implementar um robô simples de negociação à vista de moeda digital

Você pode ver que o robô detectou a transação e executou a operação de cópia.

Implementar um robô simples de negociação à vista de moeda digital

Estratégia completa: https://www.fmz.com/strategy/255182

A estratégia é apenas para aprendizado. Se você tiver alguma dúvida, deixe uma mensagem.