Verwenden Sie SQLite zum Erstellen der FMZ Quant-Datenbank

Schriftsteller:- Ich bin ein Idiot., Erstellt: 2022-04-24 11:32:35, Aktualisiert: 2022-04-24 16:21:38

Verwenden Sie SQLite zum Erstellen der FMZ Quant-Datenbank [TOC]

Abstract

Daten sind die Quelle des quantitativen Handels. Es ist sehr wichtig, eine große Menge an Daten effizient zu verwalten. Die Datenbank ist eine der besten Lösungen. Heutzutage ist die Anwendung der Datenbank zur standardmäßigen quantitativen Konfiguration verschiedener Tageshandels-, Hochfrequenzhandels- und anderer Strategien geworden. In diesem Artikel werden wir die integrierte Datenbank von FMZ Quant (FMZ.COM), einschließlich: wie Datentabellen erstellt, Daten gespeichert, Daten geändert, Daten gelöscht und Referenzdaten verwendet werden, sowie wie sie in der Praxis verwendet werden.

Datenbank auswählen

Wer mit der FMZ Quant Trading Platform vertraut ist, sollte wissen, dass vor diesem Zeitpunkt, wenn Sie Daten lokal für die Wiederverwendung speichern möchten, Sie nur die _G() -Funktion verwenden können. Jedes Mal, wenn Sie die Strategie stoppen, speichert die _G() -Funktion automatisch die erforderlichen Informationen. Wenn Sie jedoch immer komplexere formatierte Daten speichern möchten, ist die _G() -Funktion offensichtlich nicht geeignet, so dass viele Leute daran denken, ihre eigene Datenbank zu erstellen, um das Problem zu lösen.

Wenn es um selbstgebaute Datenbanken geht, kann jeder an Oracle, MySQL, KDB, OneTick, NoSQL denken... Dies sind alle ausgezeichnete Anwendungen auf Unternehmensebene, sowohl in Bezug auf Funktion als auch Leistung. Aber es gibt auch einige Probleme: es ist schwer zu starten, und die Konfiguration und Wartung sind schwierig. Für Einzelhändler im quantitativen Handel ist es ein bisschen wie eine Fliege auf dem Rad zu brechen. Selbst wenn Sie bereits mit diesen Anwendungen beginnen, werden nur wenige Funktionen von ihnen verwendet.

FMZ Quant eingebaute Datenbank

Als nächstes lernen wir die eingebaute leichte Datenbank von FMZ Quant kennen. DBExec ist eine in FMZ Quant integrierte relationale Datenverwaltungssystemoberfläche. Es wurde auf Basis von SQLite entwickelt und in C geschrieben. Es ist nicht nur klein in der Größe, wenig Ressourcenbesitz, sondern hat auch eine sehr schnelle Verarbeitungsgeschwindigkeit. Es eignet sich sehr gut für Finanzanalytik-Enthusiasten, um Datenverwaltung lokal zu implementieren, da es verschiedene Objekte (wie Plattformen, Datenquellen, Preise) in verschiedene Tabellen aufteilen und die Beziehungen zwischen den Tabellen definieren kann. Außerdem müssen Benutzer es nicht separat installieren und konfigurieren; solange sie die DBExec-Funktion anrufen, kann es direkt verwendet werden!

Darüber hinaus sind die Kosten für das Erlernen der SQLite-Sprache sehr niedrig, und die meisten Arbeiten an der Datenbank werden durch SQLite-Anweisungen durchgeführt. Die meisten Bedürfnisse können erfüllt werden, indem man sich mit der grundlegenden Syntax vertraut macht.

Grundlegende Syntax

Die Syntax von SQLite ist groß- und kleinbuchstaben-unempfindlich, aber einige Befehle sind groß- und kleinbuchstabenempfindlich, wie GLOB und glob, die unterschiedliche Bedeutungen haben. SQLite-Anweisungen können mit einem beliebigen Schlüsselwort wie SELECT, INSERT, UPDATE, DELETE, ALTER, DROP usw. beginnen, was beziehungsweise bedeutet: Daten extrahieren, Daten einfügen, Daten aktualisieren, Daten löschen, Datenbank ändern und Datentabelle löschen. Alle Anweisungen werden mit einem Semikolon beendet. Folgend sind Operationen wie das Erstellen, Hinzufügen, Löschen, Modifizieren und Abfragen einer einfachen Datenbank:

