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

Desenvolvimento de estratégias de hedge de caixa para moedas digitais (2)

Autora:Inventor quantificado - sonho pequeno, Criado: 2021-07-30 16:36:48, Atualizado: 2023-09-20 10:36:43

img

Desenvolvimento de estratégias de hedge de caixa para moedas digitais (2)

No artigo anterior, nós implementamos uma estratégia simples de hedge, e agora vamos aprender como melhorar essa estratégia. A mudança de estratégia não é grande, mas os detalhes da mudança precisam ser considerados. Algumas definições e mudanças anteriores no código precisam de uma compreensão crítica.

A necessidade de melhorar essa estratégia

  • Modelo de alavancagem de objetos de câmbio em tempo real Esta alteração é apenas relativa ao disco real, e algumas transações em tempo real incluem todas as interfaces de alavancagem em tempo real, que também estão embaladas no FMZ. O modo de comutação direta é possível para objetos de exchanges que estão embalados diretamente no FMZ e suportam alavancagem em tempo real.
  • Aumentar o gráfico de diferença A diferença de aumento do gráfico mostra, porque apenas desenhoA交易所->B交易所B交易所->A交易所A linha de diferença, a linha horizontal que desencadeia a diferença.画线类库A vantagem é a simplicidade e a facilidade de utilização, e aqui também aprendemos a usar o FMZ para fazer o nosso trabalho.模版类库Funções.
  • Função de hedge unilateral Essa mudança é considerável, pois é difícil reverter completamente o diferencial entre os dois mercados em uma negociação de hedge específico. A maior parte do tempo, o preço de um mercado permanece mais alto do que o preço do outro. Nesse momento, se nossos ativos estiverem totalmente hedgeados (isto é, todos os moedas estão em um mercado com preços baixos e o dinheiro está no mercado com preços altos), o hedge está parado e não pode mais depender do lucro flutuante do diferencial.
  • Parâmetros como linha de diferença de hedge de modificação de interação A estratégia é mais interativa e pode ser modificada em tempo real.
  • Organize informações do bar de status, usando o formato de tabela A partir daí, o usuário pode criar uma lista de dados que ele deseja exibir para facilitar a observação.

A seguir, vamos implementar esses projetos um a um.

Modelo de alavancagem de objetos de troca de opções binárias

Usar o código para mudar para o modo de alavancagem em dinheiro, como no caso do banco de dados em dinheiro.exchanges[i].IO, passagem de parâmetrostrade_normalTroca para alavancagem, entradatrade_super_marginMudança para alavancagem total, retrô não é suportado. Isto é usado apenas em disco real.

EmmainAumentar a fase de preparação para o início da função:

    // 切换杠杆模式
    for (var i = 0 ; i < exchanges.length ; i++) {   // 遍历检测所有添加的交易所对象
        if (exchanges[i].GetName() == "Binance" && marginType != 0) {   // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
            if (marginType == 1) {
                Log(exchanges[i].GetName(), "设置为杠杆逐仓")
                exchanges[i].IO("trade_normal")
            } else if (marginType == 2) {
                Log(exchanges[i].GetName(), "设置为杠杆全仓")
                exchanges[i].IO("trade_super_margin")
            }
        }
    }

Aqui, a política só adiciona o código para o modo de alavancagem de moeda para trocar moeda em moeda corrente, então a configuração de troca no parâmetro da política também é válida apenas para moeda corrente.

Aumentar o gráfico de diferença

É muito simples usar um modelo de desenho que já está embalado.画线类库O site oficial da FMZ é o site oficial da FMZ, onde você pode pesquisar e obter informações diretamente na plataforma FMZ.

img

Ou clique diretamente no link:https://www.fmz.com/strategy/27293A página de reprodução deste modelo pode ser visitada aqui.

img

O botão pode ser clicado para copiar esta biblioteca de modelos para a sua própria biblioteca de políticas.

img

Em seguida, na página de edição da política, você pode selecionar a biblioteca de modelos que você precisa usar na barra de modelos. Selecionar depois salvar a política, e a política referenciará esse modelo. Aqui é apenas uma breve descrição do uso da biblioteca de modelos, que já foi referenciada neste modelo, então não é necessário repetir a operação.画线类库O blogueiro e blogueiro do Twitter, Jair Bolsonaro, escreveu sobre o assunto:

Nós aprendemos como usar.画线类库A função para desenhar o gráfico.

img

Nós estamos planejandoA->BA diferença de preços é muito grande.B->AA diferença, a linha de disparidade, é desenhada. É necessário desenhar duas curvas (a diferença atual de A para B e de B para A) e duas linhas horizontais (a linha de disparidade), como no gráfico acima.

A maioria das pessoas não sabe o que fazer, porque nós queremos criar uma cobertura unilateral.A->BeB->AA linha de gatilho é diferente. Não é possível usar o design do artigo anterior. O artigo anterior diz:

      var targetDiffPrice = hedgeDiffPrice
      if (diffAsPercentage) {
          targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
      }

Só um disparou a diferença.targetDiffPriceNão, não é. Então aqui nós vamos mudar o código, primeiro nós vamos mudar os parâmetros.

