TradingViewWebHook Strategi Sambungan Langsung

Penulis:Mimpi kecil, Tarikh: 2020-08-03 09:58:19
Tag:

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)

Lebih lanjut

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 "", line 999, in __init_ctx__ File "", line 4, in ImportError: cannot import name 'ThreadingHTTPServer' 2021-08-11 11:08:55 Maklumat Perpustakaan Dagangan Berjangka Komoditi dimuat dengan berjaya 2021-08-11 11:08:55 Maklumat Penyelenggara Python yang anda gunakan adalah versi Python 3.5.

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!

Mimpi kecilDokumen API FMZ mempunyai fungsi untuk menukar cakera analog OKEX pada akhir.

wbe3- ketumbar kecilBagaimana untuk menukar cakera analog untuk menerima isyarat TV?

Mimpi kecilKesilapan ini berlaku kerana Python tidak mempunyai modul yang berkaitan dengan ThreadingHTTPServer

kunci986Adakah anda menyelesaikan masalah ini?

eth8888Sudah jelas.

Mimpi kecilTidak disyorkan untuk membuat permintaan perkhidmatan untuk memantau TV dengan cara ini, gunakan API sambungan FMZ, terdapat artikel di perpustakaan.

Mimpi kecilStrategi ini digunakan sebagai contoh masa hadapan komoditi, jika anda perlu menetapkan kod kontrak untuk menjalankan mata wang digital.

Mimpi 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.

Mimpi kecilMereka boleh mengubah strategi mereka mengikut keperluan mereka sendiri.

Mimpi kecilKEY API untuk mengkonfigurasi cakera analog OKEX di FMZ, dan kemudian tambah kata ``exchange.IO (simulate, true) `` pertukaran dalam kod dan selesai.

Mimpi 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?

Mimpi kecilhttps://www.fmz.com/bbs-topic/5969 Artikel dan strategi mempunyai contoh.

Mimpi kecilhttps://www.fmz.com/api#exchange.setcontracttype... terdapat dalam penerangan fungsi, boleh lihat.

PY008Apakah kod kontrak?

Mimpi kecilTidak sopan.

Mimpi 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.