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

Penyelesaian perkongsian pasaran berbilang robot

Dicipta dalam: 2020-07-15 16:25:20, dikemas kini pada: 2024-12-10 10:11:04
comments   4
hits   2306

Penyelesaian perkongsian pasaran berbilang robot

Penyelesaian perkongsian pasaran berbilang robot

Apabila menggunakan robot dagangan kuantitatif mata wang digital, apabila berbilang robot berjalan pada pelayan dan mengakses pertukaran yang berbeza, tiada masalah besar dan tiada isu kekerapan permintaan API. Jika anda perlu mempunyai beberapa robot berjalan pada masa yang sama, dan kesemuanya melakukan strategi dagangan kuantitatif untuk pertukaran yang sama dan pasangan dagangan yang sama. Pada masa ini, terdapat masalah had kekerapan permintaan API. Jadi bagaimana kita menyelesaikan masalah berbilang robot yang mengakses antara muka sambil menggunakan bilangan pelayan yang paling sedikit?

Kami boleh melaksanakan robot pemajuan pasaran, yang boleh mengakses antara muka pertukaran untuk mendapatkan maklumat pasaran dan data lain hanya menggunakan robot yang satu ini. Robot strategi dagangan lain hanya boleh meminta data daripada robot pemaju pasaran ini.

Contoh robot pemaju pasaran

Ia hanya bertanggungjawab untuk mengakses antara muka sebut harga pertukaran untuk mendapatkan data dan memberikan maklumat sebut harga kepada robot lain. gunaPythonDalam contoh ini, kami hanya memperoleh data K-line dan menyediakan perkongsian. Kami boleh mengembangkannya untuk menambah data kedalaman, data pasaran agregat, dsb.

import _thread
import threading
import json
import math
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse

Records = None
lock = threading.RLock()
Counter = {}

def url2Dict(url):
    query = urlparse(url).query  
    params = parse_qs(query)  
    result = {key: params[key][0] for key in params}  
    return result

class Provider(BaseHTTPRequestHandler):
    def do_GET(self):
        global Records, lock, Counter
        try:
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()

            dictParam = url2Dict(self.path)
            # Log("服务接收到请求,self.path:", self.path, "query 参数:", dictParam)
            lock.acquire()
            # 记录
            if dictParam["robotId"] not in Counter:
                Counter[dictParam["robotId"]] = {"NumberOfRequests" : 0}
            Counter[dictParam["robotId"]]["NumberOfRequests"] += 1
            lock.release()
            
            # 写入数据应答
            self.wfile.write(json.dumps(Records).encode())
        except BaseException as e:
            Log("Provider do_GET error, e:", e)


def createServer(host):
    try:
        server = HTTPServer(host, Provider)
        Log("Starting server, listen at: %s:%s" % host)
        server.serve_forever()
    except BaseException as e:
        Log("createServer error, e:", e)
        raise Exception("stop")

def main():
    global Records, Counter
    LogReset(1)
    try:
        # _thread.start_new_thread(createServer, (("localhost", 9090), ))         # 本机测试
        _thread.start_new_thread(createServer, (("0.0.0.0", 9090), ))             # VPS服务器上测试
        Log("启动服务", "#FF0000")
    except BaseException as e:
        Log("启动服务失败!")
        Log("错误信息:", e)
        raise Exception("stop")
    while True:
        r = exchange.GetRecords()
        if not r :
            Log("K线行情获取失败", "#FF0000")
            continue
        else :
            Records = r
        # Counter
        tbl = {
            "type" : "table", 
            "title" : "统计信息", 
            "cols" : ["请求数据的机器人id", "请求次数"], 
            "rows" : [], 
        }
        for k in Counter:
            tbl["rows"].append([k, Counter[k]["NumberOfRequests"]])
        LogStatus(_D(), "数据收集中!", "\n", "`" + json.dumps(tbl) + "`")
        Sleep(500)
        

Minta kod strategi robot data

Robot yang meminta data ialah robot strategi perdagangan Walau bagaimanapun, untuk tujuan ujian, kami hanya menulis data yang diminta (data K-line) dan melukis data.JavaScriptUntuk melukis gambar, anda perlu menyemak “Perpustakaan Lukisan Garisan”. Anda boleh mencari dan menyalin perpustakaan ini di Dataran Strategi Selepas menyalin, anda boleh menyemak lajur rujukan templat dalam halaman penyuntingan strategi.

var FuncGetRecords = exchange.GetRecords
exchange.GetRecords = function() {
    // 可以填写「行情转发机器人」所在设备的IP地址xxx.xxx.xxx.xxx
    var ret = HttpQuery("http://xxx.xxx.xxx.xxx:9090?robotId=" + _G())  
    var records = null
    try {
        records = JSON.parse(ret)
    } catch(e) {
        Log(e)
        records = null
    }
    return records 
}

function main(){
    LogReset(1)
    while(1) {
        var records = exchange.GetRecords()
        LogStatus(_D(), "机器人ID:", _G())
        if (!records) {
            Log("获取数据失败!", "#FF0000")
            Sleep(1000)
            continue
        }
        Log(records)
        $.PlotRecords(records, "K")
        Sleep(1000)
    }
}

Operasi sebenar

  • Mulakan robot pemaju pasaran Penyelesaian perkongsian pasaran berbilang robot

  • Mulakan robot ujian, ID: 206353 Penyelesaian perkongsian pasaran berbilang robot

  • Mulakan robot ujian, ID: 206359 Penyelesaian perkongsian pasaran berbilang robot

  • Mulakan robot ujian, ID: 206360 Penyelesaian perkongsian pasaran berbilang robot

Dengan cara ini, tiga atau bahkan N robot boleh berkongsi data K-line bagi pasangan dagangan tertentu. Ini hanyalah titik permulaan, dialu-alukan untuk meninggalkan mesej.