img

A partir daí, o código é alterado:

        var targetDiffPriceA2B = hedgeDiffPriceA2B
        var targetDiffPriceB2A = hedgeDiffPriceB2A
        if (diffAsPercentage) {
            targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
            targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
        }

A diferença de preços é muito maior do que a diferença de preços.targetDiffPriceUma se tornou em duas.targetDiffPriceA2BtargetDiffPriceB2ANão, não é. Em seguida, você pode usar a função de linha de desenho da biblioteca de linhas de desenho para desenhar esse dado no gráfico.

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

A estratégia é executada com um gráfico como este.

img

Em seguida, desenhe-se uma curva de diferença em tempo real, para evitar excessos. Coloque o código da curva de desenho de dados de diferença em tempo real no teste de equilíbrio.

        if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
            nowAccs = _C(updateAccs, exchanges)
            var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
            cancelAll()
            if (isBalance) {
                lastKeepBalanceTS = ts
                if (isTrade) {
                    var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
                    isTrade = false 
                }                
            }

            $.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price)  // 画实时差价曲线
            $.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price)  // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
        }

Assim, apenas quatro linhas de código de gráfico são exibidas, permitindo que a política tenha um gráfico exibido quando executada.

Função de hedge unilateral

O artigo acima menciona que a linha de gatilho para a diferença foi transformada em duas linhas, respectivamente controladas.A->BO que é que isso tem a ver?B->AO preço de venda de um produto ou serviço é o preço de venda do produto ou serviço.

        if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B 盘口条件满足            
            var priceSell = depthA.Bids[0].Price - slidePrice
            var priceBuy = depthB.Asks[0].Price + slidePrice
            var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
            if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
                Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks)  // 提示信息
                hedge(exB, exA, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A 盘口条件满足
            var priceBuy = depthA.Asks[0].Price + slidePrice
            var priceSell = depthB.Bids[0].Price - slidePrice
            var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
            if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
                Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks)  // 提示信息
                hedge(exA, exB, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        }

Como o preço de compra e venda está dividido em dois dados, podemos usar a função de hedge.hedgeO blog também precisa ser modificado.

function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
    var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
    var sellRoutine = sellEx.Go("Sell", priceSell, amount)
    Sleep(500)
    buyRoutine.wait()
    sellRoutine.wait()
}

Há ainda alguns ajustes mínimos baseados nessas mudanças, que não são descritos aqui, e que podem ser vistos no código.

Parâmetros como linha de diferença de hedge de modificação de interação

Aumentar a interação com a estratégia, permitindo que a estratégia modifique o gatilho de diferença em tempo real. Esta é uma necessidade de design de uma estratégia semi-automática, que também é implementada como uma demonstração pedagógica. O design da interação da política também é muito simples: primeiro, adicione controles de interação à política na página de edição da política.

img

Dois controles foram adicionados, um chamado A2B e outro chamado B2A. Ao inserir um valor na caixa de entrada do controle, clique no botão de entrada à direita.123Clique aqui.A2BO botão, que é o botão de direção do botão de direção do botão de direção do botão de direção do botão de direção do botão de direção do botão de direção do botão de direção do botão de direção do botão de direção.

A2B:123

Detecção e processamento de código de interação no design do código estratégico.

        // 交互
        var cmd = GetCommand()   // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
        if (cmd) {               // 检测到有交互指令,例如:A2B:123
            Log("接收到命令:", cmd)
            var arr = cmd.split(":")   // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
            if (arr[0] == "A2B") {     // 判断触发的交互控件是不是A2B
                Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageB2A = parseFloat(arr[1])     // 修改触发差价线
                } else {
                    hedgeDiffPriceA2B = parseFloat(arr[1])          // 修改触发差价线
                }
            } else if (arr[0] == "B2A") {           // 检测到触发的控件是B2A     
                Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageA2B = parseFloat(arr[1])
                } else {
                    hedgeDiffPriceB2A = parseFloat(arr[1])
                }
            }
        }

Organize informações do bar de status, usando o formato de tabela

A partir daí, o estado do arquivo é mais organizado e mais fácil de observar.

        var tbl = {
            "type" : "table", 
            "title" : "数据", 
            "cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"], 
            "rows" : [], 
        }
        tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
        tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")

img

Revisão

A retrospecção é apenas uma estratégia de teste, uma função de detecção inicial, muitos bugs podem ser testados na fase de retrospecção.

img

img

O código da estratégia:https://www.fmz.com/strategy/302834


Relacionados

Mais.

15570686905A estratégia de negociação é adicionar a função de contrato, o que é bom é adicionar contratos permanentes, contratos de taxa de transferência.

Nuvens leves- TypeError: Cannot read property 'SetPrecision' of undefined (Erro de Tipo: Não pode ler a propriedade 'SetPrecision' de indefinido) Estratégias de hedge de curto prazo para curto prazo em diferentes moedas Ver 1.1

Inventor quantificado - sonho pequenoO que você está fazendo aqui é muito bom.

Nuvens levesCompreendo, obrigada.

Inventor quantificado - sonho pequenoPara adicionar dois objetos de câmbio.