Erstellung eines Python-Handelssystems für MT. - Seite 5

 

Gestern war ich plötzlich von derSQLite-Datenbank fasziniert. Es gibt eine fertige Python-Schnittstelle dafür -https://docs.python.org/3.6/library/sqlite3.html.

Deshalb habe ich bis spät in die Nacht die Dokumentation sowohl zur Datenbank selbst als auch zur Python-Schnittstelle gelesen. Um die Verwirrung zu beseitigen, habe ich ein paar völlig nutzlose Programme für SQLite geschrieben. Generell fasziniert. Vergeudet vor vernachlässigt. Was ich zum ersten Mal gelernt habe, ist, dass SQLite DB im Speicher organisiert werden kann - mit einem Befehl: conn = sqlite3.connect(":memory:") - dies ist in Python. Das ist alles, was es braucht. Dann in ein paar Abfragen, Tabellen erstellen, und arbeiten.

Früher habe ich für denselben Zweck MS SQL Server oder BD Access verwendet und die Datenbank im Speicher über DataTable-Tabellen der NET-Bibliotheken organisiert. Und hier, eine 1,5 MB große DLL und ein Befehl,))), und Sie müssen nichts tun.

Wozu ist das gut? Es ist nicht notwendig, es ist notwendig. Während Ihr System dort etwas zählt, kommen neue Daten von der Börse - der Markt, Geschäfte, Notierungen - und Sie schieben sie in die Datenbank im Speicher. Und wenn das System neue Daten benötigt, sind sie alle im Speicher vorhanden. Sie heben es auf und benutzen es. Sie müssen nicht auf Zecken oder ähnliches warten. Und wenn etwas passiert, können Sie sich jederzeit von den Berechnungen ablenken und das Problem lösen. Auch hier sind alle Informationen bereits in Ihrem Gedächtnis gespeichert. Natürlich benötigen Sie Benutzerereignisse und Threads, aber das ist nirgendwo ein Problem.

Die Informationen aus der Speicherdatenbank werden also im Hintergrund in der Hauptdatenbank gespeichert.

Oh, und SQLite, obwohl klein, unterstützt den Lese- und Schreibzugriff mehrerer Benutzer. Und im Allgemeinen ist fast alles wie bei Erwachsenen - es gibt zwar einige Einschränkungen, aber in den meisten Fällen sind sie entweder unbedeutend oder stören überhaupt nicht.

 

Ich habe angefangen, eine SQLite-Datenbank zu erstellen, es ist nicht schlecht, etwas Nützliches zu tun. Beginnen wir damit, eine CSV-Datei in die Datenbank zu importieren.

Hier ist ein Ausschnitt aus der Datei selbst, insgesamt etwa 55 Tausend Zeilen.

<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

Wir haben den Import von CSV-Dateien in Python bereits beschrieben, wir werden hier nicht aufhören. Als Ergebnis haben wir eine CSV-Titelzeichenfolge und eine Datenzeichenfolge.

Jetzt das Python-Programm selbst:

# строка заголовка 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()

Wir sehen uns die SBER-Tabelle in SQLiteStudio an:

Ja, der ganze Spaß dauert 3-4 Sekunden nach dem Start des Programms, einschließlich des Öffnens und Lesens der CSV-Datei. Übrigens ist die Größe der Datenbankdatei kleiner als eine vergleichbare CSV-Datei. Die gesamte Datenbank ist 4,3 MB groß, die CSV-Größe beträgt 5,2 MB.

Nun, der Rest wird auf die gleiche Weise erledigt).

 

Lassen Sie uns unser unbeliebtes Thema mit den Einheimischen fortsetzen.

Im Forum gibt es regelmäßig Beiträge über das Lesen von Daten aus CSV-Dateien. Allein in der letzten Woche waren es schon zwei - wir mussten die vorletzten paar Zeilen lesen.

Letztes Mal haben wir Daten aus einer CSV-Datei in die Datenbank geschrieben, heute werden wir das Problem des Lesens von Zeilen aus der Datenbank lösen.

In unserer Datenbanktabelle befinden sich etwa 55 Tausend Zeilen. Versuchen wir, nicht einmal die letzte, sondern die 27568ste zu lesen. Zu diesem Zweck schreiben wir eine SQL-Abfrage und senden sie an die Datenbank:

#отметка времени начала 
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)

Das war's. Wir haben das Ergebnis:

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')

Ausführungszeit ~0,003004 sec.

Lassen Sie uns die Aufgabe schwieriger gestalten. Suche nach Zeilen, bei denen Close=22730.0000000

Alles ist gleich, aber die Abfrage sieht anders aus.

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

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

Das Ergebnis:

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')]

Es wurden 20 Zeilen zurückgegeben. Ausführungszeit ~0,0625c.

Schließlich suchen wir den höchsten Preis in der Spalte (Feld) CLOSE

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

B Antwort:

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

Nun, und eine Ausführungszeit von -0,035s

Wie Sie sehen, ist alles sehr einfach und schnell. Wäre ich ein CSV-Dateikonsument, würde ich denken, warum sollte ich nicht eine DL mit 5-6 Funktionen unter MT schreiben und DB anstelle von CSV-Dateien verwenden.

PS Die CSV-Datei, mit der die Datenbank manipuliert wurde, befindet sich in dem Archiv, das vor einigen Beiträgen angehängt wurde.
 

Ja, das Leben ist nicht einfach für MQL4-5-Entwickler. Ich habe gegoogelt, ob es Lösungen für die Verbindung von MT mit SQLite gibt. Der SQL5.com Artikel SQL AND MQL5: WORKING WITH SQLITE DATABASE direkt von MQ und einige Materialien von Drittanbietern. Die SQLite-Datenbank ist zu kompliziert, und die Programme sind im Gegensatz zu ähnlichen Programmen in Python nicht so einfach.

