Construction en cours
@DarkPoule:
Quand tu auras commencé à poster, j'effacerai les messages précédents.
Quand tu auras commencé à poster, j'effacerai les messages précédents.
J'attends............................
Mince je l'avais oublié celui là !!
Je vais faire un petit article dessus aujourd'hui
Je vais faire un petit article dessus aujourd'hui
Voici mon assistant trader.
un ecran solitaire.
Et son "pendant maitre", 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) il s'affiche sur mon écran solitaire instantanément .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%.
un ecran solitaire.
Et son "pendant maitre", 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) il s'affiche sur mon écran solitaire instantanément .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%.
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
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
Magnifique !
Bien sûr qu'on veut en savoir plus !!!
Bien sûr qu'on veut en savoir plus !!!
Very Nice
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. 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.
Vous en voulez ENCORE ? ! ça c’était le plus simple.
Et j'ai bien dégraissé pour expliquer
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. 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.
Et j'ai bien dégraissé pour expliquer
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)
Oui, encore !
(Je fais à peu près l'équivalent, mais avec des techniques différentes et ça m'interesse de voir une autre approche)
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 :
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 :
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. :
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 :
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
qui redirige sur la fonction qui va s'occuper de tout faire clignoter.
Voici un bout
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"
J'ai un peu la meme mécanique pour supprimer une alerte etc ...
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)
(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}
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})
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)
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)
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
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 ...
bonsoir Dark !
Bonsoir Christelle ! Et toi takapoto,? Tu as fait quoi comme système ?
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.
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.
Sujets similaires
Bricolage secretaire pour ordinateur
Fichier(s) joint(s) par ChristelleP » 02 août 2021 11:14 (13 Réponses)
Fichier(s) joint(s) par ChristelleP » 02 août 2021 11:14 (13 Réponses)