Création d'un système de trading Python pour MT. - page 3

 
Yuriy Asaulenko:

C'est un autre sujet).

Je ne mets pas une équipe en place. Je me promène seul, je fais ce que je pense être juste et intéressant, et je ne prends aucun engagement.

Si quelqu'un veut sortir avec moi, il n'y a aucune objection et aucun engagement non plus.

Je ne parle pas de l'équipe, mais du moteur sous la forme d'une application EXE permettant de relier Python et R à MQL, ce que j'ai suggéré dans ce fil.
 
Ivan Negreshniy:
Je ne parle pas de l'équipe mais du moteur sous forme d'application EXE pour relier Python et R avec MQL, ce que j'ai suggéré dans ce fil.

Vous obtiendrez vos EXEs - aucun problème en Python. R, désolé, je ne l'utilise pas - imho, une grosse décharge de tout et n'importe quoi. S'il y a des diamants dans cette décharge, leur recherche est problématique. Sauf si SanSanych me le dit).

Je m'occupe surtout de réseaux neuronaux, et il y en a suffisamment sans R.

Mais, en fait, la méthodologie d'interaction est prévue pour être universelle, et vous pouvez probablement l'utiliser pour R également.

 
Maintenant que nous avons une application préconstruite, il est temps d'échanger des données entre le terminal et Python.
Pour commencer, nous choisirons le type d'échange le plus simple : l'échange de données via des fichiers.
Maintenant, beaucoup de gens vont ricaner dans leur encrier, et en vain. Alors laissez-les faire).
1. Pendant la construction et le débogage de l'application, le partage de fichiers est le plus efficace, car il ne nécessite aucun effort de mise à niveau. Et une fois l'application construite, elle peut être remplacée par autre chose.
2. Dans la majorité des CT prêts à l'emploi, la vitesse d'échange des fichiers est plus que suffisante. 50-100 ms. Pas assez pour vous ?
3. Lors de l'échange de fichiers via RAM-Disk, le taux d'échange atteint 1,5 GByte/s. Il est impossible de mesurer la latence.
En somme, crachez-le et oubliez les adversaires).
En fait, un autre échange est prévu pour la dernière phase, si nous ou le sujet se montrent à la hauteur).

Nous échangerons avec le terminal via des fichiers CSV. Jusqu'à présent, une seule voie - du terminal à l'application.
Pour éviter tout conflit d'intérêt, nous utiliserons des fichiers sémaphores.
Donc, que DataTS.csv soit le fichier de données, et STS.s le fichier de sémaphore.
Le terminal écrit des données dans DataTS.csv, et, après l'écriture, crée un fichier sémaphore vide STS.s.
L'application vérifie la présence du fichier sémaphore STS.s, puis lit le fichier DataTS.csv, puis supprime le fichier sémaphore STS.s.
Ensuite, le terminal détecte la disparition du fichier sémaphore STS.s et c'est seulement à ce moment-là qu'il écrit les nouvelles données dans le fichier DataTS.csv.
Variations possibles, selon les fonctions des fichiers Phyton et MT - je n'ai pas encore cherché.
Cependant, pas tout d'un coup, nous devons d'abord travailler avec Python, et déterminer ses capacités.
C'est ce qu'on va faire.
 
Il y a eu quelques changements depuis ma dernière visite. L'application est maintenant entièrement fonctionnelle - tout ce qui est décrit dans le post précédent a été mis en œuvre. Tous les boutons fonctionnent maintenant et l'échange de fichiers est mis en œuvre.
- Le bouton Clear permet d'effacer la fenêtre de sortie,
- Le bouton Envoyer envoie la ligne de la fenêtre d'entrée vers la fenêtre de sortie,
- le bouton Start active l'échange de fichiers,
- Le bouton Stop arrête l'échange de fichiers.
C'est facile à vérifier. Nous créons le dossier C:\PyTS, plaçons le fichier de données DFile.csv et plaçons le fichier sémaphore SFile.tx. Notre programme Python détecte le fichier sémaphore, lit le fichier de données, l'affiche dans la fenêtre de sortie et supprime le fichier sémaphore.
Maintenant, vous pouvez changer les données dans DFile.csv et créer un nouveau fichier sémaphore, et le programme lira et sortira les nouvelles données.
Vous pouvez écrire un simple programme MQL, changer le dossier de lecture dans notre programme pour le dossier où MT écrit, et ensuite vous pouvez indépendamment estimer la vitesse d'échange, les sauts de données possibles et beaucoup d'autres choses.
La seule fonction responsable de l'échange de fichiers est FileExchange(). Il est implémenté dans un thread supplémentaire - le timer thread. Nous pouvons avoir des dizaines de ces threads et fonctions sans qu'ils n'affectent en rien l'application - c'est-à-dire que nous pouvons disposer de dizaines de canaux d'échange de données parallèles et indépendants.
Actuellement, la minuterie est réglée sur 10.0s - vous pouvez la régler sur 0.001s, voir la documentation.
Eh bien, si vous voulez vraiment mesurer la vitesse et d'autres caractéristiques - supprimez les fonctions debug print() dans le chemin d'échange - elles réduisent considérablement la vitesse.
Le code du programme Python se trouve dans la pièce jointe. Comme d'habitude, renommez-le en .py
Dossiers :
PyTS_1.0.txt  3 kb
 

