Erstellen einer quantitativen Datenbank von FMZ mit SQLite

Schriftsteller:Lydia., Erstellt: 2022-11-09 11:40:34, Aktualisiert: 2023-09-20 10:55:14

img

Abstract

Daten sind die Quelle des quantitativen Handels, wie eine große Menge an Daten effizient zu verwalten ist ein sehr wichtiges Bindeglied, Datenbank ist eine der besten Lösungen, heutzutage ist die Anwendung der Datenbank der quantitative Standard für alle Arten von täglichem Handel, Hochfrequenzhandel und andere Strategien.https://www.fmz.com), einschließlich: wie Datentabellen erstellt, Daten gespeichert, Daten geändert, Daten gelöscht, Referenzdaten und wie sie in der Praxis angewendet werden.

Wie wählt man die Datenbank aus?

Wer mit der FMZ Quant-Plattform vertraut ist, sollte wissen, dass man vor dem Speichern von Daten zur lokalen Wiederverwendung nur die _G() -Funktion verwenden kann, die jedes Mal, wenn man die Strategie stoppt, automatisch die benötigten Informationen speichert. Wenn man jedoch immer komplexere formatierte Daten speichern möchte, ist die _G() -Funktion offensichtlich nicht sehr anwendbar, daher haben sich viele Menschen entschieden, ihre eigene Datenbank zu erstellen, um dieses Problem zu lösen.

Wenn es um selbstgebaute Datenbanken geht, muss man an Oracle, MySQL, KDB, OneTick, NoSQL denken... Dies sind sowohl in Funktion als auch in Leistung sehr ausgezeichnete Anwendungen auf Unternehmensebene. Allerdings gibt es auch mehrere Probleme: Es ist schwierig zu starten, und die Konfiguration ist umständlich und die Wartung ist schwierig. Für Einzelhandelsquantitative Händler ist es ein bisschen wie Fliegen mit Kanonen zu schießen. Selbst wenn sie anfangen, verwenden sie nur einen kleinen Teil der Funktionen.

Eingebettete Datenbank von FMZ Quant

Als nächstes werfen wir einen Blick auf die Light-Datenbank, die von FMZ Quant integriert wurde. DBExec ist eine integrierte relationale Datenverwaltungssystemoberfläche von FMZ Quant. Es wurde auf Basis von SQLite entwickelt und ist in C geschrieben. Es ist nicht nur klein in der Größe, wenig Ressourcenverbrauch, sondern auch schnell in der Verarbeitung. Es ist sehr geeignet für finanzielle quantitative Analyse-Enthusiasten, Datenverwaltung lokal zu implementieren, da verschiedene Objekte (wie Börsen, Datenquellen und Preise) in verschiedene Tabellen aufgeteilt und Beziehungen zwischen Tabellen definiert werden können. Außerdem müssen Benutzer sie nicht separat installieren und konfigurieren. Sie können sie direkt verwenden, indem sie die DBExec) Funktion anrufen!

Darüber hinaus ist es sehr einfach, die SQLite-Sprache zu lernen, und die meisten Arbeiten, die an der Datenbank durchgeführt werden, werden durch SQLite-Anweisungen abgeschlossen.

Grundlegende Grammatik

Die Grammatik von SQLite ist groß- und kleinbuchstaben-unempfindlich, obwohl es einige großbuchstabenempfindliche Befehle wie GLOB und glob gibt, die verschiedene Bedeutungen darstellen. SQLite-Anweisungen können mit jedem Schlüsselwort wie SELECT, INSERT, UPDATE, DELETE, ALTER, DROP usw. beginnen, was bedeutet: extrahieren Daten, Daten einfügen, Daten aktualisieren, Daten löschen, Datenbank ändern und Datentabelle löschen. Alle Anweisungen werden mit englischen Semikolonen beendet. Nachfolgend finden Sie eine einfache Datenbank-Erstellung, Add, Delete, Change und Check-Operationen:

function main() {
    // Create: If the "users" table does not exist, create one, "id" is an integer and is incremented automatically, "name" is in text form and is not empty
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // Add:
    Log(DBExec("INSERT INTO users(name) values('Zhang San')"));
    Log(DBExec("INSERT INTO users(name) values('Li Si')"));
    
    // Delete:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // Modify:
    Log(DBExec("UPDATE users SET name='Wang Wu' WHERE id=2"));
    
    // Search:
    Log(DBExec('select 2, ?, ?, ?, ?', 'ok', true,9.8,null));
    Log(DBExec('select * from kvdb'));
    Log(DBExec('select * from cfg'));
    Log(DBExec('select * from log'));
    Log(DBExec('select * from profit'));
    Log(DBExec('select * from chart'));
    Log(DBExec("selEct * from users"));
}

Eine Datenbank enthält in der Regel eine oder mehrere Tabellen, jede Tabelle wird durch einen Namen identifiziert, beachten Sie, dass die System reservierten Tabellen sind: kvdb, cfg, log, Gewinn, Chart. dh bei der Erstellung von Tabellen sollten Sie die System reservierten Namen vermeiden.

