Aujourd’hui, je vais partager avec vous comment récupérer les cours via l’API IG Market en PYTHON, étape nécessaire pour backtester ensuite ses stratégies de trading.

Pourquoi une infrastructure dédiée?
Il est vrai que prorealtime offre de larges possibilités pour backtester et optimiser ses stratégies avec un historique de cours assez profond. Mais il n’a jamais répondu à mes attentes sur plusieurs points:
- Je maîtrise personnellement le perl et le python
- Je ne me limite pas seulement aux chandeliers sur des UT minutes mais trade surtout en kagi ou en ticks.
- J’aime bien le multi-timeframe (analyses de plusieurs UT pour les setups). Avec PRT, c’est compliqué, mais alors compliqué!!
- Bien souvent, je ne trouve pas du tout les mêmes résultats que prt. Je sais pourquoi mes programmes bugguent, j’ignore pourquoi ceux de prt bugguent…
- Mes setups programmés sont parfois ignorés avec prt, j’ignore encore une fois pourquoi.
- Enfin, on ne peut pas créer d’automate réel sur prt en tick ou en kagi, donc la seule possibilité est de passer par l’API IG Market avec un robot homemade. Le backtest est donc la première brique de programmation du futur robot en temps réel.
Donc voilà, je fais mes backtests maison avec les données enregistrées via l’api d’IG. Nous allons voir ici comment les récupérer.
Le vps: outil indispensable
A moins que vous comptiez laisser votre pc ouvert 24h/24h chez vous avec générateur de secours et pc en double pour prendre le relai en cas de panne, l’unique solution fiable pour aspirer les cours via l’API IG Market est de passer par un VPS (virtual private serveur).
Pour 3eur/mois, vous avez un ordinateur qui tourne 24/24 pour vous, sans bruit ni risque d’incendie. Faites un tour chez OVH, la référence pour ce service:
https://www.ovh.com/fr/vps/vps-ssd.xml
Prenez le systeme d’exploitation Ubuntu, c’est gratuit et absolument nécessaire pour la suite.
A cette étape, vous serez déjà dans les moins de 1% de geek de la planète, bravo!
Python et API d’IG
C’est la partie technique. Si vous ne connaissez rien en informatique, alors passez des heures incalculables sur le web à vous former. Je suis un pur autodidacte en programmation, et cela ne sert à rien que je vous donne tout directement car vous ne saurez pas réparer au premier petit bug. Et je ne suis pas là non plus pour faire le pompier!
Tout d’abord, un grand détour sur ce site vous sera nécessaire pour commencer:
https://python.developpez.com/
Ensuite, rendez vous sur cette page pour récupérer les librairies (python pour ma part) de l’API IG Market:
Il vous faut enfin MySQL et python d’installés sur votre vps, et toutes les librairies qui seront nécessaires à faire tourner le petit programme ci dessous (notamment celle d’IG of course)
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/usr/bin/env python #-*- coding:utf-8 -*- """ IG Markets Stream API sample with Python 2015 FemtoTrader """ import time import sys import traceback import logging import datetime from time import sleep, strftime from time import sleep from datetime import datetime, timedelta from trading_ig import (IGService, IGStreamService) from trading_ig.config import config from trading_ig.lightstreamer import Subscription import MySQLdb listDB=[] HOUR = datetime.now().time().hour MINUTE = datetime.now().time().minute NCOUNT=0 lastactu = datetime.now() LS_content_length=100000000000 db = MySQLdb.connect(host="YourHost", # your host, usually localhost user="Username", # your username passwd="PassWord", # your password db="DBName") # name of the data base cur = db.cursor() curmain = db.cursor() def on_prices_update(item_update): global lastactu lastactu=datetime.now() BID=item_update["values"]["BID"] ASK=item_update["values"]["OFFER"] date = time.strftime("%Y-%m-%d") TIME=date + " " + item_update["values"]["UPDATE_TIME"] TIME = time.strftime("%Y-%m-%d %H:%M:%S") STOCK_NAME=item_update["name"] if 'DOW' in STOCK_NAME: STOCK_NAME='DOW' if 'DAX' in STOCK_NAME: STOCK_NAME='DAX' if 'NAS' in STOCK_NAME: STOCK_NAME='NQ' rqDB="INSERT INTO IG_HISTO(MARKET,DATE,BID,ASK) VALUES ('" + str(STOCK_NAME) + "','"+ str(TIME) + "','" + str(BID) + "','" + str(ASK) + "') ON DUPLICATE KEY UPDATE BID='" + str(BID) + "',ASK='" + str(ASK) + "'" listDB.append(rqDB) def on_account_update(balance_update): print("balance: %s " % balance_update) def main(): logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.DEBUG) global HOUR global NCOUNT global MINUTE global lastactu lastactu=datetime.now() ig_service = IGService( "YourAccountName", "Password", "APIKEY", "LIVE" ) expire_after = timedelta(hours=24) ig_stream_service = IGStreamService(ig_service) ig_session = ig_stream_service.create_session() # Ensure configured account is selected accounts = ig_session[u'accounts'] for account in accounts: if account[u'accountId'] == "DYGWE": accountId = account[u'accountId'] break else: print('Account not found: {0}'.format(config.acc_number)) accountId = None ig_stream_service.connect(accountId) # Making a new Subscription in MERGE mode subscription_prices = Subscription( mode="MERGE", items=['L1:IX.D.NASDAQ.IFM.IP','L1:IX.D.DOW.IMF.IP', 'L1:IX.D.DAX.IMF.IP'], fields=["UPDATE_TIME", "BID", "OFFER", "CHANGE", "MARKET_STATE"], ) # adapter="QUOTE_ADAPTER") # Adding the "on_price_update" function to Subscription subscription_prices.addlistener(on_prices_update) # Registering the Subscription sub_key_prices = ig_stream_service.ls_client.subscribe(subscription_prices) # Making an other Subscription in MERGE mode subscription_account = Subscription( mode="MERGE", items=['ACCOUNT:'+accountId], fields=["AVAILABLE_CASH"], ) # #adapter="QUOTE_ADAPTER") # Adding the "on_balance_update" function to Subscription # subscription_account.addlistener(on_account_update) # Registering the Subscription sub_key_account = ig_stream_service.ls_client.subscribe( subscription_account ) while ((HOUR<23) or (HOUR>=23 and MINUTE>=16) ): time.sleep(1) NCOUNT=NCOUNT+1 HOUR = datetime.now().time().hour MINUTE = datetime.now().time().minute listDB_copy=listDB[:] datenow=datetime.now() lastactusecond=(datenow-lastactu).total_seconds() del listDB[:] for command in listDB_copy: curmain = db.cursor() curmain.execute(command) db.commit() curmain.close() if ((NCOUNT+1)%3600 == 0) or lastactusecond>60: print(NCOUNT) print("lactacu:",lastactusecond) ig_stream_service.disconnect() time.sleep(5) main()if __name__ == '__main__': main() |
Ce petit programme vous permet donc d’enregistrer les cours du DOW, DAX et NQ dans une table SQL avec 4 colonnes: Marché, Date, BID, ASK.
Il se déconnecte/reconnecte s’il n’y a pas de flux pendant 60 secondes.
Il n’entre pas les datas en temps réel dans la base de donnée, mais stocke dans une variable les commandes d’insertion. Il exécute l’ensemble de ces commandes en bloc toutes les secondes. C’est une subtilité pour éviter de planter SQL si plusieurs requêtes sont faites en même temps.
Le programme tourne tous les jours de la semaine jusqu’à 23h16, et un cron le redémarre tous les jours à 23h45.
Par sécurité, un clone de ce programme tourne également en même temps, au cas ou l’un des deux plantes. Pendant que le premier se reconnecte (après 60 secondes si bug), l’autre programme prend alors le relai.
Conclusion
Vous savez tout maintenant. Quand je posterai des codes de backtests, ils se baseront donc sur les cours stockés dans la table « IG_HISTO ». Commencez rapidement afin de vous faire un historique de plusieurs mois et pouvoir faire des backtests avec assez de profondeur.
Je ferai bientôt le même tutoriel sur l’API d’interactive broker pour récupérer les cours futures.
Bon geek à tous!
super intéressant!! Merci pour le partage.
C’est dommage qu’il n’y ait pas eu plus de suivi et d’activité sr ce fil.
Je suis tombé par hasard sur ce site , il est très intéressant.
Je suis preneur si vous avez fait des backtests en utilisant l’API d’IG et d’IB
Merci d’avance
Mike
Hello Mike,
Tu trouveras quelques backtests dans la catégorie « méthodes de trading et backtest ». Ils sont simples certes, mais pour la suite, il va falloir que tu passes quelques heures devant ton pc pour trouver le bon algorithme qui te convient. Le plus important est qu’il reflète ta façon de trader, au risque de craquer psychologiquement sinon à chaque trade qu’il prendra sans que tu le comprennes.
Bon courage!