File size: 2,243 Bytes
e87682e
 
 
f9059e3
8806298
f9059e3
e87682e
 
 
 
06a13d2
 
 
 
 
e87682e
 
 
 
06a13d2
e87682e
 
ef9a264
06a13d2
0f24fee
f9059e3
06a13d2
f9059e3
06a13d2
0f24fee
 
 
06a13d2
 
 
e87682e
0f24fee
e87682e
06a13d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0f24fee
06a13d2
 
e87682e
06a13d2
8806298
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from fastapi import FastAPI, Request
import os
import json
from hyperliquid.exchange import Exchange
from eth_account import Account

app = FastAPI()

@app.get("/")
def home():
    return {
        "status": "online", 
        "message": "Sentinel V1 est opérationnel",
        "version": "1.2.2-stable"
    }

@app.post("/webhook")
async def handle_webhook(request: Request):
    try:
        # 1. Récupération des données du signal TradingView
        body = await request.body()
        data = json.loads(body)
        
        # 2. Vérification de la clé privée (Secret Hugging Face)
        pk = os.getenv("HL_PRIVATE_KEY")
        if not pk:
            return {"error": "Secret HL_PRIVATE_KEY introuvable dans la configuration"}
            
        # 3. Initialisation de la connexion à Hyperliquid
        account = Account.from_key(pk)
        exchange = Exchange(account, "https://api.hyperliquid.xyz")

        # 4. Lecture des paramètres du signal
        # Par défaut : ETH et une taille de 0.01 si non précisé
        action = data.get("action", "").lower()
        symbol = data.get("symbol", "ETH")
        size = float(data.get("size", 0.01))

        # 5. Exécution de l'ordre sur le marché (Market Order)
        # Paramètres : symbol, is_buy, size, price (None pour Market), slippage (0.01 = 1%)
        if "buy" in action:
            # Ouvre ou renforce un LONG
            result = exchange.market_open(symbol, True, size, None, 0.01)
            return {"status": "success", "action": "buy", "response": result}
            
        elif "sell" in action:
            # Ouvre ou renforce un SHORT
            result = exchange.market_open(symbol, False, size, None, 0.01)
            return {"status": "success", "action": "sell", "response": result}
            
        elif "close" in action:
            # Ferme la position existante sur ce symbole
            result = exchange.market_close(symbol)
            return {"status": "success", "action": "close", "response": result}
        
        return {"error": "Action non reconnue (doit contenir buy, sell ou close)"}

    except Exception as e:
        # Retourne l'erreur précise en cas de problème technique
        return {"error": str(e)}