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交易所->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.A seguir, vamos implementar esses projetos um a um.
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_normal
Troca para alavancagem, entradatrade_super_margin
Mudança para alavancagem total, retrô não é suportado. Isto é usado apenas em disco real.
Emmain
Aumentar 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.
É 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.
Ou clique diretamente no link:https://www.fmz.com/strategy/27293A página de reprodução deste modelo pode ser visitada aqui.
O botão pode ser clicado para copiar esta biblioteca de modelos para a sua própria biblioteca de políticas.
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.
Nós estamos planejandoA->B
A diferença de preços é muito grande.B->A
A 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->B
eB->A
A 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.targetDiffPrice
Não, não é.
Então aqui nós vamos mudar o código, primeiro nós vamos mudar os parâmetros.
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.targetDiffPrice
Uma se tornou em duas.targetDiffPriceA2B
、targetDiffPriceB2A
Nã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.
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.
O artigo acima menciona que a linha de gatilho para a diferença foi transformada em duas linhas, respectivamente controladas.A->B
O que é que isso tem a ver?B->A
O 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.hedge
O 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.
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.
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.123
Clique aqui.A2B
O 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])
}
}
}
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) + "`")
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.
O código da estratégia:https://www.fmz.com/strategy/302834
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.