avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Dicipta dalam: 2023-07-04 16:35:42, dikemas kini pada: 2024-11-11 22:41:32
comments   3
hits   1076

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Dalam reka bentuk strategi FMZ asal, jika anda perlu menggunakan operasi serentak tak segerak, anda hanya boleh menggunakanexchange.Go()Fungsi digunakan untuk melaksanakan keselarasan antara muka pengkapsulan FMZ, dan beberapa operasi tersuai (fungsi) tidak boleh dilaksanakan secara serentak. Walaupun reka bentuk ini banyak meningkatkan kecekapan pelaksanaan program dasar, ia masih asing bagi pelajar yang mempunyai pengalaman dalam reka bentuk serentak dalam bahasa pengaturcaraan asli.

Malah beberapa pelajar baru yang baru dalam perdagangan kuantitatif menggunakan FMZ tidak fahamexchange.Go()Penggunaan fungsi, gunakanexchange.Go()Ia masih kelihatan seperti kenyataan dilaksanakan satu demi satu dalam kod yang dilaksanakan secara berurutan. Dalam artikel ini, mari kita terokai ciri penjalinan serentak baharu bagi platform FMZ:__Thread()Penggunaan siri fungsi dan program strategi reka bentuk tak segerak.

1. Reka bentuk serentak yang mudah

Jika kita ingin menjalankan utas kanak-kanak secara serentak untuk melaksanakan fungsi tersuai yang kami tulis semasa utas utama strategi sedang berjalan, kami boleh menggunakan reka bentuk yang serupa dengan kod berikut. Sesuaikan fungsi dalam kod strategiGetTickerAsync(), tulis kefungsian khusus fungsi ini. Fungsi ini melaksanakan gelung tak terhingga.whileAntara muka API FMZ dipanggil secara berterusan dalam gelung:GetTicker()Untuk mendapatkan data pasaran.

Kemudian gunakan__threadSetData(0, "ticker", t)Ayat ini menulis data ke utas utama Nama data ialahticker, nilai data ialahtSekarang niGetTicker()Nilai pulangan .

__threadSetData(0, "ticker", t)

Selepas mereka bentuk fungsi tersuai untuk pelaksanaan serentak benang, kita boleh menulismain()Kod dalam fungsi tersebut ialahmain()Pada permulaan fungsi, kami menggunakan:

__Thread(GetTickerAsync, 0)   // GetTickerAsync为需要并发执行的自定义函数,0为这个传入GetTickerAsync函数的参数

Buat urutan serentak, yang mula dilaksanakanGetTickerAsync()fungsi. kemudianmain()Fungsi mula melaksanakannyawhileGelung, terima dalam gelungGetTickerAsync()Fungsi mengemas kini data dan kemudian mencetak:

var t = __threadGetData(0, "ticker")
Log(t)

Contoh kod lengkap:

function GetTickerAsync(index) {
    while (true) {
        var t = exchanges[index].GetTicker()
        __threadSetData(0, "ticker", t)
        Sleep(500)
    }
}

function main() {
    __Thread(GetTickerAsync, 0)

    while(true) {
        var t = __threadGetData(0, "ticker")
        Log(t)
        Sleep(1000)
    }
}

Ujian operasi cakera sebenar:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Ini adalah reka bentuk aplikasi yang paling mudah Seterusnya, mari kita lihat beberapa reka bentuk permintaan yang lain.

2. Reka bentuk pesanan serentak

Fungsi boleh direka bentuk untuk mencipta 10 utas pada masa yang sama, dan setiap utas melaksanakan fungsi operasi pesanan. wujudmain()Reka fungsiwhileGelung, arahan interaksi strategi pengesanan. Terima arahan interaktif:placeMultipleOrdersPanggil sahaja fungsi pesanan serentak initestPlaceMultipleOrders()

if (cmd == "placeMultipleOrders") {
    // ...
}

Tambahkan reka bentuk interaksi strategi pada halaman penyuntingan strategi dan tetapkan butang dengan arahan: placeMultipleOrders

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Contoh kod lengkap:

function placeOrder(exIndex, type, price, amount) {
    var id = null 
    if (type == "Buy") {
        id = exchanges[exIndex].Buy(price, amount)
    } else if (type == "Sell") {
        id = exchanges[exIndex].Sell(price, amount)
    } else {
        throw "type error! type:" + type
    }
}

