Erfinder-Quantifizierungsdatenbanken mit SQLite

Schriftsteller: , Erstellt: 2021-03-26 17:09:32, Aktualisiert: 2023-09-24 19:36:26

[TOC]

img

Zusammenfassung

Daten sind die Quelle für die Quantifizierung von Transaktionen, und wie man große Mengen an Daten effizient verwalten kann, ist ein sehr wichtiger Punkt. Datenbanken sind eine der besten Lösungen, und die Anwendung von Datenbanken ist heute die Quantifizierungsstandardkonfiguration für verschiedene Strategien wie Intraday Trading, High-Frequency Trading.FMZ.COMDie Datenbank enthält Informationen, wie man Datenblätter erstellt, Daten speichert, Daten ändert, Daten löscht, Daten zitiert und wie man sie in der Praxis anwendet.

Wie wähle ich eine Datenbank aus?

Die Erfinder, die mit Quantifizierungsplattformen vertraut sind, sollten wissen, dass man zuvor nur mit der _G() Funktion Daten für lokale Wiederverwendungen speichern wollte. Jedes Mal, wenn die Politik gestoppt wurde, speicherte die _G() Funktion automatisch die benötigten Informationen.

Wenn es um die Datenbank selbst geht, denken Sie an Oracle, MySQL, KDB, OneTick, NoSQL... das sind alle sehr gute Anwendungen für Unternehmen, die sowohl in Funktionen als auch in Leistung sehr leistungsstark sind.

Erfinder quantifizieren ihre Datenbanken

Die Datenbank DBExec ist eine relationale Datenverwaltungssystem-Schnittstelle, die auf SQLite basiert und selbst in C geschrieben wurde. Sie ist nicht nur klein, ist wenig ressourcenaufwendig und schnell zu verarbeiten. Sie eignet sich hervorragend für Liebhaber der Quantifizierung von Finanzanalysen, da sie verschiedene Quadratobjekte (z. B. Börsen, Datenquellen, Preise) in verschiedene Tabellen aufteilen und Beziehungen zwischen Tabellen definieren kann.

Außerdem sind die Kosten für das Lernen der SQLite-Sprache sehr niedrig, und die meisten Arbeiten, die an der Datenbank ausgeführt werden, werden von SQLite-Anweisungen erledigt.

Grundlegende Grammatik

Die SQLite-Symmetrie ist nicht groß geschrieben, allerdings gibt es einige großartige Befehle, wie GLOB und glob, die unterschiedliche Bedeutungen haben. SQLite-Sätze können mit beliebigen Schlüsselwörtern beginnen, wie SELECT, INSERT, UPDATE, DELETE, ALTER, DROP usw. Sie besagen: Daten extrahieren, Daten einfügen, Daten aktualisieren, Daten löschen, Datenbanken ändern, Datenblätter löschen.

function main() {
    // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // 增加:
    Log(DBExec("INSERT INTO users(name) values('张三')"));
    Log(DBExec("INSERT INTO users(name) values('李四')"));
    
    // 删除:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // 修改
    Log(DBExec("UPDATE users SET name='王五' WHERE id=2"));
    
    // 查询
    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, die jeweils mit einem Namen gekennzeichnet sind. Es ist zu beachten, dass die Systemreservierungstabellen kvdb, cfg, log, profit, chart sind. Das heißt, die Systemreservierungsnamen sollten beim Erstellen der Tabelle vermieden werden.img

Strategiebeispiele

Nachdem wir die grundlegende Syntax von SQLite gelernt hatten, nutzten wir die heiße Eisenmaschine, um die von den Erfindern eingebaute Datenbank zu quantifizieren, um ein Beispiel zu erstellen, in dem Tick-Daten gesammelt und verwendet wurden.

Schritt 1: Aktualisieren des AdministratorsStellen Sie zunächst sicher, dass Sie die neueste Version des Hosts verwenden.https://www.fmz.com/m/add-nodeDie Seite wurde neu heruntergeladen und bereitgestellt.

Schritt 2: Strategie entwickeln

function main() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');
    
    // 创建数据表
    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);'
    ));
    
    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // 查询所有数据
    Log(DBExec('select * from tick'));
    
    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));
    
    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));
    
    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Schritt 3: Strategie umsetzenBei Windows wird nach dem Ausführen der Strategie in der Verwalter-Directory ein Ordner mit einem Roboter-Nummern-Namen in der Verwalter-Directory erzeugt. Der Ordner wird geöffnet und enthält eine Datei mit dem Suffix.db3 als Nachwort, die die Inventor-Datei für die Quantifizierung der eingebauten Datenbank darstellt.imgDer obige Code erstellt zunächst eine Datenbank mit dem Namen "Ticktick-Tabelle", fügt ihr dann ein Ticket-Datenfeld hinzu, holt dann in einem Loop Ticket-Daten von der Börse und fügt diese Daten in die Ticket-Tabelle ein, und springt aus der Loop, wenn der Datenbestand größer als 10 ist. Zuletzt werden die Daten in der Tabelle mit jeweils 5 SQLite-Befehlen abfragt, gelöscht oder geändert.img Schritt 4: Erstellen Sie eine StatuslisteUnd schließlich haben wir etwas Code hinzugefügt, um eine Statusliste für die Strategie zu erstellen, die Daten intuitiver darstellt, indem wir die Daten aus der Datenbank der Erfinder quantifizieren.

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Der obige Code erstellt eine Tick-Daten-Laser, die sich mit den Daten in der Datenbank auseinandersetzt. Die Tick-Columns in der Datenbank repräsentieren die Tick-Felder in der Statusliste und die Tick-Values in der Statusliste, wie in der folgenden Abbildung dargestellt:img

Vollständige 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;'));
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    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);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        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})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Klicken Sie auf den Linkhttps://www.fmz.com/strategy/388963Der vollständige Strategie-Code kann kopiert werden.

Datenbank im Speicher

Sie können vor SQL-Statements hinzugefügt werden, wenn die Daten, die Sie ausführen, nicht dauerhaft auf Disk gespeichert werden sollen:Die Symbole können in der Datenbank im Speicher ausgeführt werden, und die Daten werden nach dem Neustart des Roboters neu gesetzt.

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

Zusammenfassung

Eine Datenbank kann nicht nur riesige Datenmengen aufnehmen, sondern auch die großen Träume vieler Quantitative-Trading-Liebhaber erfüllen. Die Verwendung der Datenbank ist nicht auf die Beispiele beschränkt. Weitere Anwendungsmöglichkeiten finden sich in den SQLite-Tutorials und in den folgenden Artikeln der Erfinder der Quantitative-Trading-Serie.


Verwandt

Mehr

Dianwan99Das ist großartig. Der einzige Nachteil ist, dass die Daten nicht lokal, auf der Festplatte gespeichert werden können.

- Ich weiß.Die Datenbank unterstützt keine Wiederholung, oder?

Gott sei Dank.Sehr gut.

Sie können die lokale Datenbank ausprobieren

Ich danke Ihnen.