Artikel terkait:https://www.fmz.com/bbs-topic/5969
Karena HTTPServer sendiri memiliki beberapa celah, pertimbangkan untuk menggunakan ThreadingHTTPServer sebagai gantinya. Referensi:https://docs.python.org/3.7/library/http.server.htmlAnda membutuhkan versi Python 3.7.
Informasi tentang masalah HTTPServer:https://www.zybuluo.com/JunQiu/note/1350528
''' 请求格式:http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=buy&amount=0.001 策略机器人参数: - 类型:加密字符串,AccessKey , SecretKey ,可以用FMZ平台的低权限的API KEY,或者自己生成KEY也可以。 - 类型:字符串,合约ID,ContractType - 类型:数值,端口号,Port ''' import re import _thread import json from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse def url2Dict(url): query = urlparse(url).query params = parse_qs(query) result = {key: params[key][0] for key in params} return result class Executor(BaseHTTPRequestHandler): def do_GET(self): try: dictParam = url2Dict(self.path) Log("测试", dictParam) except Exception as e: Log("Provider do_GET error, e:", e) def do_POST(self): try: self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() dictParam = url2Dict(self.path) # 测试POST请求Body信息 data = self.rfile.read(200) # 指定了读取长度 Log("data:", data) # 打印POST请求的数据,可以根据请求中的数据具体再让机器人执行对应的操作 # 校验 if len(dictParam) == 4 and dictParam["access_key"] == AccessKey and dictParam["secret_key"] == SecretKey: del dictParam["access_key"] del dictParam["secret_key"] Log("接收到请求", "参数:", dictParam, "#FF0000") ''' map[access_key:xxx amount:0.001 secret_key:yyy type:buy] ''' isSpot = True if exchange.GetName().find("Futures") != -1: if ContractType != "": exchange.SetContractType(ContractType) isSpot = False else : raise "未设置期货合约" q = None if exchange.GetName() == "Futures_CTP" and UseMarketOrderForCTP == False: q = ext.NewTaskQueue() if isSpot and dictParam["type"] == "buy": exchange.Buy(-1, float(dictParam["amount"])) Log(exchange.GetAccount()) elif isSpot and dictParam["type"] == "sell": exchange.Sell(-1, float(dictParam["amount"])) Log(exchange.GetAccount()) elif not isSpot and dictParam["type"] == "long": exchange.SetDirection("buy") if not q: exchange.Buy(-1, float(dictParam["amount"])) else : q.pushTask(exchange, ContractType, "buy", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000")) Log("持仓:", exchange.GetPosition()) elif not isSpot and dictParam["type"] == "short": exchange.SetDirection("sell") if not q: exchange.Sell(-1, float(dictParam["amount"])) else : q.pushTask(exchange, ContractType, "sell", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000")) Log("持仓:", exchange.GetPosition()) elif not isSpot and dictParam["type"] == "cover_long": exchange.SetDirection("closebuy") if not q: exchange.Sell(-1, float(dictParam["amount"])) else : q.pushTask(exchange, ContractType, "closebuy", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000")) Log("持仓:", exchange.GetPosition()) elif not isSpot and dictParam["type"] == "cover_short": exchange.SetDirection("closesell") if not q: exchange.Buy(-1, float(dictParam["amount"])) else : q.pushTask(exchange, ContractType, "closesell", float(dictParam["amount"]), lambda task, ret: Log(task["desc"], ret, "#FF0000")) Log("持仓:", exchange.GetPosition()) if q is not None: while q.size() > 0: q.poll() Sleep(500) # 处理body数据 if isDealBodyMsg: if exchange.GetName().find("Futures") != -1: Log("data:", data.decode('utf-8')) # 测试 if re.search(r'buy', data.decode('utf-8')): Log("触发buy") exchange.SetContractType(ct) exchange.SetDirection("buy") exchange.Buy(-1, amount) elif re.search(r'sell', data.decode('utf-8')): Log("触发sell") exchange.SetContractType(ct) exchange.SetDirection("sell") exchange.Sell(-1, amount) # 写入数据应答 self.wfile.write(json.dumps({"state": "ok"}).encode()) except Exception as e: Log("Provider do_POST error, e:", e) def createServer(host): try: server = ThreadingHTTPServer(host, Executor) Log("Starting server, listen at: %s:%s" % host) server.serve_forever() except Exception as e: Log("createServer error, e:", e) raise Exception("stop") def main(): # 开启一个线程 try: _thread.start_new_thread(createServer, (("0.0.0.0", Port), )) # VPS服务器上测试 except Exception as e: Log("错误信息:", e) raise Exception("stop") if exchange.GetName().find("Futures") != -1: exchange.SetContractType(ContractType) Log("账户资产信息:", _C(exchange.GetAccount)) while True: if exchange.GetName() == "Futures_CTP": if exchange.IO("status"): LogStatus(_D(), "CTP连接") else: LogStatus(_D(), "CTP未连接") else: LogStatus(_D()) Sleep(2000)
Eth8888/upload/asset/2457669d9c32568732cb7.jpg Buka hardisk menunjukkan kesalahan ini, di mana yang salah
Eth8888/upload/asset/2457669d9c32568732cb7.jpg Buka hardisk menunjukkan kesalahan ini, di mana yang salah
Hwang Hyeon tentang pedangGuru: Bisakah saya mengirim pesan?
Hwang Hyeon tentang pedang2021/11/21 11:53:33 CMD 199866 buy=0.1, administrator menerima pesan ini, dan tidak ada tindakan di robot
superonJika Anda tidak mengerti apa yang saya katakan, tolong tulis ulang dan hubungi saya.
Yang Fu 1Apakah Anda bisa menuliskan contoh daftar sinyal TV lengkap, bagaimana mendapatkan informasi di dalam body; melihat orang-orang dalam kabut.
DietQuantGuru, bagaimana cara mengubahnya agar bisa menambah dua mata uang di satu tablet?
Mimpi adalah angka delapan digit.Ya Allah, bisakah kamu membuat sebuah OKv5 simulasi?
SssxxxdSilahkan tanya, apakah versi 3.7 adalah versi admin yang akan diimplementasikan? bagaimana cara memperbarui admin? saya sudah mencoba berkali-kali.
2021-08-11 11:08:55 Kesalahan Traceback (most recent call last): File "
QQ3390214355Saya tidak mengerti apa yang saya baca malam itu, apakah saya bisa menulis ulang, bagaimana cara menghubungi saya?
Chen ShenzhenHalo, guru, bagaimana cara menulis alamat webhook untuk memberi tahu arah transaksi langsung di TV?
LanganBaiklah, terima kasih guru, saya akan mencobanya!
LanganGuru, halo, bisakah Anda memberikan beberapa detail tentang kode kontrak, programming yang benar-benar luar biasa, terima kasih!
Penemu Kuantitas - Mimpi KecilDokumen API FMZ memiliki fungsi OKEX Switch Analog Disks di bagian akhir.
N95Bagaimana cara mengaktifkan analog untuk menerima sinyal TV?
Penemu Kuantitas - Mimpi KecilKesalahan ini terjadi karena python tidak memiliki modul yang terkait dengan ThreadingHTTPServer
Kunci986Apakah Anda sudah menyelesaikan masalah ini?
Eth8888Jadi, jelaskan.
Penemu Kuantitas - Mimpi KecilTidak disarankan untuk membuat permintaan layanan untuk memata-matai TV dengan cara ini, gunakan API ekstensi FMZ, ada artikel di pustaka tersebut.
Penemu Kuantitas - Mimpi KecilStrategi ini digunakan sebagai contoh komoditas berjangka, jika Anda ingin menjalankan mata uang digital, Anda harus mengatur kode kontrak.
Penemu Kuantitas - Mimpi KecilSalah satu contoh dari taktik ini adalah robot taktik yang membangun layanan untuk mendengarkan permintaan sinyal dari TV. `` # Uji POST Permintaan Informasi Badan data = self.rfile.read ((200) # menentukan panjang pembacaan Log (("data:", data) # Mencetak data dari permintaan POST, yang dapat dilakukan oleh robot berdasarkan data dalam permintaan `` Di sini adalah informasi body untuk menangani permintaan yang dikirim oleh TV.
Penemu Kuantitas - Mimpi Kecil"Saya tidak tahu apa yang akan terjadi", kata dia.
Penemu Kuantitas - Mimpi KecilUntuk mengkonfigurasi OKEX analog disk di FMZ dengan API KEY, kemudian tambahkan kata ``exchange.IO ("simulate", true) ``switch dalam kode.
Penemu Kuantitas - Mimpi KecilSaya tidak mengerti, kira-kira apa yang salah saat digunakan, periksa saja.
Chen ShenzhenTerima kasih, jika alamat webhook saya menulis arah transaksi adalah membeli, tapi tips tv strategi alarm adalah menjual?
Penemu Kuantitas - Mimpi Kecilhttps://www.fmz.com/bbs-topic/5969 artikel dan strategi memiliki contoh.
Penemu Kuantitas - Mimpi Kecilhttps://www.fmz.com/api#exchange.setcontracttype... ada dalam deskripsi fungsi, lihat di bawah ini.
PY008Apa itu kode kontrak?
Penemu Kuantitas - Mimpi KecilTidak sopan.
Penemu Kuantitas - Mimpi KecilJika itu adalah kontrak untuk sebuah bursa, tulis alamat webhook di TV: "Saya tidak akan membiarkan mereka pergi", katanya. `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 `` Saya tidak tahu apa yang akan terjadi. `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=cover_long&amount=1 `` Ingatlah untuk mengatur kode kontrak pada parameter kebijakan.