XTB API
April 14, 2024
1 XTB Python API
[1]: from API import XTB
import pandas as pd
import numpy as np
import [Link] as plt
import mplfinance as mpf
from [Link] import find_peaks
1.0.1 Récupération et filtrage de la liste des symbols
[ ]: API = XTB("2597922", "Jx5*7+q+qNMzY9$")
resp = API.get_AllSymbols()['returnData']
# conversion en dataframe pandas
resp = [Link](resp)
pd.set_option('display.max_rows', len(resp)) # afficher toutes les lignes
# afficher la liste de tous les symboles
#print([Link])
# afficher la liste des indices
#print([Link]("categoryName == 'IND'"))
# afficher la liste des paires forex
#print([Link]("categoryName == 'FX'"))
# afficher la liste des ETF
#print([Link]("categoryName == 'ETF'"))
# afficher la liste des cryptos
#print([Link]("categoryName == 'CRT'"))
# afficher la liste des actions
#print([Link]("categoryName == 'STC'"))
# afficher la liste des matières premières
1
#print([Link]("categoryName == 'CMD'"))
1.0.2 Obtenir les données des bougies d’un symbole
[3]: from [Link] import find_peaks
# connexion à XTB
API = XTB(2597922, "Jx5*7+q+qNMzY9$")
# obtenir la liste des bougies de l'historique d'un symbol (Weekly W1 ou␣
↪Monthly MN1 seulement)
symbol = "COFFEE"
#resp = API.get_Candles("M1", symbol, days=330000)
resp = API.get_Candles("M30", symbol, qty_candles=2000)
# calcul du décallage de la virgule par rapport au nombre de digits
digits = resp[0]['digits']
decalage = 10 ** digits
# conversion en dataframe pandas
resp = [Link](resp)
# suppression des colonnes en trop
resp = [Link](["digits", "qty_candles"], axis=1)
# suppression des doublons
resp = resp.drop_duplicates(keep='first')
# calcul des open high close low par rapport au open + décallage de la virgule
resp['open'] = resp['open'] / decalage
resp['close'] = resp['open'] + (resp['close'] / decalage)
resp['high'] = resp['open'] + (resp['high'] / decalage)
resp['low'] = resp['open'] + (resp['low'] / decalage)
# détermination de l'interval de prix mini et maxi de la série
proportion_peaks_prominance = 0.15
# détection des highs et des lows selon la proéminence
min_close_price = [Link]()
max_close_price = [Link]()
price_interval = max_close_price - min_close_price
peaks_prominance = price_interval * proportion_peaks_prominance
highs = find_peaks([Link], prominence=peaks_prominance)[0]
highs_last_peak = find_peaks([Link])[0][-1]
highs = [Link](highs , highs_last_peak)
lows = find_peaks(-[Link], prominence=peaks_prominance)[0]
2
# Calculer les niveaux de retracement de Fibonacci
levels = [0, 0.141, 0.21, 0.3141, 0.4141, 0.5151, 0.5859, 0.6859, 0.83, 1]
fibonacci_levels = {}
for level in levels:
fib_level = round(max_close_price + level * (min_close_price -␣
↪max_close_price), 5)
fibonacci_levels[level] = fib_level
print(fibonacci_levels[0.3141])
# création d'un graphique
[Link](figsize=(15, 10))
[Link]([Link], resp['close'], label='Values')
# affichage des highs et des low détectés précédemments
[Link]([Link][highs], resp['close'][highs], 'ro', markersize=3)
[Link]([Link][lows], resp['close'][lows], 'ro', markersize=3)
[Link](symbol)
[Link]('Date')
[Link]('Prix')
# Tracer les lignes de retracement de Fibonacci
for level in fibonacci_levels:
[Link](fibonacci_levels[level], linestyle='--', color='gray', alpha=0.
↪7)
[Link](10.2, fibonacci_levels[level], f'Niveau : {level}␣
↪({fibonacci_levels[level]})', va='baseline', ha='left', color='black',␣
↪fontsize=11)
[Link]()
216.61771
3
- mettre en bougies - calculer par rapports aux niveaux extrêmes - ajouter tous les fibos
1.0.3 Chargement et traitement des données
[5]: # connexion à XTB
API = XTB("2597922", "Jx5*7+q+qNMzY9$")
# obtenir la liste des bougies de l'historique d'un symbol (Weekly W1 ou␣
↪Monthly MN1 seulement)
symbol = "FRA40"
timeframe= "M30"
source="XTB"
#resp = API.get_Candles("M1", symbol, days=330000)
resp = API.get_Candles(timeframe, symbol, qty_candles=200)
# calcul du décallage de la virgule par rapport au nombre de digits
digits = resp[0]['digits']
decalage = 10 ** digits
# conversion en dataframe pandas
resp = [Link](resp)
# suppression des colonnes en trop
resp = [Link](["digits", "qty_candles"], axis=1)
4
resp = [Link](0, axis=0)
# suppression des doublons
resp = resp.drop_duplicates(keep='first')
# on fait savoir à pandas que la colonne datetime est de type datetime
resp['datetime'] = pd.to_datetime(resp['datetime'], format='%b %d, %Y, %I:%M:
↪%S %p')
resp.sort_values(by=['datetime'], inplace=True)
resp.set_index('datetime', inplace=True)
# calcul des open high close low par rapport au open + décallage de la virgule
resp['open'] = resp['open'] / decalage
resp['close'] = resp['open'] + (resp['close'] / decalage)
resp['high'] = resp['open'] + (resp['high'] / decalage)
resp['low'] = resp['open'] + (resp['low'] / decalage)
1.0.4 Détection des extrêmes de la série de données
[6]: # détermination de l'interval de prix mini et maxi de la série
proportion_peaks_prominance = 0.15
# détection des highs et des lows selon la proéminence
min_close_price = [Link]()
max_close_price = [Link]()
price_interval = max_close_price - min_close_price
peaks_prominance = price_interval * proportion_peaks_prominance
highs = find_peaks([Link], prominence=peaks_prominance)[0]
lows = find_peaks(-[Link], prominence=peaks_prominance)[0]
1.0.5 Calculs des niveaux de retracement
[7]: # Calculer les niveaux de retracement
levels = [0, 0.141, 0.21, 0.3141, 0.4141, 0.5151, 0.5859, 0.6859, 0.83, 1]
fibonacci_levels = {}
for level in levels:
fib_level = round(max_close_price + level * (min_close_price -␣
↪max_close_price), 5)
fibonacci_levels[level] = fib_level
1.0.6 Création et affichage d’un graphique
[8]: # configuration du graphique
config_graph = dict(
type='candle',
figratio=(11,8),
figscale=2,
5
returnfig=True,
ylabel="Prix",
xlabel="Date",
)
# définition du thème pour le graphique
nmicinvest_theme = {
"base_mpl_style": "default",
"title_fontcolor" : "white",
"tick_fontweight" : "bold",
"ylabel_weight": 'bold',
"xlabel_weight": 'bold',
"marketcolors": {
"candle": {"up": "#ffffff", "down": "#ffffff"},
"edge": {"up": "#ffffff", "down": "#ffffff"},
"wick": {"up": "#ffffff", "down": "#ffffff"},
"ohlc": {"up": "white", "down": "white"},
"volume": {"up": "#ffffff", "down": "#ffffff"},
"vcedge": {"up": "white", "down": "white"},
"vcdopcod": True,
"alpha": 1,
},
"mavcolors": "#ffffff",
"facecolor": "#000000",
"gridcolor": "#515151",
"gridstyle": ":",
"y_on_right": False,
"rc": {
"[Link]": 'white',
"[Link]": 'white',
"[Link]": 'white',
"[Link]": 'white',
"[Link]": True,
"[Link]": "y",
"[Link]": "#000000",
"[Link]": "red",
"[Link]": "#000000",
"[Link]": "x-large",
"[Link]": "semibold",
}
}
# création du graphique
fig, ax = [Link](resp, **config_graph, style=nmicinvest_theme,␣
↪datetime_format='%d-%m-%Y %H:%M:%S')
6
# Ajouter un titre à la figure
[Link]('\n' + symbol + ' ' + timeframe, color='white', fontsize=16,␣
↪fontweight='bold')
# Ajouter la source des données en bas à droite
datasource_text = "source des données : " + source # Texte du datasource
datasource_fontsize = 7 # Taille de la police du datasource
datasource_color = 'white' # Couleur du datasource
# Coordonnées pour placer le datasource en bas à droite
datasource_x = 0.87 # Position X (0.0 à 1.0)
datasource_y = 0.21 # Position Y (0.0 à 1.0)
# Ajout du datasource sur la figure
[Link](datasource_x, datasource_y, datasource_text,␣
↪fontsize=datasource_fontsize,
color=datasource_color, ha='right', va='bottom', alpha=0.8)
# affichage du graphique
[Link]()
7
[ ]: