Bei der Erforschung, Gestaltung und Backtestung von Handelsstrategien ist die Unterstützung von Marktkursdaten unerlässlich. Es ist nicht realistisch, alle Daten von jedem Markt zu sammeln, schließlich ist die Datenmenge zu groß. Für den digitalen Währungsmarkt unterstützt die FMZ-Plattform begrenzte Backtestdaten für Börsen und Handelspare. Wenn Sie einige Börsen und Handelspare, die vorübergehend nicht von der FMZ-Plattform unterstützt wurden, backtesten möchten, können Sie eine benutzerdefinierte Datenquelle für den Backtest verwenden, aber diese Prämisse erfordert, dass Sie Daten haben. Daher besteht ein dringender Bedarf an einem Marktkursdaten-Sammelprogramm, das beständig und am besten in Echtzeit erhalten werden kann.
Auf diese Weise können wir verschiedene Bedürfnisse lösen, wie:
und viele mehr...
Wir planen, Python zu verwenden, um dies zu erreichen, warum?
Python's Pymongo Bibliothek
Denn Sie müssen Datenbank für dauerhafte Speicherung verwenden.MongoDB
und die Python-Sprache wird verwendet, um das Sammelprogramm zu schreiben, also ist die Treiberbibliothek dieser Datenbank erforderlich.
Installieren Sie einfachpymongo
auf Python.
MongoDB auf dem Hosting-Gerät installieren Zum Beispiel: MacOS installiert MongoDB, genauso wie Windows-System installiert MongoDB. Es gibt viele Tutorials online. Nehmen Sie die Installation von MacOS-System als Beispiel:
Herunterladen Download-Link:https://www.mongodb.com/download-center?jmp=nav#community
Zügel öffnen
Nach dem Herunterladen öffnen Sie das Verzeichnis:/usr/local
Umgebungsvariablen konfigurieren
Eingabe des Endgeräts:open -e .bash_profile
, schreibt man nach dem Öffnen der Akte:exportPATH=${PATH}:/usr/local/MongoDB/bin
Nach der Speicherung, im Terminal, verwendetsource .bash_profile
die Änderungen wirksam werden lassen.
Manuelle Konfiguration des Dateidatenbank-Dateiverzeichnisses und des Protokollverzeichnisses
Erstellen des entsprechenden Ordners im Verzeichnis/usr/local/data/db
- Ich weiß.
Erstellen des entsprechenden Ordners im Verzeichnis/usr/local/data/logs
.
Bearbeiten der Konfigurationsdateimongo.conf
:
#bind_ip_all = true # Any computer can connect
bind_ip = 127.0.0.1 # Local computer can access
port = 27017 # The instance runs on port 27017 (default)
dbpath = /usr/local/data/db # data folder storage address (db need to be created in advance)
logpath = /usr/local/data/logs/mongodb.log # log file address
logappend = false # whether to add or rewrite the log file at startup
fork = false # Whether to run in the background
auth = false # Enable user verification
Befehl:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
Der Sammler arbeitet als Python-Roboterstrategie auf der FMZ-Plattform. Ich habe gerade ein einfaches Beispiel implementiert, um die Ideen dieses Artikels zu zeigen.
Sammlerprogrammcode:
import pymongo
import json
def main():
Log("Test data collection")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Check if the table is deleted
arrDropNames = json.loads(dropNames)
if isinstance(arrDropNames, list):
for i in range(len(arrDropNames)):
dropName = arrDropNames[i]
if isinstance(dropName, str):
if not dropName in collist:
continue
tab = huobi_DB[dropName]
Log("dropName:", dropName, "delete:", dropName)
ret = tab.drop()
collist = huobi_DB.list_collection_names()
if dropName in collist:
Log(dropName, "failed to delete")
else :
Log(dropName, "successfully deleted")
# Create the records table
huobi_DB_Records = huobi_DB["records"]
# Request data
preBarTime = 0
index = 1
while True:
r = _C(exchange.GetRecords)
if len(r) < 2:
Sleep(1000)
continue
if preBarTime == 0:
# Write all BAR data for the first time
for i in range(len(r) - 1):
# Write one by one
bar = r[i]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
elif preBarTime != r[-1]["Time"]:
bar = r[-2]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
LogStatus(_D(), "preBarTime:", preBarTime, "_D(preBarTime):", _D(preBarTime/1000), "index:", index)
Sleep(10000)
Vollständige Strategieadresse:https://www.fmz.com/strategy/199120
Erstellen Sie einen Strategie-Roboter, der Daten nutzt.
Hinweis: Sie müssen die
Hier ist die Adresse:https://www.fmz.com/strategy/39066
import pymongo
import json
def main():
Log("Test using database data")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Query data printing
huobi_DB_Records = huobi_DB["records"]
while True:
arrRecords = []
for x in huobi_DB_Records.find():
bar = {
"High": x["High"],
"Low": x["Low"],
"Close": x["Close"],
"Open": x["Open"],
"Time": x["Time"],
"Volume": x["Volume"]
}
arrRecords.append(bar)
# Use the line drawing library to draw the obtained K-line data
ext.PlotRecords(arrRecords, "K")
LogStatus(_D(), "records length:", len(arrRecords))
Sleep(10000)
Es kann gesehen werden, dass der Strategie-Roboter-Code, der die Daten verwendet, nicht auf eine Austauschoberfläche zugreift. Die Daten werden durch den Zugriff auf die Datenbank erhalten. Das Market Collector-Programm zeichnet die aktuellen BAR-Daten nicht auf. Es sammelt die K-Line BAR im vollständigen Zustand. Wenn die aktuellen BAR-Echtzeitdaten benötigt werden, kann sie leicht geändert werden.
Der aktuelle Beispielcode dient nur der Demonstration. Beim Zugriff auf die Datensätze in der Tabelle in der Datenbank werden alle erhalten. Auf diese Weise werden mit zunehmender Zeit für die Datenerfassung immer mehr Daten gesammelt. Alle Abfragen beeinflussen die Leistung in einem gewissen Maße und können entworfen werden. Nur Daten, die neuerer sind als die aktuellen Daten, werden abfragt und den aktuellen Daten hinzugefügt.
Ausführen eines Docker-Programms
Auf dem Gerät, auf dem sich der Docker befindet, den MongoDB-Datenbankservice ausführen
Der Sammler läuft, um die BTC_USDT-Handelspaare der FMZ-Plattform zu sammeln. WexApp-Adresse: https://wex.app/trade?currency=BTC_USDT
Der Roboter A verwendet Datenbankdaten:
Der Roboter B verwendet Datenbankdaten:
WexApp Seite:
Wie Sie in der Abbildung sehen können, teilen Roboter mit unterschiedlichen IDs K-Liniendaten mit einer Datenquelle.
Aufgrund der leistungsstarken Funktionen der FMZ-Plattform können wir in jedem Zyklus leicht K-Liniendaten sammeln. Zum Beispiel möchte ich eine 3-minütige K-Linie sammeln, was ist, wenn die Börse keine 3-minütige K-Linie hat?
Wir ändern die Konfiguration des Sammlerroboters, die K-Zeile wird auf 3 Minuten gesetzt, und die FMZ-Plattform synthetisiert automatisch eine 3-minütige K-Zeile zum Sammlerprogramm.
Wir verwenden den Parameter zu löschenthe name of the table
, Einstellung: [
Starten Sie diecollector program
, und dann starten Sie diestrategy robot using the data
.
Sie können sehen, dass das K-Liniendiagramm gezeichnet ist, das Intervall zwischen BARs beträgt 3 Minuten, und jede BAR ist ein K-Linienbalken mit einer Periode von 3 Minuten.
In der nächsten Ausgabe werden wir versuchen, die Anforderungen an benutzerdefinierte Datenquellen umzusetzen.
Danke fürs Lesen!