La estrategia de conexión directa de TradingViewWebHook

El autor:Un sueño pequeño., Fecha: 2020-08-03 09:58:19
Las etiquetas:

Artículo relacionado:https://www.fmz.com/bbs-topic/5969

Como el servidor HTTPS tiene algunas fallas en sí mismo, considere usar el servidor ThreadingHTTPS en su lugar. Fuente de información:https://docs.python.org/3.7/library/http.server.htmlSe requiere Python 3.7.

La información sobre el problema del servidor HTTPS: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)

Más.

el número de personas/upload/asset/2457669d9c32568732cb7.jpg abre el disco real y le indica este error, ¿dónde está el error?

el número de personas/upload/asset/2457669d9c32568732cb7.jpg abre el disco real y le indica este error, ¿dónde está el error?

La espada de HuasanT: ¿Puedo añadir un mensaje?

La espada de Huasan2021/11/21 11:53:33 CMD 199866 buy=0.1, el administrador recibió este mensaje y el robot no hizo nada.

el superón¿Puedes traducirlo y ponerte en contacto con V:maybeyeah?

¿Qué es esto?¿Puedes escribir un ejemplo de una lista completa de señales de televisión, cómo obtener la información en el cuerpo?

Dieta CuánticoMaestro, ¿cómo cambiamos para que el disco real pueda tener más billetes?

Los sueños cuestan ocho cifras.Dios mío, ¿puedes sacarme un plato simulante OKv5?

¿Qué quieres decir?¿Es la versión 3.7 la versión del administrador de implementación? ¿Cómo actualizarlo? 2021-08-11 11:08:55 Error Traceback (most recent call last): File "", line 999, in __init_ctx__ File "", line 4, in ImportError: no puede importar el nombre 'ThreadingHTTPServer' 2021-08-11 11:08:55 Información Carga exitosa del catálogo de operaciones de futuros de productos 2021-08-11 11:08:55 Información El servidor que está utilizando para el entorno de compilación de python es la versión de python 3.5.

No se puede¿Puedes traducirlo, cómo puedes comunicarte con él?

¿Qué es esto?¿Cómo se escribe la dirección del webhook para alertar directamente sobre la dirección de la transacción en la televisión?

el año¡Bueno, gracias, maestro, voy a probar!

el añoMaestro, hola, ¿puedes escribir un poco más de detalle sobre el código del contrato, el programación es realmente increíble, gracias!

Un sueño pequeño.La documentación de la API de FMZ contiene una función para cambiar el disco analógico de OKEX.

wbe3- pequeñas papas fritas¿Cómo cambiar el disco analógico para recibir la señal de televisión?

Un sueño pequeño.El error se debe a que Python no tiene ningún módulo relacionado con ThreadingHTTPServer

La clave es 986.¿No has resuelto el problema?

el número de personasEso es todo.

Un sueño pequeño.No se recomienda crear un servicio de escucha de TV de esta manera, sino usar la API de extensión de FMZ, hay artículos en la biblioteca.

Un sueño pequeño.Esta estrategia se usa como ejemplo de futuros de productos, si se necesita establecer un código de contrato para ejecutar una moneda digital.

Un sueño pequeño.Un ejemplo de esta estrategia es la creación de un servicio para escuchar las solicitudes de señales de televisión. ¿Por qué no lo haces? # Prueba POST para solicitar información del cuerpo data = self.rfile.read ((200) # Especifica la longitud de la lectura Log (("data:", data) # Imprime los datos de la solicitud POST, y puede hacer que el robot realice las operaciones correspondientes según los datos de la solicitud ¿Por qué no lo haces? En el código ya hay una nota, aquí está el cuerpo de la información para procesar las solicitudes de TV.

Un sueño pequeño.Los bloggers de Twitter también han cambiado sus estrategias de acuerdo a sus necesidades.

Un sueño pequeño.En FMZ, configure la API KEY del disco OKEX, y luego agregue una palabra ``exchange en el código.

Un sueño pequeño.No entiendo, creo que fue un error en el momento de usarlo, comprueba.

¿Qué es esto?Gracias, si mi dirección de webhook dice que la dirección de la transacción es comprar, pero la advertencia de la estrategia de tv es vender?

Un sueño pequeño.En https://www.fmz.com/bbs-topic/5969 hay ejemplos en artículos y estrategias.

Un sueño pequeño.https://www.fmz.com/api#exchange.setcontracttype... está en la descripción de la función y puede consultarla.

PY008¿Qué es el código del contrato?

Un sueño pequeño.No es muy amable.

Un sueño pequeño.Si se trata de un contrato de una bolsa, escribe la dirección del webhook en la TV: ¿Qué es lo que está pasando? ¿Por qué no lo haces? En este caso, el número de acceso es el número de acceso. ¿Por qué no lo haces? En el caso de los trabajadores, el contrato es simple: ¿Por qué no lo haces? En el caso de los datos de acceso, el número de acceso es el siguiente: ¿Por qué no lo haces? Recuerde que en los parámetros de la política, se establece el código del contrato.