xchangeList()
GetExchangeList()
gibt die Liste der unterstützten Austauschstellen und die erforderlichen Konfigurationsinformationen zurück.
Parameter Keine
Rücklaufwert
{
"code": 0,
"data": {
"result": {
"exchanges": [{
"website": "https://www.huobi.pro/",
"name": "Huobi",
"priority": 1,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}]",
"eid": "Huobi",
"logo": "huobi.png",
"id": 1
}, {
"website": "https://www.kex.com/",
"name": "KEX",
"priority": -99,
"meta": "[{"desc": "Access Key", "required": true, "type": "string", "name": "AccessKey", "label": "Access Key"}, {"encrypt": true, "name": "SecretKey", "required": true, "label": "Secret Key", "type": "password", "desc": "Secret Key"}, {"encrypt": true, "required": true, "type": "password", "name": "Password", "label": "Trading Password"}]",
"eid": "KEX",
"logo": "",
"id": 43
},
...
]
},
"error": null
}
}
DeleteNode(Nid)
Löscht den Dockerknoten (ID
istNid
) entspricht derAPI KEY
auf Anfrage des Kontos der FMZ Quant Trading Plattform.
ParameterNid
ist des ganzen Typs, nämlich der DockerID
.
Rückgabewert
{
"code":0,
"data":{
"result":true,
"error":null
}
}
DeleteRobot(RobotId, DeleteLogs)
Löscht den Roboter mit der angegebenen ID (Roboter)ID
: RobotId
) entspricht derAPI KEY
im Antrag unter dem FMZ Quant-Konto.
ParameterRobotId
ist des ganzen Typs, nämlich der RoboterID
wird gestrichen.DeleteLogs
ist von Boole-Typ;DeleteLogs
die Entscheidung zu treffen, ob das Protokoll gelöscht wird oder nicht;true
Angabe, dass das Protokoll gelöscht wird.
Rückgabewert
// Return value after successful deletion
{
"code": 0,
"data": {
"result": 0,
"error": null
}
}
GetStrategyList()
Erhält die Strategieinformationen, die derAPI KEY
auf Anfrage des Kontos der FMZ Quant Trading Plattform.
Parameter Keine
Rücklaufwert
{
"code": 0,
"data": {
"result": {
"strategies": [{
"category": 0,
"username": "yifidslei",
"is_owner": true,
"name": "fmz simulation market test strategy",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2018-01-18 12:36:03",
"date": "2018-01-17 09:19:32",
"forked": 0,
"id": 63372
}, {
"category": 20,
"username": "bifndslez",
"is_owner": true,
"name": "Line drawing library",
"language": 0,
"hasToken": false,
"args": "[]",
"is_buy": false,
"public": 0,
"last_modified": "2017-05-08 09:44:18",
"date": "2017-04-19 10:38:14",
"forked": 0,
"id": 39677
},
...
],
"all": 20
},
"error": null
}
}
NewRobot(Settings)
Erstellt einen neuen Bot nach den Parameter-Einstellungen, die demAPI KEY
in der Anforderung des FMZ Quant-Kontos.
ParameterSettings
ist vonJSON
Objekttyp.Settings
ist einJSON
Objekt, das vom Bot konfiguriert wurde.
DieSettings
Die Beschreibung ist wie folgt zu erklären:
Settings = {
"name": "hedge test",
/*
Strategy parameters; the order does not have to be in correspondence with the parameter order, but the name must be the same as the parameter name
Note: the second element in the parameter array ["MAType", 0, 75882] is an array including three elements, in which the first one "MAType" is the parameter on the pattern referred by the bot-binding strategy, and the second one "0" is the specific value set by the parameter "MAType", and the third one "75882" is the pattern ID containing the parameter "MAType"
*/
"args": [["Interval", 500], ["MAType", 0, 75882]],
// Strategy ID, which can be obtained by "GetStrategyList" method
"strategy": 25189,
// K-line period parameter; "60" indicates 60 seconds
"period": 60,
// it can be specified to run on which docker; no writing of the attribute will lead to automatic assignment
"node" : 52924,
// custom field
"appid": "member2",
// Specify a bot group
"group": 1122,
"exchanges": [
// ZB; "pid" can be obtained by "GetPlatformList" method
{"pid": 15445, "pair": "ETH_BTC"},
// OKEX
{"pid": 13802, "pair": "BCH_BTC"},
// In addition to the exchanges configured by the FMZ dashboard (pid identification), you can also set exchange configuration information that has not been configured to operate the bot
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "xxx", "SecretKey": "yyy"}}
]
}
Anmerkung:
Wenn Sie die sensiblen Informationen verwenden, wie zum Beispiel die PlattformAPI KEY
, einschließlich"meta":{"AccessKey":"xxx","SecretKey":"yyy"}
in der Konfiguration voneid
Die Daten werden direkt an das Docker-Programm gesendet, so dass diese Informationen jedes Mal konfiguriert werden müssen, wenn der Bot erstellt oder neu gestartet wird.
Um den Bot neu zu starten, der das Plugin verwendet, um die Plattform zu unterstützen,Settings
Sie sollten die folgenden Einstellungen für dieexchanges
Eigenschaft:
{"eid": "Exchange", "label" : "testXXX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123", "SecretKey": "1234", "Front" : "http://127.0.0.1:6666/XXX"}}
label
Das Attribut ist ein Etikett für das Exchange-Objekt, auf das das aktuelle allgemeine Protokoll zugreift, zu setzen, das durch dieexchange.GetLabel()
die Rolle der Kommission in der Strategie.
Prüfstrategie:
StrategieparameterInterval
JavaScript
Strategiecode
function main(){
Log(exchange.GetAccount())
Log(exchange.GetTicker())
Log(exchange.GetDepth())
Log("Interval:", Interval)
}
Rücklaufwert
// Create the bot successfully
{
"code": 0,
"data": {
"result": 74260,
"error": null
}
}
PluginRun(Settings)
verwendet die erweiterte API zum AnrufenDebugging-Tool function.
ParameterSettings
ist einJSON
Objekt, nämlich die Einstellungen im Debugger (Settings
enthält den im Attribut geschriebenen Testcodesource
).
PrüfcodePython
Beispiel:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import md5
import urllib
import json
# API KEY has been blurred; you can use your own API KEY to test
accessKey = 'f77XXXXXXXXXXXXXXX757'
# API KEY has been blurred; you can use your own API KEY to test
secretKey = 'd8XXXXXXXXXXXXXXXX41ca97ea15'
def api(method, *args):
d = {
'version': '1.0',
'access_key': accessKey,
'method': method,
'args': json.dumps(list(args)),
'nonce': int(time.time() * 1000),
}
d['sign'] = md5.md5('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).hexdigest()
return json.loads(urllib.urlopen('https://www.fmz.com/api/v1', urllib.urlencode(d)).read())
code = '''
function main() {
Log(exchange.GetTicker())
exchange.SetTimeout(2000);
return exchanges[0].GetTicker()
}
'''
settings = {
# K-line period parameter "60" indicates 60 seconds
"period": 60,
"source": code,
# The docker ID can specify which docker to run the bot on; if the value is -1, it means automatic assignment
"node" : 54913,
"exchanges": [
{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}},
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
]
}
print api("PluginRun", settings)
Anmerkung:{"eid": "OKEX", "pair": "ETH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
{"eid": "Huobi", "pair": "BCH_BTC", "meta" :{"AccessKey": "123abc", "SecretKey": "123abc"}}
Für dieexchanges
Attribut in derEinstellungen, muss das Attribut nur auf 1 gesetzt werden, wenn diePluginRun
Sie werden nicht angezeigt, wenn Sie zwei Exchange-Objekte in derEinstellungen, aber ein Fehler wird bei Zugriff auf das zweite Austauschobjekt im Code gemeldet.
Rücklaufwertapi("PluginRun", settings)
zurückgegebene Ergebnisse:
{
u'code': 0,
u'data': {
u'result': u'{"logs":[{"PlatformId":"","OrderId":"0","LogType":5,"Price":0,"Amount":0,"Extra":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"high\\":\\"0.06400845\\",\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057726}","Instrument":"","Direction":"","Time":1523715057726}],"result":"{\\"Info\\":{\\"date\\":\\"1523715057\\",\\"ticker\\":{\\"vol\\":\\"117648.31546800\\",\\"last\\":\\"0.06204514\\",\\"low\\":\\"0.06178666\\",\\"buy\\":\\"0.06200001\\",\\"sell\\":\\"0.06208728\\",\\"high\\":\\"0.06400845\\"}},\\"High\\":0.06400845,\\"Low\\":0.06178666,\\"Sell\\":0.06208728,\\"Buy\\":0.06200001,\\"Last\\":0.06204514,\\"Volume\\":117648.315468,\\"OpenInterest\\":0,\\"Time\\":1523715057774}"}\n',
u'error': None
}
}
GetRobotLogs(robotId, logMinId, logMaxId, logOffset, logLimit, profitMinId, profitMaxId, profitOffset, profitLimit, chartMinId, chartMaxId, chartOffset, chartLimit, chartUpdateBaseId, chartUpdateDate, summaryLimit)
erhält die Roboterprotokollinformationen (RoboterID
: robotId
), die demAPI KEY
in der Anforderung des FMZ Quant-Kontos.
Parameter
Name der Parameter | Typ | Anmerkungen |
---|---|---|
RobotId | ganzzahl | Bot-ID |
Tabelle ProtokollAbfragt die Logdaten der Datenbanktabelle:
Name der Parameter | Typ | Anmerkungen |
---|---|---|
LogMinId | ganzzahl | Mindest-ID des Protokolls |
LogMaxId | ganzzahl | Maximale Kennzahl des Protokolls |
LogOffset | ganzzahl | Nachdem der Bereich durch logMinId und logMaxId bestimmt wurde, wird der LogOffset-Offset (wie viele Datensätze übersprungen werden) als Ausgangsposition für die Erfassung von Daten verwendet |
LogLimit | ganzzahl | Nach Bestimmung der Ausgangsposition wird die Anzahl der ausgewählten Datensätze |
Tabelle GewinnAbfragt die Gewinndaten der Datenbanktabelle:
Name der Parameter | Typ | Anmerkungen |
---|---|---|
Gewinn | ganzzahl | Mindest-ID des Datensatzes |
GewinnmaxId | ganzzahl | Höchstzahl der Datensätze |
GewinnAusgleich | ganzzahl | Der Versatz (wie viele Aufzeichnungen übersprungen werden) beginnt als Ausgangsposition verwendet werden |
Gewinngrenze | ganzzahl | Nach Bestimmung der Ausgangsposition wird die Anzahl der ausgewählten Datensätze |
Tabelle SchaubildAbfragt die Diagrammdaten der Datenbanktabelle:
Name der Parameter | Typ | Anmerkungen |
---|---|---|
Abbildung | ganzzahl | Mindest-ID des Datensatzes |
Karte MaxId | ganzzahl | Höchstzahl der Datensätze |
Abbildung: | ganzzahl | Ausgleich |
Bildgrenze | ganzzahl | Anzahl der zu erhaltenden Aufzeichnungen |
ChartUpdateBaseId | ganzzahl | Abfrage der aktualisierten Basis-ID |
BildUpdateDatum | ganzzahl | Datensatz aktualisiert den Zeitstempel, der die Datensätze, die größer als dieser Zeitstempel sind, herausfiltert |
ZusammenfassungAbfragt die Daten der Statusleiste:
Es abfragt die Statusleiste-Daten des Bots. Der Parameter-Typ ist eine ganze Zahl. Die Einstellung auf summaryLimit
Die Daten der Statusleiste werden in den zurückgegebenen Daten gespeichert.summary
.
Python
Beispiel:
api('GetRobotLogs', 63024, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) # For the specific code, please refer to the above content: 4. Simple examples, which will not be repeated here; here only write the call and pass of "GetRobotLogs"
Rücklaufwert zurückgegebene Daten:
{
"code": 0,
"data": {
"result": {
"status": 1,
"updateTime": 1527049990197,
"wd": 0,
// The first data structure in logs is the log records in the strategy log table in the bot database
"logs": [{
"Max": 3984,
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
"Total": 1503,
"Min": 2482
}, {
// The second data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}, {
// The third data structure in logs is the log records in the strategy log table in the bot database
"Max": 0,
"Arr": [],
"Total": 0,
"Min": 0
}],
"chart": "",
"refresh": 1527049988000,
"summary": "...",
"chartTime ": 0,
"node_id ": 50755,
"online ": true
},
"error ": null
}
}
Strategieprotokolltabelle in der Datenbank
DieArr
Beschreibung des Attributwerts in den oben zurückgegebenen Ergebnisdaten:
"Arr": [
[3977, 3, "Futures_OKCoin", "", 0, 0, "Sell(688.9, 2): 20016", 1526954372591, "", ""],
[3976, 5, "", "", 0, 0, "OKCoin:this_week too many positions, long: 2", 1526954372410, "", ""]
],
Identifizierung | LogTyp | Eid | Auftrag | Preis | Betrag | Zusätzlich | Datum | Vertrag Typ | Richtung |
---|---|---|---|---|---|---|---|---|---|
3977 | 3 | "" | 0 | 0 | 1526954372591 | "" | "" | ||
3976 | 5 | "" | "" | 0 | 0 | 1526954372410 | "" | "" |
extra
ist die beigefügte Meldung des gedruckten Protokolls.
Spezifische Prototypen, dargestellt durchlogType
Wert:
LogTyp: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
Bedeutung von logType: | Kaufen | Verkauf | Rücktritt | Fehler | Gewinne | Nachricht | RESTART |
Chinesische Bedeutung | Kaufbestellungsartprotokoll | Verkäufeinträge | Zurückziehen | Fehler | Einnahmen | Tagebücher | Neustart |
Protokolltabelle des Einnahmendiagramms in der Datenbank Die Daten in der DiagrammLogTabelle stimmen mit dem Umsatzlog in der StrategieLogTabelle überein.
"Arr": [
[202, 2515.44, 1575896700315],
[201, 1415.44, 1575896341568]
]
Nehmen wir beispielsweise eine der Protokolldaten:
[202, 2515.44, 1575896700315]
202
als LogID
; 2515.44
als Ertragswert;1575896700315
als Zeitstempel.
Chart-Logtabelle in der Datenbank
"Arr": [
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
[23636, 5, "{\"x\":1575960300000,\"y\":3.0735}"]
]
Nehmen wir beispielsweise eine der Protokolldaten:
[23637, 0, "{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"],
23637
ist das ProtokollID
, 0
ist der Index der Diagrammdatenreihe und die letzten Daten"{\"close\":648,\"high\":650.5,\"low\":647,\"open\":650,\"x\":1575960300000}"
ist die Logdaten; diese Daten sind die K-Liniendaten auf dem Diagramm.
Um die Funktionen des Handelsterminals zu verbessern und den manuellen Handel zu erleichtern, ist jetzt eine Plug-in-Funktion verfügbar.
Das Prinzip ist das gleiche wie das Debugging-Tool: Senden Sie ein Stück Code an den Docker der
Auf der Seite Trading Plugin
, die dieJavaScript
, Python
, cpp
undMyLanguage
.
Das Plugin kann den Code für einen bestimmten Zeitraum ausführen, und es kann einige einfache Operationen durchführen, wieEisberg-Bestellungen, Ausstehende Aufträge, Stornierung der BestellungundBerechnung der Bestellung- Das gleiche wie derDebugging-Tool, verwendet esreturn
Hier sind ein paar Beispiele, und andere Funktionen können Sie selbst erforschen.
Zurück zum Tiefen-Snapshot
// Return to the depth snapshot
function main() {
var tbl = {
type: 'table',
title: 'snapshot of the order depth @ ' + _D(),
cols: ['#', 'Amount', 'Ask', 'Bid', 'Amount'],
rows: []
}
var d = exchange.GetDepth()
for (var i = 0; i < Math.min(Math.min(d.Asks.length, d.Bids.length), 15); i++) {
tbl.rows.push([i, d.Asks[i].Amount, d.Asks[i].Price+'#ff0000', d.Bids[i].Price+'#0000ff', d.Bids[i].Amount])
}
return tbl
}
def main():
tbl = {
"type": "table",
"title": "snapshot of the order depth @ " + _D(),
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
}
d = exchange.GetDepth()
for i in range(min(min(len(d["Asks"]), len(d["Bids"])), 15)):
tbl["rows"].append([i, d["Asks"][i]["Amount"], str(d["Asks"][i]["Price"]) + "#FF0000", str(d["Bids"][i]["Price"]) + "#0000FF", d["Bids"][i]["Amount"]])
return tbl
void main() {
json tbl = R"({
"type": "table",
"title": "abc",
"cols": ["#", "Amount", "Ask", "Bid", "Amount"],
"rows": []
})"_json;
tbl["title"] = "snapshot of the order depth @" + _D();
auto d = exchange.GetDepth();
for(int i = 0; i < 5; i++) {
tbl["rows"].push_back({format("%d", i), format("%f", d.Asks[i].Amount), format("%f #FF0000", d.Asks[i].Price), format("%f #0000FF", d.Bids[i].Price), format("%f", d.Bids[i].Amount)});
}
LogStatus("`" + tbl.dump() + "`");
// C++ does not support "return json" to display the table, and you can create a bot to display the table of the status bar
}
Zeichnen Sie die Querschnittspannen
// Draw cross-period spreads
var chart = {
__isStock: true,
title : { text : 'spread analysis chart'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: 'spread'},
opposite: false
},
series : [
{name : "diff", data : []}
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i = 0; i < Math.min(recordsA.length, recordsB.length); i++){
var diff = recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Close - recordsB[recordsB.length - Math.min(recordsA.length, recordsB.length) + i].Close
chart.series[0].data.push([recordsA[recordsA.length - Math.min(recordsA.length, recordsB.length) + i].Time, diff])
}
return chart
}
chart = {
"__isStock": True,
"title": {"text": "spread analysis chart"},
"xAxis": {"type": "datetime"},
"yAxis": {
"title": {"text": "spread"},
"opposite": False
},
"series": [
{"name": "diff", "data": []}
]
}
def main():
exchange.SetContractType("quarter")
recordsA = exchange.GetRecords(PERIOD_M5)
exchange.SetContractType("this_week")
recordsB = exchange.GetRecords(PERIOD_M5)
for i in range(min(len(recordsA), len(recordsB))):
diff = recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i].Close - recordsB[len(recordsB) - min(len(recordsA), len(recordsB)) + i].Close
chart["series"][0]["data"].append([recordsA[len(recordsA) - min(len(recordsA), len(recordsB)) + i]["Time"], diff])
return chart
// C++ does not support "return json" structure drawing
Es gibt weitere Beispiele in der
Hinzufügen des Plug-in-Moduls des Handelsterminals
Wie in der Abbildung gezeigt, öffnen Sie das Modul hinzufügen Menü auf der
Führen Sie das Plugin aus
Klicken Sie auf
Zeit des Plugins Die maximale Laufzeit des Plugins beträgt 3 Minuten; und es wird automatisch nach mehr als 3 Minuten nicht mehr laufen.
Die Analyseformel bezieht sich auf die Berechnungsmethode für die Marktnotierung in der Öffentlichkeit.alpha101
vonworldquant
: http://q.fmz.com/chart/doc/101_Formulaic_Alphas.pdf, die grundsätzlich mit ihrer Grammatik kompatibel ist (mit Erläuterungen für nicht implementierte Merkmale) und verbessert wurde.
Es wird zur schnellen Berechnung von Zeitreihen und zur Validierung von Ideen verwendet.Adresse verwenden.
Seite Einleitung:
"{}" darstellt Platzhalter, alle Ausdrücke sind nicht groß- und kleinbuchstabensensible, und
abs(x), log(x), sign(x)
bedeutet wörtlich den absoluten Wert, Logarithmus und Zeichenfunktion.Die folgenden Betreiber, einschließlich+, -, *, /, >, <
, auch den Bedeutungen ihrer Normen entsprechen;==
steht für ||
bedeutet x? y: z
zeigt den ternären Operator an.
rank(x)
: die Rangfolge der Querschnitte, die den Prozentsatz des Standorts wiedergibt; es ist notwendig, mehrere Kandidaten-Zielgruppen anzugeben, die nicht für einen Binnenmarkt berechnet werden können und das ursprüngliche Ergebnis direkt zurückgeben.delay(x, d)
: der Wert vor der Periode d der Reihenfolge.sma(x, d)
: der einfache gleitende Durchschnitt der Periode d der Sequenz.correlation(x, y, d)
: der Korrelationskoeffizient der Zeitreihen x und y über die letzten d Perioden.covariance(x, y, d)
: die Kovarianz der Zeitreihen x und y in den letzten d Perioden.scale(x, a)
: es normalisiert die Daten, so dasssum(abs(x)) = a
(delta(x, d)
: der aktuelle Wert der Zeitreihe x minus der Wert vor d Perioden.signedpower(x, a)
: x^a
.decay_linear(x, d)
: gewichteter gleitender Durchschnitt der Zeitreihe x für die Periode d, wobei die Gewichte d, d-1, d-2... 1 (normalisiert) sind.indneutralize(x, g)
: die neutrale Verarbeitung für die Branchenklassifizierung ts_{O}(x, d)
: ts_min(x, d)
: der Mindestwert der letzten d Zeiträume.ts_max(x, d)
: der Höchstwert der letzten d Zeiträume.ts_argmax(x, d)
: ts_max(x, d)
position.ts_argmin(x, d)
: ts_min(x, d)
position.ts_rank(x, d)
: Sortierung der Zeitreihenwerte x der letzten d Perioden (prozentuale Sortierung).min(x, d)
: ts_min(x, d)
.max(x, d)
: ts_max(x, d)
.sum(x, d)
: die Summe der letzten d Zeiträume.product(x, d)
: das Produkt der letzten d Perioden.stddev(x, d)
: die Standardabweichung der letzten d Perioden.Die Eingabedaten sind nicht mit Groß- und Kleinbuchstaben versehen; die Standarddaten sind das ausgewählte Symbol auf der Webseite oder können direkt angegeben werden, wie z. B.binance.ada_bnb
returns
: Rückkehr des Schlusskurses.open, close, high, low, volume
: d. h. der Eröffnungspreis, der Schlusskurs, der höchste Preis, der niedrigste Preis und das Handelsvolumen während des Zeitraums.vwap
: volumengewichteter ausgeführter Preis, noch nicht umgesetzt, der derzeit der Schlusskurs ist.cap
: Gesamtmarktwert, noch nicht umgesetzt.IndClass
: Branchenklassifizierung, noch nicht eingeführt.Es wird unterstützt, mehrere Ergebnisse (durch Liste ausgedrückt) gleichzeitig auszugeben.[sma(close, 10), sma(high, 30)]
Neben der Eingabe von Zeitreihendaten kann es auch als einfacher Rechner verwendet werden.
Für die FMZ Quant Trading Plattform, die die Exchange API-Schnittstelle noch nicht eingekapselt hat, kann auf sie zugegriffen werden, indem ein allgemeines Protokoll-Plug-in-Programm geschrieben wird.
REST
Protokoll:Referenzdokumentation.FIX
Protokoll:Referenzposten.Der Unterschied zwischenFIX
Protokoll-Plug-in-Programm und dieREST
Das Protokoll-Plug-in-Programm ist nur die Interaktion zwischen dem Protokoll-Plug-in-Programm und der Austauschoberfläche. Das Protokoll-Plug-in-Programm hat die gleiche detaillierte Verarbeitung der Docker-Programm-Interaktion und Datenformat wie FMZ Quant. Für Details, wenden Sie sich bitte an die Beispiele in den oben genannten Links.
Die FMZ Quant Trading Plattform bietet eine modulare und anpassbare
Debug-ToolSeite bietet eine Umgebung zum schnellen Testen von Codes durch Bot, unterstützt nurJavaScript
currently.
Es unterstützt den lokalen Editor Remote-Synchronisation Strategie Code zu FMZ Quant Trading Plattform, und es unterstütztSublime Text
/Atom
/Vim
/VSCode
Auf der Strategiebearbeitungsseite klicken Sie auf
Klicken Sie auf
Die Installationsmethoden der Plug-ins für verschiedene Editoren unterscheiden sich leicht. Sie können auf die Download-Schaltfläche klicken, um zum spezifischen Plug-in für die Fernsynchronisierung zu gelangen.
Wenn Sie den Live-Handel ausführen, müssen Sie die Parameterdaten der echten Bot-Konfiguration speichern, klicken Sie auf die Schaltfläche JSON
Sie können auch die exportierte Strategieparameterkonfiguration wieder in den echten Bot importieren. Klicken Sie auf die Schaltfläche
Herunterladen des Quellcodes
Exportieren Sie den Quellcode der Strategie, und der Typ der Exportdatei basiert auf der Strategie-Programmiersprache.js
; Python-Strategie exportiert die Dateien mit der Erweiterungpy
; C++ Strategie exportiert die Dateien mit der Erweiterungcpp
; Mylanguage-Strategie exportiert die Dateien mit der Erweiterungtxt
. Beachten Sie, dass nur der Quellcode der Strategie exportiert wird, ohne Strategieparameter, Vorlageverweise usw. einzubeziehen.
Exportstrategie
Exportieren Sie die vollständige Strategie, einschließlich aller Strategieinformationen, wie Strategie-Quellcode und Parameterdesign.xml
file.
Importstrategie
Verwendenxml
Sie können die Daten über das Programm und die Daten über das Programm exportieren, und klicken Sie auf die Schaltfläche "Import" auf der Strategiebearbeitungsseite, um diexml
Nach dem Importieren müssen Sie auf die Schaltfläche
Strategiebezeichnungen und Strategieparameterbeschreibungen können inChinese|English
, wird in der von den Webseiten erkannten Sprache automatisch angezeigt.
An anderen Orten, z. B.:Beschreibung der Strategie, Gebrauchsanweisungund andere Texte inMarkdown
Form, unter Verwendung von[trans]Chinese|English[/trans]
oder[trans]Chinese||English[/trans]
Der Effekt des obigen Beispiels wird in der folgenden Abbildung dargestellt:
Seite in Chinesisch:
Seite in Englisch:
Nachdem Sie die Sprache gewechselt haben, wirkt sie nach dem Auffrischen der Webseite.
Funktionen, die Zeichenfolgen im Strategiecode schreiben können, unterstützen auch die Sprachenumstellung, wie z. B. die FunktionLog
, FunktionLogStatus
, usw.
function main() {
Log("[trans]日志|log[/trans]")
var table = {
type: "table",
title: "[trans]操作|option[/trans]",
cols: ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
rows: [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}] // Note: It doesn't need to add [trans] tag in the button
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + JSON.stringify(table) + "`")
throw "[trans]错误|error[/trans]"
}
import json
def main():
Log("[trans]日志|log[/trans]")
table = {
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
}
LogStatus("[trans]信息|message[/trans]", "\n`" + json.dumps(table) + "`")
raise Exception("[trans]错误|error[/trans]")
void main() {
Log("[trans]日志|log[/trans]");
json table = R"({
"type": "table",
"title": "[trans]操作|option[/trans]",
"cols": ["[trans]列1|col1[/trans]", "[trans]列2|col2[/trans]", "[trans]操作|option[/trans]"],
"rows": [
["[trans]比特币|BTC[/trans]", "[trans]以太坊|ETH[/trans]", {"type": "button", "cmd": "coverAll", "name": "平仓|cover", "description": "描述|description"}]
]
})"_json;
LogStatus("[trans]信息|message[/trans]", "\n`" + table.dump() + "`");
Panic("[trans]错误|error[/trans]");
}
Nach dem Herunterladen der Docker-Software wird die ausführbare Datei nach der Dekompression (Dateiname:robot
) ist das Dockerprogramm; die Parameter können beim Einsatz des Dockerprogramms für das Dockerprogramm festgelegt werden.
-v
: Überprüfen Sie die Informationen einschließlich der Version und der Kompilierungszeit des aktuellen Dockerprogramms.
Der vollständige Ausführungsbefehl basiert aufApple Mac System
: ./robot -v
.-s
: die angegebene Adresse zur Kommunikation mit der FMZ Quant Trading Plattform beim Ausführen des Dockerprogramms.
Der vollständige Ausführungsbefehl basiert aufApple Mac System
: ./robot -s node.fmz.com/xxxxxxx
; xxxxxxx
ist die eindeutige Kennung jedes Kontos auf der FMZ Quant Trading-Plattform; nach Ausführung des Befehls wird die Eingabe des Passworts für das entsprechende FMZ Quant Trading-Plattformkonto aufgefordert.-p
: Sie können direkt den Parameter im Run-Befehl angeben, um das Passwort einzugeben, was nicht empfohlen wird, da der Passwortparameter im aktuellen Systemrekord verbleibt.node.fmz.com/xxxxxxx
ist:abc123456
- Ich weiß.
Der vollständige Ausführungsbefehl basiert aufApple Mac System
: ./robot -s node.fmz.com/xxxxxxx -p abc123456
.-n
: Fügen Sie Etiketteninformationen an das laufende Dockerprogramm an.
Der vollständige Ausführungsbefehl basiert aufApple Mac System
: ./robot -n macTest -s node.fmz.com/xxxxxxx
Es wird einemacTest
Textetikett in den Docker-Informationen auf der Plattform-Docker-Verwaltungsseite.-l
: Drucken Sie die vom aktuellen Docker unterstützte Austauschliste.
Der vollständige Ausführungsbefehl basiert aufApple Mac System
: ./robot -l
, d. h. die Namen der unterstützten Börsen können ausgeführt werden.exchange.Go
Wir haben keine vernünftigewait
die Zeit, bis das Ende der Korrutine während des Betriebs abgeschlossen ist, abzuwarten, was zu einer großen Anzahl von Korrutinen führt.Decrypt: Secret key decrypt failed
Der Grund für den Fehler ist, dass die Änderung des FMZ-Konto-Passworts alle konfiguriertenAPI KEY
Um das Problem zu lösen,API KEY
Der Docker muss neu gestartet werden.ValueError: bad marshal data (unknown type code)
. Die von der Strategie ausgeführte Python-Umgebung auf eine der von der Strategie unterstützten Versionen aktualisieren oder installieren:Python 2.7
, Python 3.5
undPython 3.6
.interrupt
Fehler; der Fehler liegt daran, dass der Benutzer auf dieStoppen Sie den Bot.der Button auf der Bot-Seite, wenn das Programm eine Operation ausführt (z. B. Zugriff auf die Plattformoberfläche), und der Bot stoppt und unterbricht die Fehlermeldung, die durch die aktuelle Operation gedruckt wurde. Der Fehler hat keine Wirkung und ist nur ein Protokoll.Auf der Seite
Unterkonto
Nach der Anmeldung auf der Plattform klicken Sie auf
Unterkonten haben begrenzte Berechtigungen; nur die autorisierten Bots in den Einstellungen vonverfügbare BerechtigungenDie Zahlungen werden in den Unterkonten erfaßt. Der autorisierte Bot hat die Befugnis, Parameter zu ändern, den Live-Handel zu stoppen und neu zu starten, aber er kann das vom Bot konfigurierte Austauschobjekt nicht ändern.
Live-Handelsansicht
In der Botliste der FMZ-PlattformBot-Seite, klicken Sie auf die Schaltfläche
Auf
Strategiefreigabe
Öffentliches Teilen
Nachdem Sie auf die Schaltfläche
Internes Teilen
Nach dem Klicken auf die Schaltfläche
Strategie Vermietung
Öffentlicher Verkauf
Nach dem Klicken auf die Schaltfläche
Innerer Verkauf
Nach dem Klicken auf die Schaltfläche
Wichtiger Hinweis:
Bei der Erstellung und Verteilung derStrategie-Token, bitte achten Sie darauf, sorgfältig zu bestätigen, ob es sich um einen
function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
// force by days
period = 86400000
if (profits.length == 0) {
return null
}
var freeProfit = 0.03 // 0.04
var yearRange = yearDays * 86400000
var totalReturns = profits[profits.length - 1][1] / totalAssets
var annualizedReturns = (totalReturns * yearRange) / (te - ts)
// MaxDrawDown
var maxDrawdown = 0
var maxAssets = totalAssets
var maxAssetsTime = 0
var maxDrawdownTime = 0
var maxDrawdownStartTime = 0
var winningRate = 0
var winningResult = 0
for (var i = 0; i < profits.length; i++) {
if (i == 0) {
if (profits[i][1] > 0) {
winningResult++
}
} else {
if (profits[i][1] > profits[i - 1][1]) {
winningResult++
}
}
if ((profits[i][1] + totalAssets) > maxAssets) {
maxAssets = profits[i][1] + totalAssets
maxAssetsTime = profits[i][0]
}
if (maxAssets > 0) {
var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
if (drawDown > maxDrawdown) {
maxDrawdown = drawDown
maxDrawdownTime = profits[i][0]
maxDrawdownStartTime = maxAssetsTime
}
}
}
if (profits.length > 0) {
winningRate = winningResult / profits.length
}
// trim profits
var i = 0
var datas = []
var sum = 0
var preProfit = 0
var perRatio = 0
var rangeEnd = te
if ((te - ts) % period > 0) {
rangeEnd = (parseInt(te / period) + 1) * period
}
for (var n = ts; n < rangeEnd; n += period) {
var dayProfit = 0.0
var cut = n + period
while (i < profits.length && profits[i][0] < cut) {
dayProfit += (profits[i][1] - preProfit)
preProfit = profits[i][1]
i++
}
perRatio = ((dayProfit / totalAssets) * yearRange) / period
sum += perRatio
datas.push(perRatio)
}
var sharpeRatio = 0
var volatility = 0
if (datas.length > 0) {
var avg = sum / datas.length;
var std = 0;
for (i = 0; i < datas.length; i++) {
std += Math.pow(datas[i] - avg, 2);
}
volatility = Math.sqrt(std / datas.length);
if (volatility !== 0) {
sharpeRatio = (annualizedReturns - freeProfit) / volatility
}
}
return {
totalAssets: totalAssets,
yearDays: yearDays,
totalReturns: totalReturns,
annualizedReturns: annualizedReturns,
sharpeRatio: sharpeRatio,
volatility: volatility,
maxDrawdown: maxDrawdown,
maxDrawdownTime: maxDrawdownTime,
maxAssetsTime: maxAssetsTime,
maxDrawdownStartTime: maxDrawdownStartTime,
winningRate: winningRate
}
}
Futures_Binance
Es unterstützt den Dual-Position-Modus von Binance-Futures; Sie könnenexchange.IO
zum Wechseln:
function main() {
var ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true")
// ret : {"code":200,"msg":"success"}
Log(ret)
}
def main():
ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=false")
Log(ret)
void main() {
auto ret = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", "dualSidePosition=true");
Log(ret);
}
Es unterstützt das Wechseln zwischen Kreuzungsposition und Isolierungsposition
function main() {
exchange.SetContractType("swap")
exchange.IO("cross", true) // Switch to crossed position
exchange.IO("cross", false) // Switch to isolated position
}
def main():
exchange.SetContractType("swap")
exchange.IO("cross", True)
exchange.IO("cross", False)
void main() {
exchange.SetContractType("swap");
exchange.IO("cross", true);
exchange.IO("cross", false);
}
Futures_HuobiDM
Es unterstützt die Änderung der Adresse von Huobi Futures, die an der Signatur teilnimmt, die standardmäßig nicht geschaltet wird.exchange.IO("signHost", "")
um eine leere Zeichenfolge festzulegen.
Verwendungexchange.IO("signHost", "https://aaa.xxx.xxx")
die Basisadresse von Huobi Futures, die an der Signaturprüfung teilnimmt, zu wechseln.
Verwendungexchange.IO("base", "https://bbb.xxx.xxx")
oderexchange.SetBase("https://bbb.xxx.xxx")
Um die Basisadresse der Plattformoberfläche zu wechseln.
Wenn das Handelspaar aufXXX_USDT
, die Funktion verwendenexchange.SetContractType("swap")
um den Vertragskode aufswap
Dauervertragexchange.IO("cross", true)
kann aufUSDT
-Margined perpetual contract im Modus der gekreuzten Position.exchange.IO("cross", false)
Der ursprüngliche Standard ist der isolierte Positionsmodus.
Weiß nicht
Es unterstützt Huobi-Spot-Leverage-Token wie:LINK*(-3)
Der von der Börse definierte Code lautet:link3susdt
, die geschrieben wird, wenn FMZ das Handelspaar setztLINK3S_USDT
- Ich weiß.
Es ist auch möglich, die Handelspare in der Strategie zu wechseln:
function main() {
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
}
def main():
exchange.SetCurrency("LINK3S_USDT")
Log(exchange.GetTicker())
void main() {
exchange.SetCurrency("LINK3S_USDT");
Log(exchange.GetTicker());
}
OKX
OKX-Schnittstelle kann auf die Simulations-Bot-Testumgebung von OKX wechseln;exchange.IO("simulate", true)
Sie können auf die simulierte Handelsumgebung wechseln.exchange.IO("simulate", false)
Der erste Standard ist das reale Handelsumfeld.
Es unterstützt das Wechseln von Konto-Margin-Modi;exchange.IO("cross", true)
zum Wechseln in den Kreuzstellungsmodus und zur Verwendungexchange.IO("cross", false)
Um in den Isolierpositionsmodus zu wechseln, ist der ursprüngliche Standardmodus der Kreuzposition.
Futures_Bibox
Verwendungexchange.IO("cross", true)
zum Wechseln in den Kreuzstellungsmodus und zur Verwendungexchange.IO("cross", false)
zum Wechsel zum isolierten Positionsmodus; der ursprüngliche Standard ist der Kreuzpositionsmodus.
Die Börse unterstützt nicht die Abfrage aktueller ausstehender Aufträge und die Schnittstelle zur Abfrage der historischen Handelsprotokolle des Marktes, so dass dieGetOrders
undGetTrades
Funktionen werden nicht unterstützt.
Futures_Bitget
Verwendungexchange.IO("cross", true)
zum Wechseln in den Kreuzstellungsmodus und zur Verwendungexchange.IO("cross", false)
zum Wechseln in den Isolierungsmodus.
Futures_AOFEX
Verwendungexchange.IO("cross", true)
zum Wechseln in den Kreuzstellungsmodus und zur Verwendungexchange.IO("cross", false)
zum Wechseln in den Isolierungsmodus.
Futures_MEXC
Verwendungexchange.IO("cross", true)
zum Wechseln in den Kreuzstellungsmodus und zur Verwendung` ` Austausch.IO("Kreuz",