Nous avons parlé de l'échange de fichiers CSV, mais la version 1.0 (voir le billet précédent) ne fait qu'ouvrir et lire des fichiers. La version suivante - 1.01, après quelques modifications, lit les fichiers CSV et les stocke dans la variable InData.

En fait, toutes les modifications :

def FileExchange():
    global Change
    if Change==True:
        if os.path.exists(SFile):
            print("SFile.txt is")
            if os.path.exists(DFile):
                print("DFile.csv is")
                InData = csv.reader(open(DFile, 'r'))
                data_read = [row for row in InData]
                print(data_read)
                os.remove(SFile)
            else:
                print("DFile.csv no")
        else:
            print("SFile.txt no")
        print('Вывод таймера')
        timer =threading.Timer(10.0,FileExchange)
        timer.start()

Seulement 3 lignes modifiées + connexion à la bibliothèque csv.

Et aussi contrôler la sortie du contenu CSV de la variable InData :

In [18]: [['04.08.2018 14:00', ' 1300', ' 1295', '1310', '1305', '100'], ['04.08.2018 14:10', ' 1307', ' 1297', '1320', '1315', '150']]

Maintenant les valeurs des lignes sont disponibles par des index, type - ligne, colonne.

Eh bien, et le code lui-même - voir la pièce jointe.

Dossiers :
PyTS_1.01.txt  3 kb
 
Yuriy Asaulenko:

Nous avons parlé de l'échange de fichiers CSV, mais la version 1.0 (voir le billet précédent) ne fait qu'ouvrir et lire des fichiers. La version suivante - 1.01, après quelques modifications, lit les fichiers CSV et les stocke dans la variable InData.

En fait, toutes les modifications :

Seulement 3 lignes modifiées + connexion à la bibliothèque csv.

Et aussi contrôler la sortie du contenu CSV de la variable InData :

Maintenant les valeurs des lignes sont disponibles par des index, type - ligne, colonne.

Eh bien, et le code lui-même - voir la pièce jointe.

L'utilisation du partage de fichiers n'est pas la meilleure solution. Les opérations sur les fichiers sont très lentes. Vous devez connecter un disque RAM pour un tel échange.
 
Grigoriy Chaunin:
L'utilisation de fichiers pour l'échange n'est pas la meilleure solution. Les opérations sur les fichiers sont très lentes. Vous devez connecter un disque RAM pour un tel échange.
Pouvez-vous indiquer les caractéristiques de performance de l'échange de fichiers (ce qui existe) et les tâches requises (ce qui est nécessaire) ?


Et je dirai, pour ma part, qu'ils sont extrêmement rapides, pas lents. Sans caractéristiques numériques, vos déclarations comme les miennes ne reposent sur rien, et n'ont donc aucun sens dans le cadre de la tâche à accomplir. Vous devez connaître les caractéristiques de l'échange de fichiers et les besoins du problème, et ce n'est qu'après les avoir comparées que vous pourrez tirer des conclusions valables. Puisque Yuri Asaulenko a décidé que les fichiers sont adaptés, je pense qu'il connaît mieux le volume prévu de transfert de données et le temps de traitement.

En général, les fichiers sur disque présentent un grand avantage par rapport à la mémoire volatile : ils sont stockés sur le disque d'arrêt et on peut y accéder après une semaine ou un an. Pour contrôler, analyser, vérifier, simplement observer.

 
Grigoriy Chaunin:
Utiliser des fichiers pour échanger n'est pas la meilleure solution. Les opérations sur les fichiers sont très lentes. Vous devez connecter un disque RAM pour un tel échange.

Cette question a déjà été abordée dans ce fil de discussion, dans des messages précédents, y compris l'utilisation possible de RAM-Disk, si nécessaire :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Comment créer un système de trading pour MT en utilisant Python.

Yuriy Asaulenko, 2018.08.01 19:33

Maintenant que nous avons le plan de l'application, il est temps de se lancer dans l'échange de données du terminal avec Python.
Tout d'abord, nous choisirons le type d'échange le plus simple - l'échange de données via des fichiers.
Maintenant, beaucoup de gens vont ricaner dans leur encrier, et en vain. Alors laissez-les faire).
1. Pendant la construction et le débogage de l'application, le partage de fichiers est le plus efficace, car il ne nécessite aucun effort de mise à niveau. Et une fois l'application construite, elle peut être remplacée par autre chose.
2. Dans la majorité des CT prêts à l'emploi, la vitesse d'échange des fichiers est plus que suffisante. 50-100 ms. Pas assez pour vous ?
3. Lors de l'échange de fichiers via RAM-Disk, le taux d'échange atteint 1,5 GByte/s. Il est impossible de mesurer la latence.
En somme, crachez-le et oubliez les adversaires).
En fait, un autre échange est prévu pour la dernière phase, si nous ou le sujet se montrent à la hauteur).
Également dans l'un des premiers messages du fil de discussion.
 

Je présente une nouvelle version de PyTS 1.02. Cette version est fonctionnellement équivalente à la version 1.01, mais les contrôles print() inutiles ont été supprimés du code et l'approche par classe a commencé à être mise en œuvre (Lénine a écrit - l'approche doit être basée sur les classes) - Le traitement des fichiers CSV est entièrement attribué à la classe - cCSVJob.

Fichier Zip en pièce jointe, où vous trouverez également toutes les versions précédentes du programme, ainsi que, dans le dossier PyTS, les fichiers nécessaires avec les données sources pour les tests.

Dossiers :
PyTS.zip  6 kb
Raison: