Ayam, la secrétaire du trader.

Zone de développement des applications API, des logiciels et utilitaires développés par les membres du forum
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Construction en cours :)
Avatar du membre
Francis1
Le Sage
Messages : 30212
Enregistré le : 20 mars 2019 15:50

Re: Ayam, la secrétaire du trader.

Message non lu par Francis1 »

:top:
Avatar du membre
Ozmizrak
Chevalier Émérite Jedi
Messages : 3455
Enregistré le : 27 mai 2020 14:39

Re: Ayam, la secrétaire du trader.

Message non lu par Ozmizrak »

:top:
Avatar du membre
ChristelleP
La Battante
Messages : 68669
Enregistré le : 23 janv. 2018 09:53

Re: Ayam, la secrétaire du trader.

Message non lu par ChristelleP »

Dark :mercichinois:
Avatar du membre
Amarantine
Modératrice
Messages : 75431
Enregistré le : 16 sept. 2011 19:12

Re: Ayam, la secrétaire du trader.

Message non lu par Amarantine »

@DarkPoule:
Quand tu auras commencé à poster, j'effacerai les messages précédents.
Avatar du membre
Francis1
Le Sage
Messages : 30212
Enregistré le : 20 mars 2019 15:50

Re: Ayam, la secrétaire du trader.

Message non lu par Francis1 »

:zzz: :zzz: :lol2: :lol2:
Avatar du membre
Florian
Membre du Conseil Jedi
Messages : 16030
Enregistré le : 12 janv. 2015 18:06

Re: Ayam, la secrétaire du trader.

Message non lu par Florian »

J'attends............................
:zzz: :zzz: :zzz: :zzz: :zzz: :zzz: :zzz: :zzz:



:lol2: :lol2:
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Mince je l'avais oublié celui là !!
Je vais faire un petit article dessus aujourd'hui :)
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Voici mon assistant trader.
Capture d’écran du 2021-09-22 08-05-29.png
Capture d’écran du 2021-09-22 08-05-29.png (189.25 Kio) Vu 3440 fois
un ecran solitaire.
Et son "pendant maitre",
Capture d’écran du 2021-09-22 07-55-05.png
Capture d’écran du 2021-09-22 07-55-05.png (51.21 Kio) Vu 3440 fois
sur mon PC a coté de mes graphiques.

Il me permet de connaitre :

-la taille de position maximum a engagé (lev20)
-il m'informe des nouvelles de la journée (-5 minute il parle et -1 il parle encore en clignote)
-il affiche mon solde.
-il affiche les tendance sur 20 périodes via les carrés verts, rouges ou gris, sur 1m, 5m, 15m, 1h (moving average montante ou descendante)
-il me permet de placer des alertes hors prt qui s'affiche dans l'écran.
ex:
15340 DAX, je valide (au dessous du niveau actuel > 15415 a 8h00)
Capture d’écran du 2021-09-22 08-00-04.png
Capture d’écran du 2021-09-22 08-00-04.png (4.74 Kio) Vu 3440 fois
il s'affiche sur mon écran solitaire instantanément
Capture d’écran du 2021-09-22 08-07-33.png
Capture d’écran du 2021-09-22 08-07-33.png (106.34 Kio) Vu 3440 fois
.il sonnera 1 fois, à 15355.3 en orange et clignote 10 secondes,
.il sonnera 3 fois, à 15347.7 en rouge et clignote 30 secondes,
.il sonnera longuement a 15340 en gris quand le niveau sera égal ou franchi.


L'autre partie, permet de placer des SL+1 a la vitesse de flash des que possible.
c'est une stop placé par un robot. j'expliquerais l'infra après.
Je peux le déplacé (si possible) de +1, +2 ou +5. pour suivre la montée (ou descente) du cours.

Je peux effectuer des sorties partielles. ça me permet de sécurisé une partie.
a 5%, 10%, 25% et 50%.
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

NIVEAU INFRASTRUCTURE:
Donc j'ai :

Derrière mon écran solitaire, un RASPI3 rélié pour le son par jack audio a un des moniteur PC. (trop de soucis avec les enceinte USB ou independante... puis je suis trop radin pour ça)

Dessus un logiciel maison developpé en Python avec la bibliothèque Tkinter.

Derrière tout ça, il y a pas mal de chose. J'ai plusieurs serveur VPS OVH a 3€ par mois.

-1 est connecté 24/24 aux épic en tick (pour le suivis des alertes et le placement des stops)
-1 est connecté au news, mais chaque minutes elle vérifie si elle doit biper
-1 les carrés sont connecté aux épics en tick aussi, les donnée sont stocké; pour évité de rappeler trop de data ig via API et de se frotter aux limitations (je ne m'en sers plus aujourd'hui. j'ai viré le serveur OVH)
-1 serveur s'occupe du placement des SL+1 si necessaire.

Sur chaque serveur il y a des interface REST pour communiqué et transmettre les informations au RASPI
Et sur mon Raspi il y a aussi des interfaces REST pour communiqué avec les serveur ET aussi avec mon logiciel.

Tout ça en Python 3.8, Flask & CO !:)

