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)
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 "
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!
Los inventores cuantifican - sueños pequeñosLa documentación de la API de FMZ contiene una función para cambiar el disco analógico de OKEX.
N95¿Cómo cambiar el disco analógico para recibir la señal de televisión?
Los inventores cuantifican - sueños pequeñosEl 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.
Los inventores cuantifican - sueños pequeñosNo 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.
Los inventores cuantifican - sueños pequeñosEsta estrategia se usa como ejemplo de futuros de productos, si se necesita establecer un código de contrato para ejecutar una moneda digital.
Los inventores cuantifican - sueños pequeñosUn 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.
Los inventores cuantifican - sueños pequeñosLos bloggers de Twitter también han cambiado sus estrategias de acuerdo a sus necesidades.
Los inventores cuantifican - sueños pequeñosEn FMZ, configure la API KEY del disco OKEX, y luego agregue una palabra ``exchange en el código.
Los inventores cuantifican - sueños pequeñosNo 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?
Los inventores cuantifican - sueños pequeñosEn https://www.fmz.com/bbs-topic/5969 hay ejemplos en artículos y estrategias.
Los inventores cuantifican - sueños pequeñoshttps://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?
Los inventores cuantifican - sueños pequeñosNo es muy amable.
Los inventores cuantifican - sueños pequeñosSi 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.