Projet : Bot Trading Python
Un robot qui trade à ma place sur XAU/USD
J'ai codé ce petit bot en Python par curiosité personnelle, pour voir si je pouvais automatiser une stratégie de trading simple sur la paire XAU/USD (or face au dollar américain). Le bot se connecte à la plateforme MetaTrader 5, récupère les prix, analyse les tendances avec des moyennes mobiles, et passe des ordres d'achat ou de vente automatiquement.
Ce n'est pas un projet scolaire, mais un projet perso qui m'a permis de me familiariser avec Python, les API de trading, et la manipulation de séries temporelles avec pandas.
Informations du Projet
- Catégorie Projet personnel
- Langage Python 3
- Plateforme MetaTrader 5
- Actif tradé XAU/USD (or)
- Timeframe 15 minutes
Avertissement. Ce bot est un projet d'apprentissage. Le trading automatisé comporte un risque de perte financière réelle. Je l'ai uniquement testé sur un compte démo MetaTrader 5. Je ne recommande à personne de le lancer sur un compte réel sans comprendre en profondeur la stratégie, les frais, et les risques.
Comment ça fonctionne
La stratégie en trois temps.
1. Récupération des données de marché
Toutes les 60 secondes, le bot demande à MetaTrader 5 les 100 dernières bougies de 15 minutes sur XAU/USD. Il reçoit un tableau de prix (open, high, low, close, volume).
2. Calcul de deux moyennes mobiles
Le bot calcule la moyenne mobile sur 20 périodes (MA20) et sur 50 périodes (MA50). Ces deux courbes servent à lisser le prix et repérer une tendance.
3. Détection du croisement (signal d'entrée)
Signal d'achat : quand la MA20 passe au-dessus de la MA50, le prix monte. Le bot ouvre une position buy.
Signal de vente : quand la MA20 passe en dessous de la MA50, le prix baisse. Le bot ouvre une position sell.
Si les moyennes ne se croisent pas, le bot attend et retente dans 60 secondes.
Comment le mettre en place
Quatre étapes pour lancer le bot en local sur un compte démo.
Installer Python et MetaTrader 5
Télécharger Python 3 depuis python.org, puis MetaTrader 5 depuis le site de votre courtier (ou directement sur metatrader5.com). Ouvrir un compte démo, c'est gratuit et ça évite de jouer de l'argent réel au début.
Installer les bibliothèques Python
Dans un terminal, taper :
pip install MetaTrader5 pandas ta matplotlib
Ces quatre paquets servent respectivement à : communiquer avec MetaTrader, manipuler les données, calculer les indicateurs techniques, et visualiser les résultats.
Lancer MetaTrader 5 et se connecter
Ouvrir l'application MetaTrader 5, se connecter à son compte démo, et laisser la fenêtre ouverte en arrière-plan. Le bot Python va dialoguer avec cette instance via l'API officielle.
Exécuter le bot
Depuis le dossier du projet, lancer :
python xauusd_bot_v2.py
Le bot affiche dans la console ses logs en temps réel : connexion, récupération des données, signaux détectés, ordres passés. Pour l'arrêter, faire Ctrl+C.
Le code complet
Un seul fichier Python, 90 lignes. Je l'ai voulu simple à relire.
# Robot de trading XAU/USD avec logs et tests de connexion
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
from ta.trend import SMAIndicator
from time import sleep
symbol = "XAUUSD"
lot = 0.1
def connect():
print("Connexion a MetaTrader 5...")
if not mt5.initialize():
raise RuntimeError(f"Echec de connexion a MetaTrader 5 : {mt5.last_error()}")
print("Connexion a MetaTrader 5 reussie.")
def get_data(symbol, n=100):
print("Recuperation des donnees...")
rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_M15, 0, n)
if rates is None or len(rates) == 0:
raise RuntimeError("Echec de recuperation des donnees de marche.")
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
return df
def signal(df):
df["ma20"] = SMAIndicator(df["close"], 20).sma_indicator()
df["ma50"] = SMAIndicator(df["close"], 50).sma_indicator()
print(f"MA20={df['ma20'].iloc[-1]:.2f} | MA50={df['ma50'].iloc[-1]:.2f}")
if df["ma20"].iloc[-1] > df["ma50"].iloc[-1] and df["ma20"].iloc[-2] <= df["ma50"].iloc[-2]:
print("Signal d'achat detecte.")
return "buy"
elif df["ma20"].iloc[-1] < df["ma50"].iloc[-1] and df["ma20"].iloc[-2] >= df["ma50"].iloc[-2]:
print("Signal de vente detecte.")
return "sell"
print("Aucun signal.")
return None
def execute_trade(direction):
print(f"Envoi de l'ordre : {direction.upper()}")
tick = mt5.symbol_info_tick(symbol)
if not tick:
raise RuntimeError("Impossible d'obtenir le tick.")
price = tick.ask if direction == "buy" else tick.bid
order_type = mt5.ORDER_TYPE_BUY if direction == "buy" else mt5.ORDER_TYPE_SELL
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot,
"type": order_type,
"price": price,
"deviation": 10,
"magic": 123456,
"comment": "AutoTrade",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print(f"Echec de l'ordre : {result.retcode}")
else:
print(f"Trade execute : {direction.upper()} a {price}")
def run():
try:
connect()
print("Demarrage du robot de trading...")
while True:
try:
df = get_data(symbol)
decision = signal(df)
if decision:
execute_trade(decision)
print("Attente 60 secondes...\n")
sleep(60)
except Exception as e:
print(f"Erreur dans la boucle principale : {e}")
sleep(60)
except Exception as e:
print(f"Erreur critique : {e}")
finally:
mt5.shutdown()
print("Deconnexion de MetaTrader 5")
if __name__ == "__main__":
run()