Artikel berkaitan:https://www.fmz.com/bbs-topic/5969
Oleh kerana HTTPServer sendiri mempunyai beberapa kelemahan, pertimbangkan untuk menggunakan ThreadingHTTPServer sebagai pengganti. Sumber:https://docs.python.org/3.7/library/http.server.htmlIa memerlukan versi Python 3.7.
Maklumat mengenai 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 cakera riil menunjukkan kesilapan ini, di mana ia berlaku
eth8888/upload/asset/2457669d9c32568732cb7.jpg Buka cakera riil menunjukkan kesilapan ini, di mana ia berlaku
Huasan Mengenai PedangGuru: Bolehkah saya tambah mesej?
Huasan Mengenai Pedang2021/11/21 11:53:33 CMD 199866 buy=0.1, pentadbir menerima mesej ini dan tiada tindakan dalam bot
superonJika anda tidak faham, bolehkah anda menulis semula? Hubungi V: maybeyeah
Yang Mulia 1.Bolehkah anda menulis contoh senarai isyarat tv yang lengkap, bagaimana untuk mendapatkan maklumat di dalam badan; melihat orang dalam awan.
DietQuantGuru, bagaimana kita boleh mengubahnya untuk menambah dua mata wang pada satu cakera sebenar?
Mimpi bernilai lapan digitTuhan, bolehkah anda membuat OKv5 simulasi?
SssxxxdSaya ingin bertanya kepada anda, adakah versi 3.7 adalah versi pentadbir yang digunakan? bagaimana untuk mengemas kini?
2021-08-11 11:08:55 Kesilapan Traceback (most recent call last): File "
qq3390214355Saya tidak faham, bolehkah saya menulis semula, bagaimana saya boleh menghubungi anda?
Chen ShenzhenHalo, cikgu, bagaimana alamat webhook untuk memberi amaran arah perdagangan secara langsung di TV?
LanganBaiklah, terima kasih cikgu, saya akan cuba!
LanganCikgu, boleh tolong jelaskan sedikit tentang kod kontrak yang ditulis, programming sangat hebat, terima kasih!
Pencipta Kuantiti - Impian KecilDokumen API FMZ mempunyai fungsi untuk menukar cakera analog OKEX pada akhir.
N95Bagaimana untuk menukar cakera analog untuk menerima isyarat TV?
Pencipta Kuantiti - Impian KecilKesilapan ini berlaku kerana Python tidak mempunyai modul yang berkaitan dengan ThreadingHTTPServer
kunci986Adakah anda menyelesaikan masalah ini?
eth8888Sudah jelas.
Pencipta Kuantiti - Impian KecilTidak disyorkan untuk membuat permintaan perkhidmatan untuk memantau TV dengan cara ini, gunakan API sambungan FMZ, terdapat artikel di perpustakaan.
Pencipta Kuantiti - Impian KecilStrategi ini digunakan sebagai contoh masa hadapan komoditi, jika anda perlu menetapkan kod kontrak untuk menjalankan mata wang digital.
Pencipta Kuantiti - Impian KecilContoh taktikal ini adalah secara langsung, iaitu robot taktikal membina perkhidmatan untuk mendengar permintaan isyarat dari TV. `` # Uji POST Permintaan Maklumat Badan data = self.rfile.read ((200) # menentukan panjang bacaan Log (("data:", data) # Mencetak data permintaan POST, yang boleh dibuat berdasarkan data dalam permintaan dan kemudian meminta bot untuk menjalankan operasi yang sesuai `` Dalam kod itu sudah ada nota, di sini adalah maklumat badan untuk memproses permintaan yang dihantar TV.
Pencipta Kuantiti - Impian KecilMereka boleh mengubah strategi mereka mengikut keperluan mereka sendiri.
Pencipta Kuantiti - Impian KecilKEY API untuk mengkonfigurasi cakera analog OKEX di FMZ, dan kemudian tambah kata ``exchange.IO (simulate, true) `` pertukaran dalam kod dan selesai.
Pencipta Kuantiti - Impian KecilSaya tidak faham, kira-kira di mana saya melakukan kesalahan semasa menggunakannya, periksa.
Chen ShenzhenTerima kasih, jika alamat webhook saya menulis arah dagangan adalah membeli, tetapi TV Strategi Alert mencadangkan untuk menjual?
Pencipta Kuantiti - Impian Kecilhttps://www.fmz.com/bbs-topic/5969 Artikel dan strategi mempunyai contoh.
Pencipta Kuantiti - Impian Kecilhttps://www.fmz.com/api#exchange.setcontracttype... terdapat dalam penerangan fungsi, boleh lihat.
PY008Apakah kod kontrak?
Pencipta Kuantiti - Impian KecilTidak sopan.
Pencipta Kuantiti - Impian KecilJika ia adalah kontrak untuk sebuah bursa, tulis alamat webhook di TV: Buat satu lagi kontrak: `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 `` "Saya tidak mahu menghalang mereka daripada melakukan apa yang mereka mahu", katanya. `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=cover_long&amount=1 `` Ingat, pada parameter dasar, letakkan kod kontrak.