function main() {
    // create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null 
    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('A')"));
    Log(DBExec("INSERT INTO users(name) values('B')"));
    
    // delete: 
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // modify:
    Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
    
    // query:
    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 hat eine Nameneinführung, es sollte beachtet werden, dass die Systemreservierten Tabellen sind: kvdb, cfg, log, profit, chart. Das heißt, wenn Sie Tabellen erstellen, sollten Sie Systemreservierte Namen vermeiden.img

Strategiebeispiel

Nachdem wir die grundlegende Syntax von SQLite kennen, greifen wir an, während das Eisen heiß ist; verwenden Sie die FMZ Quant quantitative eingebaute Datenbank, um eine Instanz für das Sammeln und Verwenden von Tick-Daten zu erstellen.

Schritt 1: Docker aktualisierenWenn Sie einen Docker bereits heruntergeladen und verwendet haben, müssen Sie ihn zuerst löschen und dann wieder auf der Seite herunterladen und bereitstellen (https://www.fmz.com/m/add-node).

Schritt 2: Strategie entwickeln

function main() {
    // set contract 
    _C(exchange.SetContractType, 'swap');
    
    // create the 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 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in 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})`);
        // query all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // query all data 
    Log(DBExec('select * from tick'));
    
    // query the first data 
    Log(DBExec('select * from tick limit 1'));
    
    // query the first two 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'));
    
    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Schritt 3: Strategie für den EinsatzNehmen wir Windows als Beispiel. Nach Ausführung der Strategie wird ein Ordner mit der Bot-ID im Wörterbuch \logs\storage des Docker-Verzeichnisses generiert; öffnen Sie den Ordner und es wird eine Datei mit .db3 als Suffix angezeigt; diese Datei ist die Datei der integrierten Datenbank von FMZ Quant. 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 von der Plattform in der Schleife und fügt diese Daten in die Datentabelle tick ein. Wenn die Datenmenge in der Datentabelle 10 übersteigt, springt sie aus der Schleife. Schließlich verwenden Sie fünf SQLite-Befehle, um die Daten in der Datentabelle abzufragen, zu löschen und zu ändern. Und drucken Sie sie im Protokoll aus, wie im folgenden Bild gezeigt:img

Schritt 4: Statusleiste erstellenSchließlich fügen wir einige Code-Stücke hinzu, um eine Statusleiste für die Strategie zu erstellen, indem wir die Daten in der FMZ Quant-Datenbank erhalten, um die Daten intuitiver anzuzeigen.

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

Der obige Code erstellt aus den Daten in der Datenbank eine Binance Tick Data Tabelle. Das Spalten Feld in der Datenbank stellt die horizontale Zeile in der Statusleiste dar, und das Werte Feld stellt die vertikale Zeile in der Statusleiste dar. Wie unten gezeigt:img

Vollständiger Quellcode der Strategie

/*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;'));
    // set contract 
    _C(exchange.SetContractType, 'swap');

    // establish the 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 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in 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})`);
        // query all data 
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

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

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

    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));

    // delet 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'));

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

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

Klicken Sie auf den Link:https://www.fmz.com/strategy/265906, und Sie können den kompletten Quellcode kopieren.

In-Memory-Datenbank

Wenn die betriebenen Daten nicht dauerhaft auf der Festplatte gespeichert werden wollen, können Sie die:Symbol vor der SQL-Anweisung, um in der In-Memory-Datenbank zu arbeiten, und die Daten werden nach dem Neustart des Bots zurückgesetzt.

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

Schlussfolgerung

Die Datenbank kann nicht nur massive Daten tragen, sondern auch die Träume vieler quantitativer Handelsbegeisterter tragen. Die Verwendung der Datenbank ist keineswegs auf die in dem Artikel genannten Beispiele beschränkt. Für weitere Anwendungsmethoden können Sie sich auf das SQLite Tutorial und die Artikelreihe beziehen, die später auf FMZ Quant veröffentlicht werden.


Mehr