Verwenden Sie SQLite zum Erstellen der FMZ Quant-Datenbank [TOC]
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.
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.
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
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.
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.
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
Der obige Code erstellt zunächst eine Datentabelle mit dem Namen
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
/*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.
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");
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.