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

 

Hier, j'ai été soudainement fasciné par la base de donnéesSQLite. Il existe une interface Python toute prête pour cela -https://docs.python.org/3.6/library/sqlite3.html.

Par conséquent, jusqu'à tard dans la nuit, j'ai lu de la documentation à la fois sur la base de données elle-même et sur l'interface Python. Pour trouver une partie de la confusion, j'ai bâclé quelques programmes complètement inutiles pour SQLite. En général, fasciné. Gaspillé avant d'être négligé. Ce que j'ai appris pour la première fois est que la base de données SQLite peut être organisée en mémoire - avec une seule commande : conn = sqlite3.connect(":memory :") - ceci en Python. C'est tout ce qu'il faut. Puis dans quelques requêtes, créer des tables, et travailler.

J'avais l'habitude d'utiliser MS SQL Server ou BD Access dans le même but, et d'organiser la base de données en mémoire via les tables DataTable des bibliothèques NET. Et ici, une DLL de 1,5 Mo et une commande,))), et vous n'avez rien à faire.

Maintenant, à quoi ça sert ? Ce n'est pas nécessaire, c'est nécessaire. Pendant que votre système compte quelque chose, de nouvelles données arrivent de la bourse - le marché, les transactions, les cotations - et vous les insérez dans la base de données en mémoire. Et lorsque le système a besoin de nouvelles données, elles sont toutes là, à portée de main, en mémoire. Vous le prenez et l'utilisez. Tu n'as pas à attendre les tiques et autres. En outre, lorsque quelque chose se produit, vous pouvez toujours vous détacher des calculs et vous en occuper. Encore une fois, toutes les informations sont déjà là, dans votre mémoire. Bien sûr, vous avez besoin d'événements et de fils d'utilisateurs, mais ce n'est un problème nulle part.

Eh bien, alors, les informations de la base de données mémoire sont sauvegardées dans la base de données principale en arrière-plan.

Oh, et SQLite, bien que petit, supporte l'accès multi-utilisateurs en lecture/écriture. Et en général, presque tout est comme les adultes - il y a quelques limitations, mais dans la plupart des cas, elles sont insignifiantes ou n'interfèrent pas du tout.

 

J'ai commencé à faire de la base de données SQLite, ce n'est pas mal de faire quelque chose d'utile. Commençons par importer un fichier CSV dans la base de données.

Voici un extrait du fichier lui-même, environ 55 000 lignes au total.

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
SPFB.SBRF-12.17,1,01/09/17,10:01:00,18828.0000000,18838.0000000,18792.0000000,18838.0000000,25
SPFB.SBRF-12.17,1,01/09/17,10:02:00,18848.0000000,18858.0000000,18848.0000000,18858.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:03:00,18828.0000000,18828.0000000,18828.0000000,18828.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:04:00,18868.0000000,18868.0000000,18868.0000000,18868.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:05:00,18865.0000000,18879.0000000,18856.0000000,18879.0000000,10
SPFB.SBRF-12.17,1,01/09/17,10:06:00,18841.0000000,18851.0000000,18841.0000000,18851.0000000,3
SPFB.SBRF-12.17,1,01/09/17,10:07:00,18864.0000000,18864.0000000,18864.0000000,18864.0000000,1

Nous avons décrit précédemment comment importer un fichier CSV dans Python, nous ne nous arrêterons pas là. En conséquence, nous avons une chaîne de titre CSV et une chaîne de données.

Maintenant, le programme Python lui-même :

# строка заголовка CSV
title=csv.title
# строки данных CSV
data=csv.InData
# подсоединяемся к БД. Если БД отсутствует, создается новая с эти именем - наш случай.
con=sql.connect('csvdb.db')
# создаем курсор
cur=con.cursor()
# выполняем запрос создания таблицы SBER и ее полей (для упрощения все поля текстовые)
cur.execute("""create table SBER ('%s' text, '%s' text,
                                  '%s' text, '%s' text, '%s' text,
                                   '%s' text, '%s' text, '%s' text,
                                    '%s' text)""" % tuple(title))

#заполняем таблицу данными из CSV строк
cur.executemany("insert into SBER values (?,?,?,?,?,?,?,?,?)", data)
#Записываем данные в таблицу БД
con.commit()
#если БД больше не нужна, закрываем соединение.
con.close()

Nous regardons la table SBER dans SQLiteStudio :

Oui, tout le plaisir est à 3-4s du démarrage du programme, y compris l'ouverture et la lecture du fichier CSV. À propos, la taille du fichier de la base de données est inférieure à celle d'un fichier CSV similaire. La base de données complète est de 4,3 Mo, la taille du CSV est de 5,2 Mo.

Le reste se fait de la même manière)).

 

Continuons notre sujet impopulaire avec les indigènes.