Dites moi ce que vous en pensez, si vous voulez en savoir plus ;)
Avatar du membre
takapoto
Membre du Conseil Jedi
Messages : 7801
Enregistré le : 16 déc. 2013 15:56

Re: Ayam, la secrétaire du trader.

Message non lu par takapoto »

Magnifique !

Bien sûr qu'on veut en savoir plus !!!
Avatar du membre
max38250
Membre du Conseil Jedi
Messages : 5379
Enregistré le : 08 août 2020 11:40

Re: Ayam, la secrétaire du trader.

Message non lu par max38250 »

:bravo:
Avatar du membre
HellionReign
Membre du Conseil Jedi
Messages : 8596
Enregistré le : 24 oct. 2016 15:00

Re: Ayam, la secrétaire du trader.

Message non lu par HellionReign »

:P Very Nice :top: :top: :top: :mercichinois:
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Donnons un peu plus de détails:

Le plus simple, c'est les NEWS.

J'ai un serveur VPS OVH qui est s'en occupe.
En revanche il est re-initialisé, a chaque lancement de mon logiciel RASPI chaque matin.

RASPI--> GET Requet Init --> SERVEUR NEWS Reponse.
Les datas sont filtrés sur les "['flag US', 'flag DE', 'flag FR']"
Je parse les dates heures, l'importance.
Les news de Lettonie ne m’intéresse pas :)

Voici les datas retournées, elle sont mis en forme pour ce que j'ai besoin. le but est de filer le max de boulot au serveur distant.
Capture d’écran du 2021-09-22 09-48-12.png
Capture d’écran du 2021-09-22 09-48-12.png (53.62 Kio) Vu 2984 fois
L'interface interprète les réponses, et les met en forme.
Toute les 10 secondes, la liste est consulté pour savoir si on doit sonné a -5 min ou a -1 minute ou les news les passé disparaissent pour ne pas polluer.

Sur l'interface RASPI, il y a trois partie,
-interface
-le socket est toujours ouvert en réception en boucle.
-serveur Flask http

tout ceci tourne en parallèle.

SERVEUR DE NEWS DISTANT
En réalité, toute les 10 secondes on consulte la liste des news (stocké en RAM) et on envoie l'action a effectué.
(doit clignoté, sonné, disparaitre etc ... )
Donc les éléments de la liste vont être modifier directement ex :
Donc 4 actions possible :
index_to_remove, index_to_stop5, index_to_alert5, index_to_alert1
On envoie ça sous forme de requête GET avec des paramètres :

http:mon_ip_raspi:port/api/v1/receveid_information/news&index_to_alert5=i
(i etant l'index de la news... un sorte d'ID)

Cette requete est recu par mon RASPI serveur Flask
Qui lui la transcrit en Socket
le socket tourne en boucle comme un fou. en quelques MS.
La requete est réinterpreter par l'interface RASPI (la ou il y a le socket qui tourne) sur une classe python différente, donc complement capable de communiqué entre eux.

Ah je vois que vous en voulez encore !!!

Alors on va me dire pourquoi alors, faire tourner un socket qui fait le pont entre la partie
Serveur Flask Rapi et Interface Raspi.

Parce que c'est deux nigeaux sont incapable (ou je n'ai pas réussi) a les faire tournée en mutlti treading dans deux classe différente dans le meme fichiers lancé.
Flask reclame le first place et l'interface aussi (logique sinon on la voit pas s'affiché)

en fait pour lancé c'est simple :
serveur_flask = Flask()
interface_raspi = Interface_Raspi()

Sauf que pour chaque l'execution rentre sans jamais en sortie. la 1er ligne est executé et jamais la deuxième.
(je rassure j'ai même tenter le multi treading, on arrive sur d'autre conflit)

Alors pour pouvoir le lancer, je lance les deux fichier séparement. Il sont isolés.
Du coup il ne communique pas.
Donc le socket qui lui prend le threading, ce lance avec l'interface. Comme deux bon copains.

Code : #

serveur = Socket_Serveur() #initialisation socket
interface = Interface() #initialisation interface

th2 = threading.Thread(target=serveur.run) # Mise en thread (ou vcpu séparé) le serveur socket
th2.daemon = True
th2.start() # On demarre le thread

interface.run() # on démarre l'interface.
Vous en voulez ENCORE ? ! ça c’était le plus simple.
Et j'ai bien dégraissé pour expliquer :)
Avatar du membre
takapoto
Membre du Conseil Jedi
Messages : 7801
Enregistré le : 16 déc. 2013 15:56

Re: Ayam, la secrétaire du trader.

Message non lu par takapoto »

Sans vouloir abuser...
Oui, encore !
:)

(Je fais à peu près l'équivalent, mais avec des techniques différentes et ça m'interesse de voir une autre approche)
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Pour les alertes éditables .
Elle sont envoyées via mon assistant sur PC (le truc de tout les couleurs)
ça envoie un requete vers le serveur distant (buzzer_server) qui stream les epic qui m'interesse quand je click sur "V"
Genre :

