Baru-baru ini semakin ramai pengguna TradingView telah menyambungkan isyarat carta TradingView ke platform FMZ (FMZ.COMDalam kes ini, anda boleh menggunakan indikator untuk perdagangan programatik dan automatik, yang mengurangkan halangan untuk banyak pembangunan perdagangan programatik dan kuantitatif.TradingViewWebHook
.
Penyelesaian sebelumnya:https://www.fmz.com/digest-topic/5533.
Rancangan sebelumnya adalah untuk memperluaskan antara muka API Platform FMZ untuk menghantar arahan kepada robot. Hari ini, mari kita lihat penyelesaian lain. Biarkan permintaan WebHook penggera TradingView dihantar terus ke robot platform FMZ, supaya ia dapat menghantar arahan dan pesanan urus niaga robot secara langsung.
Strategi ini ditulis dalam Python. Selepas robot dicipta dan mula menggunakan strategi ini, robot akan membuat benang, yang akan memulakan perkhidmatan untuk memantau port set. Menunggu permintaan dan pemprosesan luaran. Apabila saya menguji, ia diuji oleh hos di pelayan, dan peranti di mana hos terletak mesti dapat diakses dari luar. Apabila robot melaksanakan transaksi, ia menggunakan antara muka pesanan pasaran. selain itu strategi ini juga boleh diubah suai untuk melaksanakanlimit order
Untuk menjadi mudah difahami dan efisien, perintah pasaran digunakan di sini, jadi pertukaran mesti menyokong perintah pasaran.
'''
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)
Permintaan penggera WebHook TradingView
Tetapan permintaan penggera adalah:
http://xxx.xxx.xxx.xxx:80/data?access_key=e3809e173e23004821a9bfb6a468e308&secret_key=45a811e0009d91ad21154e79d4074bc6&type=sell&amount=0.1
Sejak TradingView menghantarPOST
permintaan, perkhidmatan pemantauan mesti memantauPOST
permintaan, dan TradingView hanya membenarkan port 80 untukhttp
protocol.
xxx.xxx.xxx.xxx
adalah alamat IP peranti hos di mana robot terletak. isi alamat IP khusus peranti anda sendiri, anda perlu sedar bahawa ia mesti dapat diakses dari rangkaian luaran.
Peraturanaccess_key
dansecret_key
boleh dihasilkan sendiri, selagiaccess_key
dansecret_key
dalamWebHook
permintaan penggera adalah sama dengan yang dikonfigurasikan pada parameter robot.
Type
, arah perdagangan, membeli atau menjual, membuka atau menutup, ambil perhatian bahawa tempat dan niaga hadapan dibezakan. Jika ia adalah niaga hadapan, ambil perhatian bahawa kod kontrak niaga hadapan mesti ditetapkan pada parameter robot, dan objek pertukaran yang dikonfigurasi perlu menjadi pertukaran niaga hadapan.
amount
, bilangan transaksi.
PenggunaanwexApp
untuk mensimulasikan ujian pasaran sebenar.
Alamat strategi penuh:https://www.fmz.com/strategy/221850
Peraturanaccess_key
dansecret_key
dalam skim hanya untuk pengenalan, dan tidak ada jaminan untuk menggunakanhttp
. Penyelesaian ini hanya satu idea dan pengenalan. Dalam aplikasi praktikal, pertimbangan keselamatan harus ditambah danhttps
komunikasi harus digunakan.