TradingViewWebHook ist eine direkt verknüpfte Strategie.

Schriftsteller:Kleine Träume, Datum: 2020-08-03 09:58:19
Tags:

Siehe auch:https://www.fmz.com/bbs-topic/5969

Da die HTTPServer selbst einige Probleme haben, sollten Sie ThreadingHTTPServer als Alternative in Betracht ziehen. Nachfolgend:https://docs.python.org/3.7/library/http.server.htmlSie benötigen Python 3.7.

HTTPS-Server-Problematik: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)

Mehr

Eth8888/upload/asset/2457669d9c32568732cb7.jpg Die Festplatte wird angezeigt, wo der Fehler liegt.

Eth8888/upload/asset/2457669d9c32568732cb7.jpg Die Festplatte wird angezeigt, wo der Fehler liegt.

Die Schwerter von Hua HasanLehrer: Kann ich eine Wechselsendung hinzufügen?

Die Schwerter von Hua Hasan2021/11/21 11:53:33 CMD 199866 buy=0.1, der Administrator hat diese Nachricht erhalten, aber der Roboter hat nichts getan

ÜbergewichtIch habe es heute Abend gelesen und habe es nicht verstanden. Kannst du es übersetzen?

Das ist der Schlüssel.Kannst du ein Beispiel schreiben, wie man ein komplettes Fernsehsignal anfordert, um Informationen aus dem Körper zu bekommen?

DietQuantProfessor, wie kann ich das ändern, um die Doppelwährung auf der Festplatte zu erhöhen?

Der Traum ist achtstellig.Kannst du mir einen OKv5 Simulator bringen? Ein kleiner Weißer, der nicht weiß, wie man es macht, und der sich nicht traut, mit dem echten zu sprechen?

Schritt für SchrittIch möchte Sie fragen, ob Version 3.7 die Version des Administrators ist, der den Administrator bereitstellt? 2021-08-11 11:08:55 Fehler Traceback (most recent call last): Datei "", line 999, in __init_ctx__ Datei "", line 4, in ImportError: kann nicht den Namen "ThreadingHTTPServer" importieren 2021-08-11 11:08:55 Informationen erfolgreich geladen 2021-08-11 11:08:55 Informationen Der Host, den Sie verwenden, ist die Python-Version 3.5 der Python-Kompilierung.

QQ3390214355Ich habe es heute Abend gelesen und habe es nicht verstanden. Kannst du es übersetzen?

Ich bin ein junger Mann.Herr Lehrer, wie schreibt man die Webhook-Adresse für die Strategie, um die Transaktionsrichtung direkt auf dem Fernseher zu melden?

LangezeitGut, danke, Lehrerin, ich werde es versuchen!

LangezeitHerr Lehrer, können Sie mir bitte etwas ausführlicher über den Vertragscode erzählen, denn der Programmierer ist wirklich toll, danke!

Kleine TräumeDie FMZ-API-Dokumentation ist zuletzt mit der Funktion für die OKEX-Schaltfläche versehen.

wbe3- Kleine FrischflaschenWie kann ich die Analogplatte wechseln, wenn ich ein Fernsehsignal empfange?

Kleine TräumeDer Fehler liegt daran, dass Python keine entsprechenden ThreadingHTTPServer-Module hat

Schlüssel 986Haben Sie das Problem gelöst?

Eth8888Das ist klar.

Kleine TräumeEs wird nicht empfohlen, einen solchen Service für das Abhören von Fernsehsendungen zu erstellen.

Kleine TräumeDiese Strategie ist ein Beispiel für die Verwendung von Commodity-Futures, bei denen man einen Vertragskode einstellen muss, wenn man eine digitale Währung ausführen möchte.

Kleine TräumeEin Beispiel für diese Strategie ist, dass ein Strategie-Roboter einen Dienst erstellt, der auf Anfragen von Signalen aus dem Fernseher abhört. Ich weiß. # Test POST-Anfrage für Körperinformationen Data = self.rfile.read ((200) # Geben Sie die Leselänge an Log (("data:", data) # Druckt die Daten der POST-Anfrage aus, die dem Roboter entsprechend der Daten in der Anfrage angezeigt werden können Ich weiß. Der Code enthält eine Anmerkung, hier ist die Body-Nachricht, die für die Bearbeitung von Anfragen aus dem Fernseher verwendet wird.

Kleine TräumeSie haben ihre Strategie entsprechend ihren Bedürfnissen geändert.

Kleine TräumeDie API KEY für die Konfiguration der OKEX-Analogdiskette auf FMZ wird dann in den Code mit einem Ausdruck ``exchange.IO ("simulate", true) `` exchanged hinzugefügt.

Kleine TräumeIch weiß nicht, ob ich etwas falsch gemacht habe, wenn ich es benutzt habe.

Ich bin ein junger Mann.Danke, wenn meine Webhook-Adresse eine Kauf-Transaktion anzeigt, aber die TV-Strategie-Alarm-Tipp ist, was zu verkaufen?

Kleine TräumeEin Beispiel dafür finden Sie unter https://www.fmz.com/bbs-topic/5969 Artikel und Strategien.

Kleine TräumeDie Funktionsbeschreibung ist unter http://www.fmz.com/api#exchange.setcontracttype... zu finden.

PY008Was ist ein Code-Vertrag?

Kleine TräumeDas ist unhöflich.

Kleine TräumeWenn es sich um einen Vertrag mit einer Börse handelt, schreibt man die Webhook-Adresse auf dem Fernseher: Ein weiterer Vertrag: Ich weiß nicht. http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 Ich weiß nicht. Ein Vertrag ist einfach: Ich weiß nicht. Sie können auch die Daten von anderen Benutzern verwenden, um die Daten zu erfassen. Ich weiß nicht. Denken Sie daran, dass Sie in den Parametern für die Strategie den Code für den Vertrag setzen.