Um zum ersten Mal mit SQLite zu arbeiten, genügt es, nur 7-8 High-Level-SQLite-Funktionen in MQL zu importieren. Der Rest wird größtenteils erst in ferner Zukunft benötigt werden. Diese Arbeit kann von einem C++-Programmierer im schlimmsten Fall in ein paar Tagen erledigt werden. Sie können aber auch vorgefertigte Lösungen ausprobieren.

PS Schauen Sie sich den ArtikelSQL AND MQL5: WORKING WITH SQLITE DATABASE genauer an. Vielleicht klappt es ja sogar. Es verwendet dort nur die x86-DLL, um die x64-DLL für MT vorzubereiten. Der Artikel ist immerhin von 2014. Aber, wenn ich mich nicht irre, gibt es bereits eine x64 SQLite DLL. Sie können versuchen, damit zu kompilieren.

 

Yuriy Asaulenko:

Ja, es ist kein einfaches Leben für MQL4-5-Entwickler...... Ich denke, es ist zu kompliziert, und die Programme sind im Gegensatz zu ähnlichen Programmen in Python nicht einfach.

Imho sind die Probleme in Python nicht weniger: Sie brauchen eine Historie, Sie brauchen ein Balkendiagramm, Sie brauchen technische Indikatoren... Ich würde auch über einen Tester und Trading zu.... nachdenken.

Wie heißt es doch so schön: Filzstifte sind für jeden Geschmack etwas anderes!

 
Igor Makanu:

imho haben Sie genauso viele Probleme mit Python: Sie brauchen eine Historie, Sie brauchen ein Balkendiagramm, Sie brauchen technische Indikatoren... Ich würde auch über einen Tester und trading.... nachdenken

Wie heißt es doch so schön: Filzstifte sind für jeden Geschmack etwas anderes!

Die Geschichte ist kein Thema, und sie aufzupumpen auch nicht. Technische Indikatoren sind kein Thema, außerdem habe ich nur meine eigenen Indikatoren. Wenn Sie sie brauchen, gibt es dort einfache Algorithmen.

Ich habe ein Werkzeug zum Zeichnen von Balken in Python. Brauche ich das wirklich für mein Autosystem? - Ich schreibe kein Terminal.)

Und es ist nicht das erste derartige System, es gab schon früher VB Excel, C++ und C#. Eigentlich wird Python gewählt, weil die Bibliotheken sehr umfangreich sind und man nicht den Wunsch hat, den Zoo aus einer Mischung verschiedener Sprachen und Schnittstellen zu vervielfältigen, um einen Zugang zu diesen Bibliotheken zu erhalten. Außerdem kann man mit Python modellieren - dafür ist es gedacht, und das ist bei der Systementwicklung sehr wichtig. Nehmen wir an, es ist ein direkter Konkurrent von MathLab).

 
Yuriy Asaulenko:

Frage.

Ist es möglich, mql-kim und python kanvas über einen Link auszutauschen?

In C++ ist das leicht zu machen, aber in Python weiß ich es nicht.

 
Nikolai Semko:

Frage.

Ist es möglich, mql-kim und python kanvas über einen Link auszutauschen?

In C++ ist das leicht zu machen, aber in Python weiß ich es nicht.

Ich weiß es nicht.

 

Gute Nachrichten))) -BetaMetaTrader 5 build 1910: Kostenloses Drag & Drop von Charts und .Net Library in MQL5 . Wenn die Beta-Version funktioniert, brauchen Sie nichts mehr zu schreiben, um eine Verbindung zu SQLite (und vielen anderen Bibliotheken) herzustellen. Sie brauchen keine wird sein DLLs.

SQLite Net-Bibliotheken sind bereits verfügbar -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Jetzt (oder eher später, wenn die Arbeitsversion von MT erscheint) können wir die Kommunikation von MT mit dem Handelssystem über Dateiaustausch vergessen und über die Datenbank kommunizieren. Weiter oben in diesem Thread wurde gezeigt, dass es sehr schnell ist und für die meisten Systeme mehr als ausreicht.

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:

Gute Nachrichten.)) -BetaMetaTrader 5 build 1910: Kostenloses Drag & Drop von Charts und .Net Bibliotheken in MQL5 . Wenn die Beta-Version in Betrieb ist, müssen Sie nichts mehr schreiben, um eine Verbindung zu SQLite (und vielen anderen Bibliotheken) herzustellen. Sie brauchen keine wird sein DLLs.

SQLite Net-Bibliotheken sind bereits verfügbar -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Jetzt (oder eher später, wenn die Arbeitsversion von MT erscheint) können wir die Kommunikation von MT mit dem Handelssystem über Dateiaustausch vergessen und über die Datenbank kommunizieren. Weiter oben in diesem Thread wurde gezeigt, dass dies sehr schnell ist und für die meisten Systeme mehr als ausreicht.

Sie haben die Nachrichten falsch verstanden.

Die Unterstützung von .NET-Bibliotheken bedeutet nicht, dass die Sicherheitskontrollen für DLLs deaktiviert sind. DLL-Kontrollen haben immer funktioniert und werden immer funktionieren.

Wir lassen Sie einfach .NET laden, ohne dass Sie etwas tun müssen. Oder besser gesagt, wir haben die ganze unordentliche und nicht triviale Arbeit der Kommunikation mit der virtuellen .NET-Maschine übernommen und alle Unannehmlichkeiten versteckt.


Wir haben jedoch seit langem geplant, SQlite-Unterstützung in MQL5 hinzuzufügen. Höchstwahrscheinlich werden wir das tun.