Il y a régulièrement des fils de discussion sur le forum à propos de la lecture de données à partir de fichiers CSV. Rien que la semaine dernière, il y en a déjà eu deux - nous avons dû lire les deux dernières lignes.

La dernière fois, nous avons écrit des données à partir d'un fichier CSV dans la base de données, aujourd'hui nous allons résoudre le problème de la lecture des lignes de la base de données.

Il y a environ 55 000 lignes dans notre table dans la base de données. Essayons de lire non pas la dernière, mais la 27568e. Pour ce faire, nous allons écrire une requête SQL et l'envoyer à la base de données :

#отметка времени начала 
Tb=dt.datetime.today()
#готовим и передаем в БД SQL запрос
cur.execute('select * from SBER where id=27568')
#читаем ответ, одну строку
s=cur.fetchone()
#отметка времени конца
Te=dt.datetime.today()
#все распечатываем.
print('Tb=' + str(Tb) +', Te=' + str(Te))
print('Te-Tb='+str(Te-Tb))
print(s)

C'est tout. Nous avons obtenu le résultat :

Tb=2018-10-05 21:53:11.185492, Te=2018-10-05 21:53:11.188496
Te-Tb=0:00:00.003004
(27568, 'SPFB.SBRF-12.17', '1', '27/10/17', '10:55:00', '19692.0', '19708.0', '19691.0', '19704.0', '1123')

Temps d'exécution ~0.003004 sec.

Rendons la tâche plus difficile. Trouver les lignes, où Close=22730.0000000

Tout est identique, mais la requête est différente.

#это значение точно есть в строке №55420

cur.execute('select * from SBER where CLOSE=22730.0000000')
# читаем все строки, возвращаемые запросом.
s=cur.fetchall()

Le résultat :

