Использовать JavaScript для реализации одновременного выполнения количественной стратегии - инкапсулировать функцию Go

Автор:Лидия., Создано: 2023-01-31 09:57:00, Обновлено: 2023-09-18 20:10:07

img

Использовать JavaScript для реализации одновременного выполнения количественной стратегии - инкапсулировать функцию Go

При реализации количественной стратегии одновременное исполнение может уменьшить задержку и повысить эффективность во многих случаях.

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

Если требуется больше доступа, проблема задержки станет более заметной и повлияет на реализацию стратегии.

JavaScript не имеет многопотоков, поэтому функция Go встроена в нижнюю часть, чтобы решить эту проблему.

var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() // Call the wait method to wait for the return of the depth result asynchronously 
var depthB = b.wait()

В большинстве простых случаев нет ничего плохого в написании стратегии таким образом. Однако следует отметить, что этот процесс должен повторяться для каждой петли стратегии. Промежуточные переменные a и b являются только временными вспомогательными. Если у нас много одновременных задач, нам нужно записать соответствующее отношение между a и depthA, и b и depthB. Когда наши одновременные задачи неопределены, ситуация становится более сложной. Поэтому мы хотим реализовать функцию: при написании Go одновременно связывайте переменную в одно и то же время, и когда результат одновременной операции возвращается, результат будет автоматически присвоен переменной, устраняя промежуточную переменную и, таким образом, делая программу более лаконичной. Конкретная реализация выглядит следующим образом:

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

Мы определяем функцию G, где параметр t - это выполняемая функция Go, ctx - это контекст записи программы, а f - специфическая функция назначения.

В настоящее время общая рамка программы может быть написана как аналогичная модели "производитель-потребитель" (с некоторыми отличиями). Производитель продолжает отправлять задачи, а потребитель выполняет их одновременно.

var Info = [{depth:null, account:null}, {depth:null, account:null}] // If we need to obtain the depth and account of the two exchanges, more information can also be put in, such as order ID, status, etc.
var tasks = [ ] // Global list of tasks

function produce(){ // Issue various concurrent tasks
  // The logic of task generation is omitted here, for demonstration purposes only.
  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) // Delete executed tasks
        jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
                    Info[task.exchange][task.ret] = v // The v here is the return value of the concurrent Go function wait(), which can be experienced carefully.
                }))
    }
    _.each(jobs, function(t){
            t.run() // Execute all tasks concurrently here
        })
}
function main() {
    while(true){
        produce()         // Send trade orders
        worker()        // Concurrent execution
        Sleep(1000)
    }
}

По-видимому, после того, как мы пошли по кругу, была реализована только одна простая функция. На самом деле, сложность кода была значительно упрощена. Нам нужно только заботиться о том, какие задачи должна генерировать программа. Программа worker() автоматически выполняет их одновременно и возвращает соответствующие результаты. Гибкость значительно улучшилась.


Связанные

Больше