Тревога TradingViewWebHook напрямую подключена к роботу FMZ

Автор:Доброта, Создано: 2020-08-07 10:44:17, Обновлено: 2023-10-10 21:09:42

img

В последнее время все больше и больше пользователей TradingView подключают графический сигнал TradingView к платформе FMZ (FMZ.COMВ этом случае, если вы используете автоматический торговый механизм, то вы можете использовать автоматический торговый механизм, который позволяет автоматическому трейдингу выполнять транзакции в соответствии с графическим сигналом, что экономит много работы по написанию кода и разработке.TradingViewWebHook.

Предыдущее решение:https://www.fmz.com/digest-topic/5533.

Предыдущий план заключался в расширении интерфейса API платформы FMZ для отправки инструкций роботу. Сегодня давайте посмотрим на другое решение. Пусть сигнал тревоги WebHook TradingView будет отправлен непосредственно роботу платформы FMZ, чтобы он мог непосредственно отправлять инструкции и заказывать транзакции робота.

Исходный код стратегии робота

Стратегия написана на Python. После того, как робот будет создан и начнет использовать эту стратегию, робот создаст нить, которая запустит сервис для мониторинга установленного порта. В ожидании внешних запросов и обработки. Когда я проверил его, он был протестирован хостом на сервере, и устройство, на котором находится хост, должно быть доступно извне. Когда робот выполняет транзакцию, он использует интерфейс рыночного заказа. Кроме того, эта стратегия также может быть изменена для реализации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)

Параметры стратегии:

img

Запрос на тревогу TradingView's WebHook

Настройка запроса тревоги:

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Заполните конкретный IP-адрес вашего устройства, вы должны знать, что он должен быть доступен из внешней сети.

  • Вaccess_keyиsecret_keyмогут быть самостоятельно получены, еслиaccess_keyиsecret_keyвWebHookТребования к сигнализации те же, что и на параметрах робота.

  • Type, направление торговли, покупка или продажа, открытие или закрытие, обратите внимание, что различаются споты и фьючерсы. Если это фьючерсы, обратите внимание, что код фьючерсного контракта должен быть установлен на параметрах робота, а конфигурированный объект обмена должен быть фьючерсной биржей.

  • amount, количество сделок.

Тест на ход

ИспользованиеwexAppчтобы смоделировать реальный рыночный тест.

img img

Окончание

Полный адрес:https://www.fmz.com/strategy/221850

Вaccess_keyиsecret_keyв схеме предназначены только для идентификации, и нет гарантии для использованияhttpЭто решение является лишь идеей и введением.httpsОбщение должно быть использовано.


Больше