Tài nguyên đang được tải lên... tải...

TradingViewWebHook chính sách liên kết trực tiếp

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Ngày: 2020-08-03 09:58:19
Tags:

Bài viết liên quan:https://www.fmz.com/bbs-topic/5969

Vì HTTPServer có một số lỗ hổng, hãy xem xét sử dụng ThreadingHTTPServer thay thế. Dữ liệu tham khảo:https://docs.python.org/3.7/library/http.server.htmlBạn cần phiên bản Python 3.7.

Thông tin về 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)

Thêm nữa

eth8888/upload/asset/2457669d9c32568732cb7.jpg mở ổ đĩa thực báo lỗi này, sai ở đâu

eth8888/upload/asset/2457669d9c32568732cb7.jpg mở ổ đĩa thực báo lỗi này, sai ở đâu

Hồ Sơn nói về thanh kiếmGiáo viên: Tôi có thể nhắn tin không?

Hồ Sơn nói về thanh kiếm2021/11/21 11:53:33 CMD 199866 buy=0.1, Trình quản trị đã nhận được thông báo này và không có bất kỳ hoạt động nào trong robot

superonTôi đã xem một đêm và không hiểu, có thể viết lại không?

Phong trào 1Bạn có thể viết một ví dụ về một tín hiệu truyền hình hoàn chỉnh, làm thế nào để có được thông tin trong cơ thể; người xem trong đám mây sương mù

DietQuantGiáo sư, làm thế nào để thay đổi để tăng đồng tiền kép trên đĩa đơn?

Giấc mơ có giá trị 8 chữ sốChúa ơi, bạn có thể đưa ra một đĩa OKv5 giả mạo không?

ssxxxdBạn có thể hỏi tôi một câu hỏi, phiên bản 3.7 là phiên bản của người quản lý triển khai không? 2021-08-11 11:08:55 lỗi 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 Thông tin Lưu trữ giao dịch hàng hóa tương lai thành công 2021-08-11 11:08:55 Thông tin Bạn đang sử dụng trình quản lý Python biên dịch môi trường Python phiên bản 3.5.

qq3390214355Bạn có thể viết lại, làm thế nào để liên lạc với tôi?

Trần NhanhXin chào, các giáo viên, các bạn có thể viết địa chỉ webhook của bạn như thế nào để báo động trực tiếp về giao dịch trên TV?

lanbnĐược rồi, cảm ơn giáo viên, tôi sẽ thử!

lanbnBạn có thể viết chi tiết về một số mã của hợp đồng không, lập trình viên nhỏ thật sự không thể bỏ qua, cảm ơn bạn!

Những nhà phát minh định lượng - những giấc mơ nhỏTài liệu API FMZ cuối cùng có chức năng chuyển đổi đĩa OKEX.

N95Tôi đã từng được nhắc đến rằng môi trường không phù hợp.

Những nhà phát minh định lượng - những giấc mơ nhỏLỗi xuất hiện bởi vì python không có module liên quan ThreadingHTTPServer

key986Bạn đã giải quyết vấn đề này chưa?

eth8888Tôi đã làm rõ điều đó.

Những nhà phát minh định lượng - những giấc mơ nhỏKhông nên tạo yêu cầu nghe lén TV như vậy, hãy sử dụng API mở rộng của FMZ, có bài viết trong thư viện.

Những nhà phát minh định lượng - những giấc mơ nhỏChiến lược này được sử dụng như một ví dụ về tương lai hàng hóa, nếu bạn cần thiết lập mã hợp đồng để chạy tiền kỹ thuật số. Thay đổi chiến lược.

Những nhà phát minh định lượng - những giấc mơ nhỏMột ví dụ điển hình của chiến thuật này là các robot chiến thuật đã xây dựng một dịch vụ để nghe lén các yêu cầu tín hiệu từ TV. `` # Kiểm tra POST yêu cầu thông tin Body data = self.rfile.read ((200) # chỉ định độ dài đọc Log (("data:", data) # In dữ liệu của yêu cầu POST, có thể thực hiện các hoạt động tương ứng dựa trên dữ liệu trong yêu cầu `` Trong mã đã có lời chú thích, đây là thông tin cơ thể để xử lý yêu cầu từ TV.

Những nhà phát minh định lượng - những giấc mơ nhỏNhững người tham gia vào cuộc họp này đã được mời đến tham gia các cuộc họp của các thành viên khác.

Những nhà phát minh định lượng - những giấc mơ nhỏTrong FMZ, cấu hình OKEX Analog KEY bằng API KEY, sau đó thêm vào mã một từ ``exchange.IO (("simulate", true) ``) chuyển đổi được thực hiện.

Những nhà phát minh định lượng - những giấc mơ nhỏTôi không hiểu, tôi đoán là tôi đã làm sai ở đâu, hãy kiểm tra nhé.

Trần NhanhCảm ơn, nếu địa chỉ webhook của tôi viết hướng giao dịch là mua, nhưng lời khuyên của báo động chiến lược tv là bán?

Những nhà phát minh định lượng - những giấc mơ nhỏCác bài viết và chiến lược trên https://www.fmz.com/bbs-topic/5969 có ví dụ.

Những nhà phát minh định lượng - những giấc mơ nhỏBạn có thể xem mô tả của chức năng trên https://www.fmz.com/api#exchange.setcontracttype...

PY008Mã hợp đồng là gì?

Những nhà phát minh định lượng - những giấc mơ nhỏKhông lịch sự.

Những nhà phát minh định lượng - những giấc mơ nhỏNếu là một hợp đồng giao dịch, hãy viết địa chỉ webhook trên TV: Một hợp đồng khác: `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 `` Một hợp đồng đơn giản: `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=cover_long&amount=1 `` Hãy nhớ đặt mã hợp đồng trên các tham số chính sách.