Script Python pour l’API IG : cours en continu et passage d’ordres

LabZone, l'atelier de développement du forum Andlil : API, logiciels et utilitaires de trading créés par les membres, versions, bugs et idées.
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

ok

tu connais Git, GitHub ?
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

Oui ... et non.

Je te donne ma modification et tu peux faire un update si tu veux. Je n'utiliserais pas github trop compliqué dans mon cas.
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

ça n''est pas compliqué du tout ! (enfin pas aussi compliqué qu'on ne le pense)

On peut faire ça par l'interface web
(surtout si tu n'as qu'un fichier à modifier)

Va sur le projet
https://github.com/ig-python/ig-markets-stream-api-python-library

Clique sur fork
Ta version du projet est sur
https://github.com/ton_username/ig-markets-stream-api-python-library

Reviens sur
https://github.com/ig-python/ig-markets-stream-api-python-library

Va sur le fichier à modifier

Clique sur edit ("Edit the file in your fork of this project")

Colle ton code.

ça permet du coup d'identifier rapidement la différence entre le code d'origine
et la modif (diff)

Tu valide en allant sur
"Create a new branch for this commit and start a pull request"
Donne un nom à la branche
et voilà...
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Tu peux ensuite aller dans ton projet.
Choisir ta nouvelle branche. Editer le code, ...
ton Pull Request sur le projet upstream sera automatiquement mis à jour
avec tes nouveaux commits
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Il ne doit pas y avoir que

self.on_update.fire(item_id, fields)

qui devient

self.on_update.fire(item_id, fields, self.item_ids)

car si je fais cette modif je n'ai plus la MAJ des ticks
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

heu attend j'ai du aussi modifier l'appel je regarde (dans mon main.py)

Ah bizarre. Justement je n'ai pas modifié l'appel de la fonction.

Dans la L3 souscription à une table est la même depuis le début :

Code : #

# Binding sur les differents flux de stream et fonctions associés
        priceTable = igls.Table(client,
                                mode=igls.MODE_MERGE,
                                item_ids='MARKET:%s' % personal.epic,
                                schema="OFFER BID",
                                )

priceTable.on_update.listen(events.process_price_update)
Avec la modification je renvoi simplement item_ids comme champs supplémentaire de retour en plus du Offer et du Bid.

Si tu fais un "print" bestiale de chaque message reçu ça passe ?

---

La fonction qui est bindé avec la table reçoit 3 arguments au lieux de 2 :

Code : #

def process_price_update(item, myUpdateField, item_ids):
---

Je viens de faire un "compare" entre igls utilisé au début et la dernière mouture, y'a bien jsute le champ self.item_ids qui a bougé, tout le reste est 100% identique.
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Hum ... il y a quand même un coac

si tu t'abonne à plusieurs flux (GBPUSD et USDJPY par exemple)

Code : #

    priceTable = igls.Table(client,
        mode=igls.MODE_MERGE,
        item_ids='L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP',
        schema='UPDATE_TIME BID OFFER CHANGE MARKET_STATE',
        item_factory=lambda row: tuple(float(v) for v in row)
    )

    priceTable.on_update.listen(process_price_update)
je m'attendais à récupérer aussi l'epic dans process_price_update.

comment faire en sorte que process_price_update reçoive les prix de plusieurs actifs
ainsi que l'epic en question?

par ce que je me retrouve avec

Code : #

(py2)pc:ig-markets-stream-api-python-library femto$ python sample.py
('New state:', 'connecting Lightstreamer session')
('New state:', 'connected Lightstreamer session')
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:33', u'120.283', u'120.291', u'0.550', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:15', u'1.52037', u'1.52057', u'0.00550', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:34', u'1.52041', u'1.52051', u'0.00549', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:35', u'1.52042', u'1.52052', u'0.00550', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:36', u'1.52037', u'1.52057', u'0.00550', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:36', u'1.52041', u'1.52051', u'0.00549', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:37', u'120.284', u'120.292', u'0.551', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:37', u'120.285', u'120.293', u'0.552', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:37', u'120.287', u'120.295', u'0.554', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:37', u'120.288', u'120.296', u'0.555', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:37', u'120.289', u'120.297', u'0.556', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:39', u'120.290', u'120.298', u'0.557', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:39', u'1.52037', u'1.52057', u'0.00550', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:39', u'120.289', u'120.297', u'0.556', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:41', u'120.288', u'120.296', u'0.555', u'TRADEABLE']
price update for L1:CS.D.GBPUSD.CFD.IP L1:CS.D.USDJPY.CFD.IP= [u'11:53:41', u'120.289', u'120.297', u'0.556', u'TRADEABLE']
quand je fais

Code : #

def process_price_update(item, myUpdateField, item_ids):
    print("price update for %s= %s" % (item_ids, myUpdateField))
je voudrais que tout arrive dans la même fonction pour ensuite utiliser un système de messaging interne (RabbitMQ par exemple) mais pour ça j'ai besoin du prix et de l'epic.
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

Oulà attend, tu es sur que tu peux souscrire à deux flux de prix avec cette syntaxe ?
J'ai pas trouvé comment avoir plusieurs epic dans le mêms flux LS.

D'autre part, il ne me semble pas pertinent de sosucrire ainsi, la fréquence des ticks étant "propre" à chaque sous-jacent. Qu'est censé te renvoyer IG si tu as un tick pour GBPUSD et pas de tick au même moment pour USDJPY ???

Pour chaque epic, je lance une souscription de table, comme décrit précedement.

---

Comme je souscrit à un seul epic par Table,
J'extrait la droit de L1: pour avoir l'epic correspondant.
J'ai aussi codé le cas où le mot clef serait MARKET ou CHART

...

En étudiant ton cas d'usage, ça confirme bien ce que je pense, ce n'est pas forcément pertinent de souscrire à plusieurs epic dans le même flux, à cause des problèmes d'identifications de l'epic
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Si tu as un tick pour GBPUSD ça lance la fonction (même si tu n'a pas de tick pour USDJPY)

Le problème c'est comment faire en sorte de récupérer dans une seule fonction les prix et l'epic ???
Avatar du membre
Nomade
Ewok
Messages : 73
Enregistré le : 19 juin 2014 23:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par Nomade »

Si je comprend ce que tu veux faire :

avec plusieurs souscriptions en ecoutant chacune, par ex dans main de L3:

Code : #

        priceTable = igls.Table(globalvar.client_ls,
                                mode=igls.MODE_MERGE,
                                item_ids='MARKET:CS.D.GBPUSD.CFD.IP ',
                                schema="OFFER BID",
                                )
        priceTable2 = igls.Table(globalvar.client_ls,
                                mode=igls.MODE_MERGE,
                                item_ids='MARKET:CS.D.USDJPY.CFD.IP',
                                schema="OFFER BID",
                                )
        priceTable.on_update.listen(events.process_price_update)
        priceTable2.on_update.listen(events.process_price_update)
avec dans process_price_update:

Code : #

    print(item, myUpdateField, item_ids)
tu as en output
(1, [u'1.51771', u'1.51761'], 'MARKET:CS.D.GBPUSD.CFD.IP ')
(1, [u'1.51772', u'1.51762'], 'MARKET:CS.D.GBPUSD.CFD.IP ')
(1, [u'120.244', u'120.236'], 'MARKET:CS.D.USDJPY.CFD.IP')
(1, [u'1.51773', u'1.51763'], 'MARKET:CS.D.GBPUSD.CFD.IP ')
(1, [u'120.241', u'120.233'], 'MARKET:CS.D.USDJPY.CFD.IP')
(1, [u'1.51774', u'1.51764'], 'MARKET:CS.D.GBPUSD.CFD.IP ')
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

C'est ainsi que fonctionne L3 à l'heure actuel (la souscription se faisant à la volée en fonction de ce que l'on a en portif et des changements de sous-jacent)
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Ok donc

Code : #

    for item_id in ['L1:CS.D.GBPUSD.CFD.IP', 'L1:CS.D.USDJPY.CFD.IP']:
        priceTable = igls.Table(client,
            mode=igls.MODE_MERGE,
            item_ids=item_id,
            schema='UPDATE_TIME BID OFFER CHANGE MARKET_STATE',
            item_factory=lambda row: tuple(float(v) for v in row)
        )
        priceTable.on_update.listen(process_price_update)
ce qui est quand même étrange c'est le "s" à la fin de item_ids

Savez-vous où récupérer une liste des "epic" ?

La question m'a été posée (elle est intéressante je trouve)
https://github.com/ig-python/ig-markets-stream-api-python-library/issues/6
mais je n'en sais rien !

Je vois 2 solutions:
utiliser les watchlists ou faire une recherche par terme
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

DAns le forum on a déjà répondu à cette question.

Tu peux appeler la variable toto si tu veux ;-)
beni
Compagnon Jedi
Messages : 1395
Enregistré le : 11 juil. 2012 18:31

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par beni »

Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

Tu es trop bon béni :-D on lu doit bien ça ;)
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Merci beni si je comprend bien la réponse
qui permet d'obtenir la liste
https://www.andlil.com/api/Epics/log_epics.txt

est dans le code C# ;-)
https://www.andlil.com/api/Epics/Source ... Program.cs

en scrappant une page web c'est bien ça ?

c'est pas en utilisant l'API
beni
Compagnon Jedi
Messages : 1395
Enregistré le : 11 juil. 2012 18:31

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par beni »

Ah tu voulais la méthode !
A vrai dire je ne me suis jamais intéressé au code posté par brucy, mais apparement t'as besoin d'un token donc d'une clé API.

--
En parcourant vite fait le code et le sujet effectivement ça ne passe pas par des requêtes get et tout et tout...
Je crois que jized utilise /marketnavigation/ et /marketnavigation/{nodeId} et donc l'API, avec une tempo entre les requêtes pour éviter de ce faire kicker par IG.
Avatar du membre
falex
Le Gladiateur
Messages : 34269
Enregistré le : 12 févr. 2013 15:41

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par falex »

J'ai fait le même exercice, et j'en ai fait la même conclusion, il faut mettre ses identifiants de comptes et ensuite ça récupère via l'aPI.

Seul limite tu ne vois que les CFD à risque limité accessible dans ton pays,
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

ok merci.
ça vaut peut-être le coup que je teste ça en Python (pour le fun ;-) )
parce que le seul code que j'ai vu c'est du C#, il y a quelqu'un qui a ça en Python ?
FemtoTrader
Ewok
Messages : 32
Enregistré le : 30 sept. 2015 07:47

Re: [PYTHON] Script API IG STREAM + REST

Message non lu par FemtoTrader »

Fusion du projet REST avec le projet STREAM, organisation GitHub ig-python créée

ça se passe ici

https://github.com/ig-python/ig-markets-api-python-library