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.
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.
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
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.
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.
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.
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.
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);
}
Nehmen wir Windows zum Beispiel, nach Ausführung der Strategie wird im Verzeichnis
Der obige Code erstellt zunächst eine Datentabelle mit dem Namen
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
/*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.
Wenn Sie die Daten nicht dauerhaft auf der Festplatte speichern möchten, können Sie das
DBExec(":select 1,2,3");
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.