Tb=2018-10-05 22:03:09.797261, Te=2018-10-05 22:03:09.859763
Te-Tb=0:00:00.062502
[(38393, 'SPFB.SBRF-12.17', '1', '16/11/17', '18:16:00', '22708.0', '22734.0', '22707.0', '22730.0', '673'),
 (38932, 'SPFB.SBRF-12.17', '1', '17/11/17', '13:47:00', '22713.0', '22730.0', '22707.0', '22730.0', '194'), (38962,
 'SPFB.SBRF-12.17', '1', '17/11/17', '14:22:00', '22725.0', '22736.0', '22725.0', '22730.0', '362'),
 ...
 ...
 ...
 (55288, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:18:00', '22723.0', '22732.0', '22723.0', '22730.0', '87'), 
(55289, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:19:00', '22727.0', '22730.0', '22726.0', '22730.0', '17'),
 (55382, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:05:00', '22731.0', '22731.0', '22730.0', '22730.0', '322'),
 (55420, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:48:00', '22735.0', '22741.0', '22727.0', '22730.0', '315')]

20 lignes ont été retournées. Temps d'exécution ~0.0625c.

Enfin, trouvons le prix le plus élevé dans la colonne (champ) FERMETURE

cur.execute('select max(CLOSE) from SBER')

Réponse B :

Tb=2018-10-05 22:11:28.979472, Te=2018-10-05 22:11:29.014472
Te-Tb=0:00:00.035000
('23540.0',) //это самая высокая цена.

Eh bien, et un temps d'exécution de -0.035s

Comme vous le voyez, tout est très simple et rapide. Si j'étais un consommateur de fichiers CSV, je me demanderais pourquoi je n'écrirais pas un DL avec 5-6 fonctions sous MT, et n'utiliserais pas la DB au lieu des fichiers CSV.

PS Le fichier CSV sur lequel la base de données a été manipulée est dans l'archive jointe il y a quelques posts.
 

Oui, la vie n'est pas facile pour les développeurs de MQL4-5. J'ai cherché sur Google s'il existait des solutions pour connecter MT à SQLite. L'article SQL5.com SQL ET MQL5 : TRAVAILLER AVEC LA BASE DE DONNE SQLITE directement à partir de MQ et de certains matériaux tiers. La base de données SQLite est trop compliquée, et les programmes ne sont pas si simples, contrairement aux programmes similaires en Python.

En fait, pour travailler avec SQLite pour la première fois, il est suffisant d'importer seulement 7-8 fonctions SQLite de haut niveau dans MQL. Le reste, pour la plupart, s'il est nécessaire, le sera dans un avenir lointain. Ce travail peut être effectué par un programmeur C++, dans le pire des cas, en quelques jours. Mais vous pouvez également essayer des solutions toutes faites.

PS Regardez de plus près l'articleSQL ET MQL5 : TRAVAILLER AVEC LA BASE DE DONNE SQLITE. En fait, peut-être que ça va marcher. Il n'y utilise que les DLL x86 pour préparer les DLL x64 pour MT. L'article date de 2014, après tout. Mais si je ne me trompe pas, il existe déjà une DLL SQLite x64. Vous pouvez essayer de compiler avec.

 

Yuriy Asaulenko:

Oui, ce n'est pas une vie facile pour les développeurs MQL4-5...... Je pense que c'est trop compliqué, et les programmes, contrairement aux programmes similaires en Python, ne sont pas simples.

Imho, en Python les problèmes ne sont pas moindres : il faut un historique, il faut un graphique à barres, il faut des indicateurs techniques... Je penserais aussi à un testeur et à un trading too.....

Eh bien, comme le dit le dicton : tous les feutres sont différents pour tous les goûts !

 
Igor Makanu:

imho vous avez autant de problèmes avec Python : vous avez besoin d'un historique, vous avez besoin d'un graphique à barres, vous avez besoin d'indicateurs techniques... Je penserais aussi à un testeur et à trading....

Eh bien, comme le dit le dicton : tous les feutres sont différents pour tous les goûts !

L'histoire n'est pas un problème, tout comme le fait de la gonfler. Les indicateurs techniques ne sont pas un problème, d'ailleurs je n'ai que mes propres indicateurs. Si vous en avez besoin, il existe des algorithmes simples.

J'ai un outil de dessin de barres en Python. En ai-je vraiment besoin pour mon autosystème ? - Je n'écris pas un terminal).

Et ce n'est pas le premier système de ce type, il y en a eu d'autres sur VB Excel, et sur C++, et sur C#. En fait, Python a été choisi en raison de l'étendue des bibliothèques et de l'absence de désir de multiplier les zoos à partir d'un mélange de différents langages et interfaces pour avoir accès à ces bibliothèques. De plus, Python permet la modélisation - c'est pour cela qu'il est conçu, et c'est très important dans le développement de systèmes. Disons que c'est un concurrent direct de MathLab).

 
Yuriy Asaulenko:

Question.

Est-il possible d'échanger mql-kim et python kanvas par un lien ?

C'est facile à faire en C++, mais je ne sais pas en Python.

 
Nikolai Semko:

Question.

Est-il possible d'échanger mql-kim et python kanvas par un lien ?

C'est facile à faire en C++, mais je ne sais pas en Python.

Je ne le fais pas.

 

Bonne nouvelle))) -MetaMetaTrader 5 build 1910 : Free Drag & Drop of Charts and .Net Library in MQL5 . Maintenant, lorsque la version bêta fonctionne, vous n'avez pas besoin d'écrire quoi que ce soit pour vous connecter à SQLite (ainsi qu'à de nombreuses autres bibliothèques). Vous n'aurez pas besoin sera DLL.

Les bibliothèques SQLite Net sont déjà disponibles -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Maintenant (ou plutôt plus tard, lorsque la version fonctionnelle de MT apparaîtra), nous pouvons oublier la communication de MT avec le système de négociation via l'échange de fichiers et communiquer via la base de données. Plus tôt dans ce fil, il a été démontré que c'est très rapide et plus que suffisant pour la plupart des systèmes.

System.Data.SQLite: Home
  • system.data.sqlite.org
For the most recent news and developments, please see the news page. About System.Data.SQLite System.Data.SQLite is an ADO.NET provider for SQLite. System.Data.SQLite was started by Robert Simpson. Robert still has commit privileges on this repository but is no longer an active contributor. Development and maintenance work is now mostly...
 
Yuriy Asaulenko:

Bonne nouvelle.)))-MetaTrader 5 build 1910 : Glisser-déposer gratuit des graphiques et des librairies .Net dans MQL5 . Désormais, lorsque la version bêta sera opérationnelle, vous n'aurez plus besoin d'écrire quoi que ce soit pour vous connecter à SQLite (ainsi qu'à de nombreuses autres bibliothèques). Vous n'aurez pas besoin sera DLL.

Les bibliothèques SQLite Net sont déjà disponibles -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Maintenant (ou plutôt plus tard, lorsque la version fonctionnelle de MT apparaîtra), nous pouvons oublier la communication de MT avec le système de négociation via l'échange de fichiers et communiquer via la base de données. Plus tôt dans ce fil de discussion, il a été démontré que cela est très rapide et plus que suffisant pour la plupart des systèmes.

Vous avez mal compris les nouvelles.

La prise en charge des bibliothèques .NET ne signifie pas que les contrôles de sécurité sur les DLL sont désactivés. Les contrôles DLL ont toujours fonctionné et fonctionneront toujours.

Nous vous laissons simplement charger .NET sans aucun bricolage. Ou plutôt, nous avons pris tout le travail désordonné et non trivial de communication avec la machine virtuelle .NET et avons caché tous les inconvénients.


Cependant, nous prévoyons depuis longtemps d'ajouter le support de SQlite dans MQL5. C'est fort probable.
Raison: