Es gibt ein paar wichtige Ergänzungen (und Verbesserungsvorschläge:))
Der Autor verwendet die Funktion sqlite_open(), aber es gibt eine flexiblere Funktion sqlite_open_v2(), die mit Öffnungsflags arbeiten kann, was bedeutet: - Kontrolle der Zugriffsbegrenzung auf die Datenbankdatei; - Erstellen von temporären In-Memory-Datenbanken; - Arbeiten mit der Datenbank per URI, nicht nur im lokalen Dateisystem, etc.
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_CREATE 0x00000004 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* Nur VFS */ #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* Nur VFS */ #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* Nur VFS */ #define SQLITE_OPEN_URI 0x00000040 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_MEMORY 0x00000080 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_MAIN_DB 0x00000100 /* Nur VFS */ #define SQLITE_OPEN_TEMP_DB 0x00000200 /* Nur VFS */ #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* Nur VFS */ #define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* Nur VFS */ #define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* Nur VFS */ #define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* Nur VFS */ #define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* Nur VFS */ #define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok für sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* Nur VFS */
2. Ich habe sqlite verwendet, um das Problem der Beschleunigung der EA-Optimierung zu lösen, wenn ein Indikator verwendet wird, der "schwer" in Berechnungen ist. Die logische Lösung in einer solchen Situation besteht darin, die Indikatorwerte für den Optimierungszeitraum während des ersten Laufs in der Datenbank zu speichern und bei späteren Läufen die bereits berechneten Werte direkt aus der Datenbank zu extrahieren. Wenn Sie also die Sqlite-Engine in der "Standardform" verwenden, beginnt der Prozess des Sendens einer Menge von INSERT- und SELECT-Abfragen sehr viel Zeit in Anspruch zu nehmen. In der Praxis hat sich herausgestellt, dass der Ausweg darin besteht, entweder 1) eine In-Memory-Datenbank zu verwenden, was nicht immer gut ist, wenn wir die Daten für später aufbewahren wollen, oder 2) #pragma-Direktiven der SQL-Engine.
Die zweite Option ist vorzuziehen, da sie ein Dump der Datenbank vom RAM auf die Festplatte überflüssig macht. Dies geschieht folgendermaßen: Bevor man die erste Tabelle in der Datenbank erstellt, muss man ihr die folgenden Abfragen schicken:
"PRAGMA temp_store = MEMORY;" "PRAGMA page_size = 65536;" "PRAGMA cache_size = 16384;" "PRAGMA journal_mode = OFF;" "PRAGMA locking_mode = EXCLUSIVE;" "PRAGMA synchronous = OFF;"
Nun, und danach können Sie
"CREATE TABLE IF NOT EXISTS"usw.
Viel Glück für alle!
Es gibt ein paar wichtige Ergänzungen (und Verbesserungsvorschläge:))
Der Autor verwendet die Funktion sqlite_open(), aber es gibt eine flexiblere Funktion sqlite_open_v2(), die mit Öffnungsflags arbeiten kann, was bedeutet: - Kontrolle der Zugriffsbegrenzung auf die Datenbankdatei; - Erstellen von temporären In-Memory-Datenbanken; - Arbeiten mit der Datenbank per URI, nicht nur im lokalen Dateisystem, usw.
2. Ich habe sqlite verwendet, um das Problem der Beschleunigung der EA-Optimierung zu lösen, wenn ein Indikator verwendet wird, der "schwer" in Berechnungen ist. Die logische Lösung in einer solchen Situation besteht darin, die Indikatorwerte für den Optimierungszeitraum während des ersten Laufs in der Datenbank zu speichern und bei späteren Läufen die bereits berechneten Werte direkt aus der Datenbank zu extrahieren. Wenn Sie also die Sqlite-Engine in der "Standardform" verwenden, beginnt der Prozess des Sendens einer Menge von INSERT- und SELECT-Abfragen sehr viel Zeit in Anspruch zu nehmen. In der Praxis hat sich herausgestellt, dass der Ausweg darin besteht, entweder 1) eine In-Memory-Datenbank zu verwenden, was nicht immer gut ist, wenn wir die Daten für später aufbewahren wollen, oder 2) #pragma-Direktiven der SQL-Engine.
Die zweite Option ist vorzuziehen, da sie ein Dump der Datenbank vom RAM auf die Festplatte überflüssig macht. Dies geschieht auf folgende Weise: Bevor Sie die erste Tabelle in der Datenbank erstellen, sollten Sie die folgenden Abfragen an die Datenbank senden:
Nun, und danach können Sie
usw.
Viel Glück an alle!
Die Daten der Indikatoren, die beim Ausführen des Testers abgelesen werden, sind von Natur aus ein einfaches Array, ein Stream mit sequentiellem Zugriff, so dass es überflüssig und nicht rationell ist, sie in der SQL-Basis zu speichern und zu lesen.
Das Gleiche gilt für die Liste der Handelsoperationen, die der Autor des Artikels als Beispiel für eine SQLite-Anwendung vorschlägt.
Wir müssen uns also darüber im Klaren sein, dass die Effizienz der Verwendung von relationalen, mehrfach verknüpften Datenmodellen in erster Linie von den zu lösenden Aufgaben abhängt, und in diesen Beispielen kann sie IMHO nur "an den Ohren gezogen" werden.
.
Die Daten der Indikatorablesungen während des Testerlaufs sind ihrer Natur nach ein einfaches Array, ein Stream mit seriellem Zugriff, so dass es redundant und nicht rationell ist, sie in der SQL-Basis zu speichern und zu lesen.
Lesen Sie es noch einmal, auch wenn es überflüssig und nicht sinnvoll ist: um den Expert Advisor zu optimieren
Es ist möglich, es zu verwenden, und es ist gut. Eine weitere Sache ist, dass SQLite nicht für ernsthafte Projekte verwendet werden sollte. Ich würde es auf jeden Fall nicht empfehlen. Ich selbst bin mehr als einmal mit dem Problem von Kollisionen konfrontiert worden. Wenn zum Beispiel ein Handelsroboter an verschiedene Charts angeschlossen ist, aber dieselbe Basis verwendet, und der Zugriff auf eine Allzwecktabelle erfolgt (z. B. Registrierung/Änderung von Sitzungen, Konten), dann erhalten Sie auf jeden Fall eine Fehlermeldung wie "Tabelle gesperrt". Dabei spielt es keine Rolle, dass alle Transaktionen abgeschlossen sind, Cursor geschlossen sind und die Datenbank im gemeinsamen Modus geöffnet wurde. Dieses Problem ist auch den SQLite-Entwicklern bekannt.
Meiner Meinung nach ist MS Access die beste der Dateidatenbanken mit SQL-Unterstützung. Man kann noch so sehr auf die Small-Soft-Leute schimpfen, aber ich habe SQLite zugunsten von MS Access aufgegeben und bereue es nicht im Geringsten. Der OleDB-Treiber Jet 4.0 ist auch unter Win98 installiert, so dass die Projekte unter allen OC-Windows funktionieren.
Zunächst einmal herzlichen Dank für Ihre Arbeit!
Ich portierte es auf mql4 mit Erfolg! (einige #property strict, lösen die Kompilierungsfehler.)
Und da ich eine 32bit-Plattform benutze, musste ich einige 64bit-bezogene Importfunktionen auskommentieren und löschen. Das Terminal benutzt Early Binding, so dass die 64bit-dll auch versucht, beim Laden des Programms zu laden. (obwohl sie nicht benutzt wird, nur die 32bit.dll.).Das machte einen Fehler.
Aber wie auch immer, ich mag deine Implementierung! (Ich wünschte, ich könnte ein so gutes Programm schreiben wie Ihres).
Das Skript funktioniert nicht, out of the box funktioniert nicht, um den Papierkorb solche Projekte.
In der Konsole gibt es https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png
В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png
Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png
Das Skript funktioniert nicht, es funktioniert nicht ohne Weiteres.
rauchen Sie das Handbuch, wenn Sie nicht verstehen, was zu tun ist und wie man es tut.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel SQL und MQL5: Mit der SQLite Datenbank arbeiten :
Dieser Beitrag richtet sich an Entwickler, die in ihren Projekten gerne SQL verwenden möchten. Er erklärt die Funktionsweise und Vorteile von SQLite. Für diesen Beitrag sind keine speziellen Kenntnisse der SQLite-Funktionen nötig, doch ein Grundverständnis von SQL wäre durchaus hilfreich.
Viele Entwickler überlegen sich in ihren Projekten mit Datenbanken zur Datenspeicherung zu arbeiten und sind dennoch zögerlich diese Überlegungen auch umzusetzen, da sie wissen, wie viel extra Zeit die Installierung des SQL-Servers womöglich in Anspruch nehmen kann. Und obwohl diese Installierung für Programmierer kein großes Problem darstellt (wenn aus anderen Gründen bereits ein Datenbank-Managementsystem (DBMS) installiert worden ist), ist sie für den gemeinen Anwender zweifellos ein Hindernis, das so groß sein kann, dass er letzten Endes davon absieht, diese Software überhaupt zu installieren.
Daher haben sich viele Entwickler entschieden, sich nicht mit einem DBMS abzugeben, da sie erkannt haben, dass die Lösungen, an denen sie derzeit arbeiten, von nur wenigen Menschen genutzt werden. Als Folge davon arbeiten sie lieber mit Dateien (und müssen dabei, angesichts der unterschiedlichen verwendeten Daten, oft mit mehr als einer Datei arbeiten): CSV, weniger häufig XML oder JSON oder binäre Datendateien mit strikter Strukturgröße, usw.
Doch die gute Nachricht ist: es gibt eine tolle Alternative zum SQL-Server! Und man muss dazu noch nicht einmal zusätzliche Software installieren, da alles lokal in Ihrem Projekt erledigt wird und Sie trotzdem noch die volle Leistung von SQL nutzen können. Wir sprechen von SQLite.
Autor: o_O