ट्रेडिंग व्यू वेबहुक सीधी लिंक नीति

लेखक:छोटे सपने, दिनांक: 2020-08-03 09:58:19
टैगः

संबंधित लेखःhttps://www.fmz.com/bbs-topic/5969

क्योंकि HTTPServer में कुछ खामियां हैं, इसके बजाय ThreadingHTTPServer का उपयोग करने पर विचार करें। संदर्भ के लिएःhttps://docs.python.org/3.7/library/http.server.htmlPython 3.7 संस्करण की आवश्यकता है।

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)

अधिक

eth8888/upload/asset/2457669d9c32568732cb7.jpg रीयल डिस्क खोलें इस त्रुटि को इंगित करता है, जहां गलत है

eth8888/upload/asset/2457669d9c32568732cb7.jpg रीयल डिस्क खोलें इस त्रुटि को इंगित करता है, जहां गलत है

ह्वा हान के बारे मेंटीचर: क्या मैं एक वी-मेल भेज सकता हूँ?

ह्वा हान के बारे में2021/11/21 11:53:33 CMD 199866 buy=0.1, व्यवस्थापक ने यह संदेश प्राप्त किया है और रोबोट में कोई गतिविधि नहीं है

सुपरऑनV: शायद हाँ, शायद हाँ, शायद हाँ, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं, शायद नहीं।

फ्यूजी 1क्या आप एक पूर्ण टीवी सिग्नल का उदाहरण लिख सकते हैं, कैसे शरीर में जानकारी प्राप्त करें?

DietQuantमास्टर, कैसे बदलना है ताकि एक ही वास्तविक डिस्क में दोहरे मुद्राओं को जोड़ा जा सके?

सपनों की कीमत आठ अंकों में हैहे भगवान, क्या आप एक ओकेवी 5 सिम्युलेटर निकाल सकते हैं? एक छोटा सा सफेद, कैसे करना है पता नहीं है, असली डिस्क के बारे में बात करने के लिए हिम्मत नहीं करता?

एसएसएक्सएक्सडीएक सवाल है, कृपया, संस्करण 3.7 क्या यह व्यवस्थापक का संस्करण है? मैं इसे कैसे अपडेट कर सकता हूं? मैंने कई बार सुझाव देने की कोशिश की है। 2021-08-11 11:08:55 त्रुटि Traceback (most recent call last): फ़ाइल "", line 999, in __init_ctx__ फ़ाइल "", line 4, in ImportError: cannot import name 'ThreadingHTTPServer' 2021-08-11 11:08:55 जानकारी कमोडिटी फ्यूचर्स ट्रेडिंग श्रेणी सूची सफलतापूर्वक लोड की गई 2021-08-11 11:08:55 जानकारी आपके द्वारा उपयोग किए जा रहे पालतू python संकलन वातावरण का python संस्करण 3.5 है।

qq3390214355एक रात में देखा और समझ में नहीं आया, क्या आप इसे लिख सकते हैं, कैसे संपर्क करें?

चेन्नईहेलो, टी.वी. पर सीधे सूचना देने के लिए रणनीति वेबहूक पता कैसे लिखें?

लानबअच्छा, धन्यवाद शिक्षक, मैं परीक्षण करने जा रहा हूँ!

लानबशिक्षक, नमस्ते, क्या आप अनुबंध में कुछ कोड लिखने के बारे में विस्तार से बता सकते हैं, प्रोग्रामिंग वास्तव में बहुत अच्छा है, धन्यवाद!

छोटे सपनेFMZ एपीआई दस्तावेज़ में अंत में ओकेएक्स स्विचिंग एनालॉग डिस्क का कार्य है।

wbe3- छोटे फ्राइज़टीवी सिग्नल प्राप्त करने की रणनीति, कैसे एनालॉग डिस्क स्विच करने के लिए?

छोटे सपनेत्रुटि का कारण यह है कि python में कोई संबंधित मॉड्यूल नहीं है

कुंजी986क्या आपने इस समस्या का समाधान किया है?

eth8888यह स्पष्ट है।

छोटे सपनेइस तरह के अनुरोधों के लिए एक सेवा बनाने की सिफारिश नहीं की जाती है, एफएमजेड के विस्तार एपीआई का उपयोग करें।

छोटे सपनेयह रणनीति कमोडिटी फ्यूचर्स के उदाहरण के रूप में है, यदि डिजिटल मुद्रा को चलाने के लिए अनुबंध कोड सेट करने की आवश्यकता होती है।

छोटे सपनेइस रणनीति का एक सीधा उदाहरण यह है कि एक रणनीति रोबोट ने एक सेवा बनाई है जो टीवी से संकेत अनुरोधों को सुनने के लिए है। `` # परीक्षण पोस्ट अनुरोध बॉडी जानकारी data = self.rfile.read ((200) # पढ़ने की लंबाई निर्दिष्ट करता है Log (("data:", data) # POST अनुरोध के डेटा को प्रिंट करता है, और अनुरोध में दिए गए डेटा के आधार पर रोबोट को संबंधित कार्य करने के लिए कहा जा सकता है `` कोड में पहले से ही एक टिप्पणी है, यह टीवी के अनुरोधों को संभालने के लिए शरीर की जानकारी है। कृपया कोड देखें।

छोटे सपनेइस तरह के लोगों के लिए, यह एक बहुत ही महत्वपूर्ण कदम है।

छोटे सपनेएफएमजेड पर ओकेएक्स एनालॉग डिस्क को कॉन्फ़िगर करने के लिए एपीआई की, और फिर कोड में एक शब्द जोड़ें ``exchange.IO (("simulate", true) `` स्विच किया जाता है.

छोटे सपनेयह समझ में नहीं आया, यह अनुमान लगाया गया है कि यह किस समय गलत था, जांचें।

चेन्नईधन्यवाद, अगर मेरे वेबहूक पते पर लेनदेन की दिशा खरीदारी है, लेकिन टीवी रणनीति अलार्म के संकेत बिक्री के बारे में है?

छोटे सपनेhttps://www.fmz.com/bbs-topic/5969 लेख और रणनीतियों में उदाहरण हैं।

छोटे सपनेhttps://www.fmz.com/api#exchange.setcontracttype... फ़ंक्शन विवरण में है, आप देख सकते हैं।

PY008कॉन्ट्रैक्ट कोड क्या है?

छोटे सपनेअशिष्टता।

छोटे सपनेयदि आप किसी एक्सचेंज के लिए अनुबंध कर रहे हैं, तो टीवी पर वेबहूक का पता लिखेंः एक और अनुबंधः `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=long&amount=1 `` एक और अनुबंधः `` http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=cover_long&amount=1 `` याद रखें, नीति पैरामीटर पर, अनुबंध कोड सेट करें।