function testPlaceMultipleOrders(index, beginPrice, endPrice, step, type, amount) {
    Log("beginPrice:", beginPrice, ", endPrice:", endPrice, ", step:", step, ", type:", type, ", amount:", amount)
    var tids = []
    for (var p = beginPrice; p <= endPrice; p += step) {
        var tid = __Thread(placeOrder, index, type, p, amount)
        tids.push(tid)
        Sleep(10)
    }
    Sleep(1000)
    for (var i = 0; i < tids.length; i++) {
        __threadTerminate(tids[i])
    }
}

function main() {
    while(true) {
        LogStatus(_D())
        var cmd = GetCommand()
        if (cmd) {
            if (cmd == "placeMultipleOrders") {
                var t = _C(exchange.GetTicker)
                var beginPrice = t.Last * 0.8
                var endPrice = t.Last * 0.9
                var step = t.Last * 0.01
                testPlaceMultipleOrders(0, beginPrice, endPrice, step, "Buy", 0.01)
                var orders = exchange.GetOrders()
                for (var i = 0; i < orders.length; i++) {
                    Log(orders[i])
                }
            }
        }
        Sleep(1000)
    }
}
  • Ujian menggunakan kaedah pesanan belum selesai, meningkat daripada 80% kepada 90% daripada harga semasa, menggunakan ujian persekitaran cakera simulasi dan mengklik butang interaktif untuk mencetuskan pesanan ujian:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

  • Selepas mengklik butang “placeMultipleOrders”, mesej gesaan ialah:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

  • Log strategi menunjukkan operasi pesanan serentak:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

3. Buat sambungan WebSocket dalam fungsi pelaksanaan benang serentak

Keperluan ini dibangkitkan oleh pengguna FMZ yang mahukan contoh mudah untuk menunjukkan cara menggunakannya dalam urutan serentak.WebSocketSambung dan reka bentuk cara menghantar data ke utas utamamain()fungsi.

Ia sebenarnya sangat mudah, dan serupa dengan mencipta utas serentak dalam contoh sebelumnya. Hanya komunikasi antara benang digunakan__threadPeekMessage()Fungsi dan__threadPostMessage()fungsi. Mengambil panggilan antara muka WebSocket API Binance Exchange sebagai contoh, kita juga perlu memberi perhatian kepada operasi penutupan sambungan WebSocket dalam reka bentuk Contoh berikut juga menunjukkan cara untuk memberitahu urutan serentak untuk menghentikannya.

Contoh kod lengkap:

var tid = null 

function createWS() {
    // wss://stream.binance.com:9443/ws/<streamName> , <symbol>@ticker
    
    var stream = "wss://stream.binance.com:9443/ws/btcusdt@ticker"    
    var ws = Dial(stream)
    Log("创建WS连接:", stream)
    
    while (true) {
        var data = ws.read()
        if (data) {            
            __threadPostMessage(0, data)
        }
        Log("接收到WS链接推送的数据,data:", data)
        
        // __threadPeekMessage 超时参数设置-1,不阻塞
        var msg = __threadPeekMessage(-1)
        if (msg) {
            if (msg == "stop") {
                Log("并发线程Id:", __threadId(), "接收到stop指令")
                break
            }
        }
    }

    Log("并发线程执行完毕,关闭ws连接")
    ws.close()
}

function main() {
    tid = __Thread(createWS)
    Log("创建并发线程,线程Id:", tid)

    while(true) {
        // __threadPeekMessage 的超时参数设置为0,阻塞等待数据
        var data = __threadPeekMessage(0)
        Log("接收到并发线程", ", Id:", tid, ", 发送的数据,data:", data, "#FF0000")
        
        var tbl = {
            type : "table", 
            title : "<symbol>@ticker频道推送消息",
            cols : ["事件类型", "事件时间", "交易对", "24小时价格变化", "24小时价格变化百分比", "平均价格", "最新成交价格", "24小时内成交量", "24小时内成交额"],
            rows : []
        }

        try {
            data = JSON.parse(data)
            tbl.rows.push([data.e, _D(data.E), data.s, data.p, data.P, data.w, data.c, data.v, data.q])
        } catch (e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
    }
}

function onexit() {
    Log("扫尾函数,向Id为", tid, "的并发线程发送stop指令")
    __threadPostMessage(tid, "stop")
    Log("等待Id为", tid, "的并发线程停止")
    __threadJoin(tid)
    Log("扫尾函数执行完毕")
}

Ujian operasi cakera sebenar:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript

Anda boleh lihatmain()Fungsi ini secara berterusan menerima data pasaran daripada sambungan WebSocket yang dibuat oleh benang serentak.

Apabila strategi dihentikan, fungsi sapuan akan mula berfungsi:

Aplikasi fungsi __Thread dalam reka bentuk strategi JavaScript