Code : #

    def send_dax(self):
        datas = {'dax': self.dax_value.get()}
        return requests.get("{}/api/v1/create_alert".format(config_interface.ip_alert_server), params=datas)
le buzzer_server ecris dans un fichier .pkl les alertes
(https://www.quennec.fr/trucs-astuces/langages/python/python-le-module-pickle)
Je veux que ça reste tout le temps, quand j'eteint et je rallume, que je n'ai pas a réecrire mes alertes.
Pour ça quand je lancer l'interface RASPI j'ai un "/api/v1/get_alert" qui se lance
Et qui va lire le fichier pour replacer les éléments dans l'interface.

dans mon serveur de stream ça creer un dictionnaire avec les attribut de ma liste
genre : un uuid, epic, plus haut ou plus bas ....

voici :

Code : #

        s_epic.alerte_ids[alerte_id] = {'bid': level,
                                        'offer': level,
                                        'type': ttype,
                                        'level_green': level_green,
                                        'level_orange': level_orange,
                                        'level_green_active': False,
                                        'level_orange_active': False,
                                        'level_passing': False}
les différente level précalculer
green = 0.10% du level
orange = 0.05% du level
et si les level ont été passé ou pas... pour pas que ça sonne sans fin. ça sonne 1 fois. C'est tout.

Et pour chaque tick d'épics, je verifie si ça depasse les niveau indiqué
et j'écris tout ça dans mon fichier pkl.

ma liste d'alerte en RAM est mise donc a jour.
Alors chaque tick, la liste des alertes sera comparer avec la valeur du prix actuelle.

Exemple d'un petit bout. :

Code : #

                if prix > level_green and prix < level_orange and level_green_active == False:
                    print('PASS green')
                    if level_green_active == False:
                        v['level_green_active'] = True
                        self.req({"datas_alert_green": uuid})
Je compare le prix actuelle a mon intervall green et orange.
si c'est compris dedans est non activé alors ... on déclenche l'alerte verte!

self.req qui envoie un requete :

Code : #

        req = requests.get(
            "{}/api/v1/receveid_information/alert".format(config_interface.ip_raspi),
           params=datas)
Au RASPI sur mon bureau

Et rebolote, le serveur Flask reçois "datas_alert_green": uuid en parametre
(uuid est l'identification de l'alerte, donc on sais si c'est dax avec tel prix)
qui converti sur socket en local

Code : #

@app.route("/api/v1/receveid_information/alert", methods=['GET'])
def parse_request_alert():
    print('parse_request_alert request.args.to_dict()', request.args.to_dict())
    datas_bytes = convert_args_to_bytes(request.args.to_dict())
    send_socket(datas_bytes)
qui redirige sur la fonction qui va s'occuper de tout faire clignoter.

Voici un bout

Code : #

      
      ...         
                elif 'datas_alert_green' in datas_alert and datas_alert['datas_alert_green'] == uuid:
                    th_cli = threading.Thread(target=self.clignotement2, args=(item, 'green',))
                    th_cli.start()
                    self.song('green_zone')
                    break
Je clignote et je lance un son ... en threading... pour ne pas bloqué l'interface.
Par l'interface est root, et si le code bloque pendant 20 seconde je ne pas agir sur autre chose.

Et pour le plaisir... la fonction "song"

Code : #

    def song(self, song):
        folder = "/home/pi/Desktop/tradingbox/raspi/sounds/" + song + ".wav"
        print(folder)
        print('aplay ' + folder)
        os.system('aplay ' + folder)

J'ai un peu la meme mécanique pour supprimer une alerte etc ...
Avatar du membre
ChristelleP
La Battante
Messages : 68669
Enregistré le : 23 janv. 2018 09:53

Re: Ayam, la secrétaire du trader.

Message non lu par ChristelleP »

bonsoir Dark ! :)
Avatar du membre
takapoto
Membre du Conseil Jedi
Messages : 7801
Enregistré le : 16 déc. 2013 15:56

Re: Ayam, la secrétaire du trader.

Message non lu par takapoto »

Merci !
Avatar du membre
DarkPoule
Membre du Conseil Jedi
Messages : 7191
Enregistré le : 07 juil. 2017 06:02

Re: Ayam, la secrétaire du trader.

Message non lu par DarkPoule »

Bonsoir Christelle ! Et toi takapoto,? Tu as fait quoi comme système ?
Avatar du membre
takapoto
Membre du Conseil Jedi
Messages : 7801
Enregistré le : 16 déc. 2013 15:56

Re: Ayam, la secrétaire du trader.

Message non lu par takapoto »

J'ai développé en C#, donc sous Windows, car c'est le langage que j'utilisais professionnellement et je pouvais donc développer des bibliothèques communes, une espèce de cercle vertueux.

Je fais tourner mes programmes sur un seul VPS (car un serveur windows ne coûte pas 3€ par mois) mais l'avantage, c'est que ça facilite les communications entre processus.

Quand j'aurais un moment, je posterais un schéma de mon système.