TradingViewWebHook penggera disambungkan terus ke robot FMZ

Penulis:Kebaikan, Dicipta: 2020-08-07 10:44:17, Dikemas kini: 2023-10-10 21:09:42

img

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.

Kod sumber strategi robot

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 orderUntuk 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)

Parameter strategi:

img

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 menghantarPOSTpermintaan, perkhidmatan pemantauan mesti memantauPOSTpermintaan, dan TradingView hanya membenarkan port 80 untukhttp protocol.

  • xxx.xxx.xxx.xxxadalah 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_keydansecret_keyboleh dihasilkan sendiri, selagiaccess_keydansecret_keydalamWebHookpermintaan 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.

Ujian Berjalan

PenggunaanwexAppuntuk mensimulasikan ujian pasaran sebenar.

img img

END

Alamat strategi penuh:https://www.fmz.com/strategy/221850

Peraturanaccess_keydansecret_keydalam skim hanya untuk pengenalan, dan tidak ada jaminan untuk menggunakanhttp. Penyelesaian ini hanya satu idea dan pengenalan. Dalam aplikasi praktikal, pertimbangan keselamatan harus ditambah danhttpskomunikasi harus digunakan.


Lebih lanjut