हाल ही में अधिक से अधिक ट्रेडिंगवीव उपयोगकर्ताओं ने ट्रेडिंगवीव चार्ट सिग्नल को एफएमजेड प्लेटफॉर्म से जोड़ा है (FMZ.COM) और एफएमजेड पर रोबोट रणनीति को चार्ट सिग्नल के अनुसार लेनदेन निष्पादित करने दें, जो बहुत सारे कोड लेखन और डिजाइन कार्य को बचाता है। सीधे, संकेतकों का उपयोग प्रोग्रामेटिक और स्वचालित ट्रेडिंग के लिए किया जा सकता है, जो कई प्रोग्रामेटिक और मात्रात्मक ट्रेडिंग विकास के लिए बाधाओं को कम करता है।TradingViewWebHook
.
पिछला समाधान:https://www.fmz.com/digest-topic/5533.
पिछली योजना रोबोट को निर्देश भेजने के लिए एफएमजेड प्लेटफॉर्म के एपीआई इंटरफेस का विस्तार करना था। आज, आइए एक और समाधान पर एक नज़र डालें। ट्रेडिंगव्यू के अलार्म वेबहूक अनुरोध को सीधे एफएमजेड प्लेटफॉर्म रोबोट को भेजा जाए, ताकि यह सीधे निर्देश भेज सके और रोबोट लेनदेन का आदेश दे सके।
रणनीति पायथन में लिखी गई है. रोबोट के बनाए जाने और इस रणनीति का उपयोग शुरू करने के बाद, रोबोट एक धागा बनाएगा, जो सेट पोर्ट की निगरानी के लिए एक सेवा शुरू करेगा. बाहरी अनुरोधों और प्रसंस्करण की प्रतीक्षा कर रहा है. जब मैंने इसका परीक्षण किया, तो इसे सर्वर पर होस्ट द्वारा परीक्षण किया गया था, और जिस डिवाइस पर होस्ट स्थित है, उसे बाहर से सुलभ होना चाहिए। जब रोबोट लेनदेन निष्पादित करता है, तो यह बाजार आदेश इंटरफ़ेस का उपयोग करता है। इसके अलावा, इस रणनीति को भी संशोधित किया जा सकता हैlimit order
order logic. आसानी से समझने और सुव्यवस्थित करने के लिए, बाजार के आदेश का उपयोग किया जाता है, इसलिए एक्सचेंज को बाजार के आदेश का समर्थन करना चाहिए।
'''
Request format: http://x.x.x.x:xxxx/data?access_key=xxx&secret_key=yyy&type=buy&amount=0.001
Strategy robot parameters:
- Type: Encrypted string, AccessKey, SecretKey, you can use the low-privileged API KEY of the FMZ platform, or you can generate the KEY yourself.
- Type: string, contract ID, ContractType
- Type: numeric value, port number, Port
'''
import _thread
import json
from http.server import HTTPServer, 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_POST(self):
try:
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
dictParam = url2Dict(self.path)
# check
if len(dictParam) == 4 and dictParam["access_key"] == AccessKey and dictParam["secret_key"] == SecretKey:
del dictParam["access_key"]
del dictParam["secret_key"]
Log("Request received", "parameter:", 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 "No futures contract set"
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")
exchange.Buy(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "short":
exchange.SetDirection("sell")
exchange.Sell(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "cover_long":
exchange.SetDirection("closebuy")
exchange.Sell(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
elif not isSpot and dictParam["type"] == "cover_short":
exchange.SetDirection("closesell")
exchange.Buy(-1, float(dictParam["amount"]))
Log("Holding Position:", exchange.GetPosition())
# Write data response
self.wfile.write(json.dumps({"state": "ok"}).encode())
except Exception as e:
Log("Provider do_POST error, e:", e)
def createServer(host):
try:
server = HTTPServer(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():
# Start a thread
try:
_thread.start_new_thread(createServer, (("0.0.0.0", Port), )) # Test on VPS server
except Exception as e:
Log("Error message:", e)
raise Exception("stop")
Log("Account asset information:", _C(exchange.GetAccount))
while True:
LogStatus(_D())
Sleep(2000)
ट्रेडिंगव्यू के वेबहूक अलार्म अनुरोध
अलार्म अनुरोध सेटिंग हैः
http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1
चूंकि TradingView भेजता हैPOST
अनुरोध, निगरानी सेवा को निगरानी करनी चाहिएPOST
अनुरोधों, और TradingView केवल पोर्ट 80 के लिए अनुमति देता हैhttp
protocol.
xxx.xxx.xxx.xxx
है जहां रोबोट स्थित है मेजबान के डिवाइस आईपी पता है. अपने स्वयं के डिवाइस का विशिष्ट आईपी पता भरें, आप को पता होना चाहिए कि यह बाहरी नेटवर्क से सुलभ होना चाहिए.
..access_key
औरsecret_key
स्वयं उत्पन्न हो सकते हैं, जब तक किaccess_key
औरsecret_key
मेंWebHook
अलार्म अनुरोध वही हैं जो रोबोट पैरामीटर पर कॉन्फ़िगर किए गए हैं।
Type
, ट्रेडिंग दिशा, खरीद या बिक्री, उद्घाटन या समापन, ध्यान दें कि स्पॉट और वायदा अलग हैं। यदि यह वायदा है, तो ध्यान दें कि वायदा अनुबंध कोड रोबोट मापदंडों पर सेट किया जाना चाहिए, और विनिमय ऑब्जेक्ट विनिमय वायदा होना चाहिए।
amount
, लेनदेन की संख्या।
प्रयोगwexApp
वास्तविक बाजार परीक्षण का अनुकरण करने के लिए।
पूर्ण रणनीतिक पता:https://www.fmz.com/strategy/221850
..access_key
औरsecret_key
योजना में केवल पहचान के लिए हैं, और उपयोग के लिए कोई सुरक्षा नहीं हैhttp
. यह समाधान केवल एक विचार और एक परिचय है। व्यावहारिक अनुप्रयोगों में, सुरक्षा विचार को जोड़ा जाना चाहिए औरhttps
संचार का उपयोग किया जाना चाहिए।