Sumber daya yang dimuat... Pemuatan...

TradingViewWebHook Kebijakan Sambungan Langsung

Penulis:Penemu Kuantitas - Mimpi Kecil, Tanggal: 2020-08-03 09:58:19
Tag:

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)

Lebih banyak

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 "", line 999, in __init_ctx__ File "", line 4, in ImportError: cannot import name 'ThreadingHTTPServer' 2021-08-11 11:08:55 Informasi Perpustakaan perdagangan komoditas berjangka berhasil dimuat 2021-08-11 11:08:55 Informasi Anda menggunakan host Python versi 3.5 dari Python.

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.