img

Beispiele für Strategien

Nachdem wir die Grundgrammatik von SQLite gelernt haben, schlagen wir, während das Eisen heiß ist, um eine Instanz zu erstellen, die Tick-Daten sammelt und verwendet, indem wir die integrierte Datenbank von FMZ Quant verwenden.

Schritt 1: Aktualisieren des Dockers

Zuerst stellen Sie sicher, dass Sie die neueste Version des Dockers verwenden. Wenn Sie den Docker zuvor heruntergeladen und verwendet haben, müssen Sie ihn zuerst löschen und dann erneut herunterladen und erneut aufhttps://www.fmz.com/m/add-node page.

Schritt 2: Erstellen Sie die Strategie

function main() {
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');
    
    // Create data table
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,', 
        'Low FLOAT not NULL,', 
        'Sell FLOAT not NULL,', 
        'Buy FLOAT not NULL,', 
        'Last FLOAT not NULL,', 
        'Volume INTEGER not NULL,', 
        'Time INTEGER not NULL);'
    ));
    
    // Get 10 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to the tick table
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // Search all data
    Log(DBExec('select * from tick'));
    
    // Search the first data
    Log(DBExec('select * from tick limit 1'));
    
    // Search first two pieces of data
    Log(DBExec('select * from tick limit 0,2'));
    
    // Delete the first data
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // Modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Schritt 3: Umsetzung der Strategie

Nehmen wir Windows zum Beispiel, nach Ausführung der Strategie wird im Verzeichnis \logs\storage des Docker-Verzeichnisses ein Ordner mit dem Namen der Roboternummer erstellt. Öffnen Sie den Ordner und es gibt eine Datei mit dem Suffix . db3, die die Datei der integrierten Datenbank FMZ Quant ist. Wie in der folgenden Abbildung gezeigt:

img

Der obige Code erstellt zunächst eine Datentabelle mit dem Namen tick, fügt dann das Tick-Datenfeld zu der Tabelle hinzu, holt dann die Tick-Daten aus dem Austausch in der Schleife und fügt die Daten in die Datentabelle tick ein. Gleichzeitig beurteilen wir, dass die Datenmenge in der Datentabelle 10 übersteigt, dann springen wir aus der Schleife. Schließlich verwenden wir 5 SQLite-Befehle, um die Daten in der Datentabelle zu suchen, zu löschen und zu ändern. Und drucken Sie sie in den Protokollen aus, wie im folgenden Bild gezeigt:

img

Schritt 4: Erstellen der Statusleiste

Schließlich fügen wir etwas Code hinzu, um eine Statusleiste für die Strategie zu erstellen, indem wir die Daten in der FMZ Quant-Datenbank erhalten, um die Daten visueller anzuzeigen, der hinzufügende Code zeigt wie folgt:

    // Create status bar
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Der obige Code erstellt eine Binance Tick data Tabelle durch die Daten in der Datenbank. Das Columns Feld in der Datenbank repräsentiert die Säulen in der Statusleiste, und das Values Feld repräsentiert die Columns in der Statusleiste. Wie in der Abbildung unten gezeigt:

img

Vollständiger Strategiecode

/*backtest
start: 2020-07-19 00:00:00
end: 2020-08-17 23:59:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"LTC_USDT"}]
*/

function main() {
    Log(DBExec('DROP TABLE tick;'));
    // Subscribe contracts
    _C(exchange.SetContractType, 'swap');

    // Create data table
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,',
        'Low FLOAT not NULL,',
        'Sell FLOAT not NULL,',
        'Buy FLOAT not NULL,',
        'Last FLOAT not NULL,',
        'Volume INTEGER not NULL,',
        'Time INTEGER not NULL);'
    ));

    // Obtain 10 pieces of tick data
    while (true) {
        let tick = exchange.GetTicker();
        // Add data to the tick table
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // Search all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // Search all data
    Log(DBExec('select * from tick'));

    // Search the first data
    Log(DBExec('select * from tick limit 1'));

    // Search first two pieces of data
    Log(DBExec('select * from tick limit 0,2'));

    // Delete the first data
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // Modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // Search all data
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // Create status bar
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Klicken Sie auf diesen Link.https://www.fmz.com/strategy/388963um den gesamten Strategiecode zu kopieren.

Speicherdatenbank

Wenn Sie die Daten nicht dauerhaft auf der Festplatte speichern möchten, können Sie das : Symbol vor der SQL-Anweisung hinzufügen, um in der Speicherdatenbank zu arbeiten, und die Daten werden nach dem Neustart des Roboters zurückgesetzt.

DBExec(":select 1,2,3");

Zusammenfassung

Die Datenbank kann nicht nur massive Daten tragen, sondern auch den Traum vieler quantitativer Handelsbegeisterter tragen. Die Verwendung von Datenbanken ist keineswegs auf die Beispiele in diesem Artikel beschränkt.


Verwandt

Mehr