Execução simultânea da função Go de envelopamento de barras usando JavaScript para implementar a política de quantificação

Autora:Ervas daninhas, Criado: 2019-06-29 11:24:57, Atualizado: 2023-10-26 20:06:10

img

Na implementação de estratégias de quantificação, em muitos casos, a execução em simultâneo pode reduzir a eficiência do timeout. Para um robô de hedge, por exemplo, é necessário obter a profundidade de dois moedas, o código executado na sequência é o seguinte:

var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()

O requisito rest API tem um atraso, supondo que seja de 100 ms, então o tempo de aquisição de profundidade de duas vezes é realmente diferente, e o problema de atraso será mais proeminente se mais visitas forem necessárias, afetando a execução da política.

O JavaScript não possui muitos fios, portanto, a função Go embalada no fundo resolve esse problema, mas é mais difícil de implementar devido ao mecanismo de design.

var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() //调用wait方法等待返回异步获取depth结果 
var depthB = b.wait()

Na maioria dos casos simples, não há problema em escrever uma política assim. Mas note que cada ciclo de política tem que repetir o processo, e as variáveis intermediárias a e b são apenas auxiliares temporárias. Se temos muito trabalho em simultâneo, é necessário registrar a relação correspondente entre a e a profundidade A, b e a profundidade B. A situação é ainda mais complexa quando nossa tarefa de simultâneo não é determinada.

function G(t, ctx, f) {
    return {run:function(){
        f(t.wait(1000), ctx)
    }}
}

Nós definimos uma função G, onde o parâmetro t é a função Go a ser executada, ctx é o contexto do programa de registro, f é a função com o valor específico.

Neste caso, o quadro de programação geral pode ser escrito como semelhante ao modelo de programação produtor-consumidor (com algumas diferenças), onde o produtor emite continuamente tarefas e o consumidor as executa em simultâneo. O código é apenas uma demonstração e não envolve a lógica de execução do programa.

var Info = [{depth:null, account:null}, {depth:null, account:null}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单Id,状态等。
var tasks = [ ] //全局的任务列表

function produce(){ //下发各种并发任务
  //这里省略了任务产生的逻辑,仅为演示
  tasks.push({exchange:0, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:1, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:0, ret:'sellID', param:['Buy', Info[0].depth.Asks[0].Price, 10]})
  tasks.push({exchange:1, ret:'buyID', param:['Sell', Info[1].depth.Bids[0].Price, 10]})
}
function worker(){
    var jobs = []
    for(var i=0;i<tasks.length;i++){
        var task = tasks[i]
        tasks.splice(i,1) //删掉已执行的任务
        jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
                    Info[task.exchange][task.ret] = v //这里的v就是并发Go函数wait()的返回值,可以仔细体会下
                }))
    }
    _.each(jobs, function(t){
            t.run() //在这里并发执行所有任务
        })
}
function main() {
    while(true){
        produce()         // 发出交易指令
        worker()        // 并发执行
        Sleep(1000)
    }
}

O que parece ser um ciclo de execução de uma função simples, na verdade, simplifica muito a complexidade do código, basta nos preocuparmos com as tarefas que o programa precisa produzir, e o worker () automaticamente as executa em simultâneo e retorna os resultados correspondentes. A flexibilidade é muito melhorada.


Relacionados

Mais.

77924998Grasshopper, pode ser que o Python inteiro

RegenteApresentação

Ervas daninhasPython tem sua própria biblioteca de programação, mais fácil de usar do que o Go.