حال ہی میں زیادہ سے زیادہ ٹریڈنگ ویو صارفین نے ٹریڈنگ ویو چارٹ سگنل کو ایف ایم زیڈ پلیٹ فارم سے منسلک کیا ہے (FMZ.COMایف ایم زیڈ پر روبوٹ کی حکمت عملی کو چارٹ سگنل کے مطابق ٹرانزیکشن کو انجام دینے دیں ، جس سے بہت سارے کوڈ لکھنے اور ڈیزائن کے کام کی بچت ہوتی ہے۔ براہ راست ، اشارے کو پروگراماتی اور خودکار تجارت کے لئے استعمال کیا جاسکتا ہے ، جو بہت سارے پروگراماتی اور مقداری تجارتی ترقی کی راہ میں حائل رکاوٹوں کو کم کرتا ہے۔TradingViewWebHook
.
پچھلا حل:https://www.fmz.com/digest-topic/5533.
پچھلے منصوبے کا مقصد روبوٹ کو ہدایات بھیجنے کے لئے ایف ایم زیڈ پلیٹ فارم کے اے پی آئی انٹرفیس کو بڑھانا تھا۔ آج ، آئیے ایک اور حل پر ایک نظر ڈالیں۔ ٹریڈنگ ویو کی الارم ویب ہک کی درخواست براہ راست ایف ایم زیڈ پلیٹ فارم روبوٹ کو بھیجی جائے ، تاکہ وہ براہ راست ہدایات بھیج سکے اور روبوٹ کے لین دین کا آرڈر دے سکے۔
یہ حکمت عملی پائیتھون میں لکھی گئی ہے۔ روبوٹ کو تخلیق کرنے اور اس حکمت عملی کا استعمال شروع کرنے کے بعد ، روبوٹ ایک تھریڈ بنائے گا ، جو سیٹ پورٹ کی نگرانی کے لئے ایک سروس شروع کرے گا۔ بیرونی درخواستوں اور پروسیسنگ کا انتظار کر رہا ہے۔ جب میں نے اس کی جانچ کی ، تو اس کا تجربہ سرور پر میزبان نے کیا ، اور جس ڈیوائس میں میزبان واقع ہے اسے باہر سے قابل رسائی ہونا چاہئے۔ جب روبوٹ ٹرانزیکشن کو انجام دیتا ہے تو ، وہ مارکیٹ آرڈر انٹرفیس کا استعمال کرتا ہے۔ اس کے علاوہ ، اس حکمت عملی کو بھی تبدیل کیا جاسکتا ہے تاکہ مارکیٹ آرڈر انٹرفیس کو نافذ کیا جاسکے۔limit order
آرڈر کی منطق۔ آسانی سے سمجھنے اور آسان بنانے کے لئے ، یہاں مارکیٹ آرڈر کا استعمال کیا جاتا ہے ، لہذا تبادلہ کو مارکیٹ آرڈر کی حمایت کرنا ہوگی۔
'''
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
چونکہ ٹریڈنگ ویو بھیجتا ہے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
مواصلات کا استعمال کیا جانا چاہئے.