in die letzten 10 Protokolle und löschen Sie den Rest
LogReset ((10)
}
```Python
def main():
LogReset(10)
void main() {
LogReset(10);
}
LogVacuum()
, nachdem er dieLogReset()
Funktion, um das Protokoll zu löschen, erholt den Speicherplatz, denSQLiteDie Funktion gibt keinen Wert zurück.
Der Grund dafür ist, dassSQLite
nicht den Platz zurückgewinnen, wenn Daten gelöscht werden, so müssen SieVACUUM
Wenn diese Funktion aufgerufen wird, erfolgt die Dateibewegung mit großer Verzögerung. Es wird empfohlen, sie in einem geeigneten Zeitintervall aufzurufen.
Die wichtigsten Funktionen der Marktschnittstelle sind:
Funktionsname | Beschreibung |
---|---|
GetTicker | Erhalten Sie die Daten von Anführungszeichen |
GetRecords | Holen Sie K-Liniendaten. |
GetDepth | Erhalten Sie Bestellbuchdaten (Bestelltiefe-Daten) |
GetTrades | Erhalten Sie die neuesten Handelsdaten auf dem Markt |
Die folgenden Funktionen können überexchange
oderexchanges[0]
Objekte; zum Beispiel: Funktionen, wieexchange.GetTicker();
oderexchanges[0].GetTicker();
, gibt die Marktkurse der aktuellen Handelspare und die Festlegung von Verträgen zurück.
Wichtige Tipps für den Aufruf von API-Funktionen mit Netzwerkzugang:Bei Aufruf einer API-Funktion, die auf eine Plattformoberfläche zugreift (z. B.exchange.GetTicker()
, exchange.Buy(Price, Amount)
, exchange.CancelOrder(Id)
, etc.) ist der Ausfall des Zugriffs wahrscheinlich aus verschiedenen Gründen verursacht. Daher müssen wir fehlertolerante Verarbeitung für den Aufruf dieser Funktionen durchführen.exchange.GetTicker()
Die Funktion zur Erfassung von Marktdaten kann aufgrund von Problemen mit Plattformservern und Netzübertragungsproblemen usw. dazu führen, dass der Rückgabewert desexchange.GetTicker()
Funktion istnull
. Dann wird der Wert vonexchange.GetTicker()
Die Bearbeitung muss fehlertolerant erfolgen.
Die von derexchange.GetTicker()
Funktion in folgendem Code wird demticker
Wir müssen uns mit der Fehlerverträglichkeit befassen, bevor wir dieticker
variable.
function main() {
var ticker = exchange.GetTicker()
if(!ticker){
// Recall once, or use other processing logic
ticker = exchange.GetTicker()
}
}
def main():
ticker = exchange.GetTicker()
if not ticker:
ticker = exchange.GetTicker()
void main() {
auto ticker = exchange.GetTicker();
if(!ticker.Valid) {
ticker = exchange.GetTicker();
Log("Test");
}
}
Darüber hinaus hat das FMZ für die Fehlertoleranztestung der Strategie speziell ein einzigartigesFehlertoleranzmodusDas Backtest-System kann zufällig einige API-Aufrufe zurückgeben, die auftreten, wenn das Netzwerk gemäß den festgelegten Parametern aufgerufen wird, und die Rückgabewerte einiger fehlgeschlagener Anrufe zurückgeben.
Wechseln Sie zur Backtest-Systemseite auf der Strategiebearbeitungsseite, klicken Sie aufumgekehrtes DreieckEin Drop-down-System befindet sich auf der rechten Seite der Schaltfläche
exchange.GetTicker()
Erhält die aktuellen Marktnotierungen aktueller Handelspare und -verträge mit dem Renditewert:Ticker
Struktur.
Im Backtest-System werden dieTicker
Daten, die von derexchange.GetTicker()
Funktion, woHigh
undLow
sind simulierte Werte, die aus dem aktuellen Zeitpunkt von Tick
interface.
function main(){
var ticker = exchange.GetTicker()
/*
The platform interface may not be accessible due to network problems (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, ticker is null, when accessing ticker. When it is "High", it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume)
}
def main():
ticker = exchange.GetTicker()
Log("High:", ticker["High"], "Low:", ticker["Low"], "Sell:", ticker["Sell"], "Buy:", ticker["Buy"], "Last:", ticker["Last"], "Volume:", ticker["Volume"])
void main() {
auto ticker = exchange.GetTicker();
Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume);
}
Im echten Bot (nicht Backtest), dieInfo
Attribut im Rückgabewert derexchange.GetTicker()
Die Funktion speichert die ursprünglichen Daten, die bei Aufruf der Schnittstelle zurückgegeben werden.
exchange.GetDepth()
erhält die Daten des Tauschaufträgebuchs aktueller Handelspare und -verträge.Depth
structure.
Depth
Die Struktur besteht aus zwei Strukturen, nämlichAsks[]
undBids[]
, Asks
undBids
die folgenden Strukturvariablen enthalten:
Datentyp | Name der Variablen | Beschreibung |
---|---|---|
Zahl | Preis | Preis |
Zahl | Betrag | Betrag |
Zum Beispiel, wenn ich den aktuellen Verkauf zweiter Preis erhalten möchte, kann ich den Code wie folgt schreiben:
function main(){
var depth = exchange.GetDepth()
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, depth is null. When accessing depth.Asks[1].Price, it will cause an error; so when testing, ensure that you can access the platform interface
*/
var price = depth.Asks[1].Price
Log("Sell 2 price is:", price)
}
def main():
depth = exchange.GetDepth()
price = depth["Asks"][1]["Price"]
Log("Sell 2 price is:", price)
void main() {
auto depth = exchange.GetDepth();
auto price = depth.Asks[1].Price;
Log("Sell 2 price is:", price);
}
exchange.GetTrades()
Erhält den Handelshistorikverlauf der Plattform (nicht Ihren eigenen).Trade
Einige Börsen unterstützen es nicht. Die spezifischen zurückgegebenen Daten hängen von den Handelsdaten innerhalb des Bereichs ab, je nach spezifischen Umständen.
Die zurückgegebenen Daten sind ein Array, bei dem die Zeitfolge jedes Elements mit der zurückgegebenen Datenfolge desexchange.GetRecords
Funktion, das heißt, das letzte Element des Arrays ist die Daten, die der aktuellen Zeit am nächsten sind.
// In the simulated backtest, the data is empty; to have a trading history, there must be a real bot running
function main(){
var trades = exchange.GetTrades()
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, "trades" is null. When accessing trades[0].Id, it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type)
}
def main():
trades = exchange.GetTrades()
Log("id:", trades[0]["Id"], "time:", trades[0]["Time"], "Price:", trades[0]["Price"], "Amount:", trades[0]["Amount"], "type:", trades[0]["Type"])
void main() {
auto trades = exchange.GetTrades();
Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type);
}
exchange.GetRecords(Period)
K-Zeilperiode wird beim Erstellen des Bots angegeben; wenn Sie die Parameter angeben, wenn derexchange.GetRecords()
Wenn die Funktion aufgerufen wird, werden die erhaltenen Daten die K-Zeilendaten sein, die dem Parameterzeitraum entsprechen. Wenn kein Parameter angegeben ist, werden die K-Zeilendaten gemäß der K-Zeilendefinition auf den Bot-Parametern oder der K-Zeilendefinition auf der Backtest-Seite zurückgegeben.
ParameterPeriod
:
Period
kann nicht nur die oben definierten Standardperioden überschreiten, sondern auch Zahlen in der Sekundeinheit.Der Rücklaufwert vonexchange.GetRecords(Period)
Funktion:
Der zurückgegebene Wert ist ein Array vonRecord
Die Daten werden im Laufe der Zeit akkumuliert, die Obergrenze der akkumulierten K-Linienbalken wird durch dieexchange.SetMaxBarLenDie Standardobergrenze beträgt 5000 K-Line-Bars, wenn sie nicht festgelegt ist. Wenn die K-Line-Daten die K-Line-Barsammelungsgrenze erreichen, werden sie aktualisiert, indem eine K-Line-Bar hinzugefügt und die früheste K-Line-Bar gelöscht wird (z. B. Warteschlange in / aus). Einige Börsen bieten keine K-Line-Schnittstelle, dann sammelt der Docker die Markttransaktionsdatensätze in Echtzeit, um K-Lines zu generieren.
Anzahl der K-Linienbalken, die bei derGetRecords
Die Funktion wird zunächst aufgerufen.
Für dieexchange.GetRecords(Period)
Funktion, die bot und backtest vonKryptowährungBeide unterstützen benutzerdefinierte Zeiträume, und der ParameterPeriod
ist die Anzahl der Sekunden.
function main() {
// Print K-line data with a K-line period of 120 seconds (2 minutes)
Log(exchange.GetRecords(60 * 2))
// Print K-line data with a K-line period of 5 minutes
Log(exchange.GetRecords(PERIOD_M5))
}
def main():
Log(exchange.GetRecords(60 * 2))
Log(exchange.GetRecords(PERIOD_M5))
void main() {
Log(exchange.GetRecords(60 * 2)[0]);
Log(exchange.GetRecords(PERIOD_M5)[0]);
}
EinstellungPeriod
Parameter 5 ist die Anforderung von K-Liniendaten mit einer Periode von 5 Sekunden.
Wenn diePeriod
Der Parameter ist nicht gleichmäßig durch 60 geteilt (d. h. die dargestellte Periode ist eine Periode von nicht verfügbaren Minuten), verwendet die untere Schicht des Systems die entsprechende Schnittstelle vonGetTrades
die Erfassung von Handelsdaten und die Synthese der erforderlichen K-Liniendaten.
Wenn diePeriod
Der Parameter wird gleichmäßig durch 60 geteilt, dann werden die erforderlichen K-Liniendaten mit mindestens 1-minütigen K-Liniendaten synthetisiert (wenn möglich mit einer größeren Periode zur Synthese der erforderlichen K-Liniendaten).
function main(){
var records = exchange.GetRecords(PERIOD_H1)
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, "records" is null. When accessing records[0].Time, it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("The first k-line data is, Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High)
Log("The second k-line data is, Time:", records[1].Time ,"Close:", records[1].Close)
Log("Current K-line (latest)", records[records.length-1], "Current K-line (latest)", records[records.length-2])
}
def main():
records = exchange.GetRecords(PERIOD_H1)
Log("The first k-line data is, Time:", records[0]["Time"], "Open:", records[0]["Open"], "High:", records[0]["High"])
Log("The second k-line data is, Time:", records[1]["Time"], "Close:", records[1]["Close"])
Log("Current K-line (latest)", records[-1], "Current K-line (latest)", records[-2])
void main() {
auto records = exchange.GetRecords(PERIOD_H1);
Log("The first k-line data is, Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High);
Log("The second k-line data is, Time:", records[1].Time, "Close:", records[1].Close);
Log("Current K-line (latest)", records[records.size() - 1], "Current K-line (latest)", records[records.size() - 2]);
}
exchange.GetRecords()
Die Funktion hat zwei Bedingungen für die Erfassung von K-Liniendaten:
Der Austausch stellt eine K-Linien-Datenoberfläche zur Verfügung.
Die Börse bietet keine K-Line-Datenoberfläche. Das FMZ-Docker-Programm erhält jedes Mal, wenn das Strategieprogramm aufruft, die neuesten Handelsdaten der Börse.exchange.GetRecords()
, das heißt, es nennt dieexchange.GetTrades()
Funktion zur Erfassung von Daten und Synthese von K-Liniendaten.
Der Simulations-Backtest im System muss diedie zugrunde liegende K-Linieperiode(Wenn das Backtesting-System den Stand des Backtesting simuliert, werden die entsprechenden K-Liniendaten verwendet, um Tick-Daten nach dem Satz zu erzeugendie zugrunde liegende K-Linieperiode); es ist zu beachten, dass die Dauer der in der Strategie erfassten K-Liniendaten nicht kürzer alsdie zugrunde liegende K-LinienperiodeDenn im Backtest auf Simulationsebene werden die K-Liniendaten jedes Zeitraums durch die K-Liniendaten der zugrunde liegenden K-Linienperioden im Backtestsystem synthetisiert.
Incpp
Sprache, wenn Sie Ihre eigenen K-Liniendaten konstruieren müssen, gibt es die folgenden Codebeispiele:
#include <sstream>
void main() {
Records r;
r.Valid = true;
for (auto i = 0; i < 10; i++) {
Record ele;
ele.Time = i * 100000;
ele.High = i * 10000;
ele.Low = i * 1000;
ele.Close = i * 100;
ele.Open = i * 10;
ele.Volume = i * 1;
r.push_back(ele);
}
// Output display: Records[10]
Log(r);
auto ma = TA.MA(r,10);
// Output display: [nan,nan,nan,nan,nan,nan,nan,nan,nan,450]
Log(ma);
}
Dieexchange.GetPeriod()
Funktion gibt die auf der Website der FMZ-Plattform festgelegte K-Zeile zurück, wenn Strategien inZurückprüfungundBot. Der zurückgegebene Wert ist eine ganze Zahl in der Sekundeinheit.
function main() {
// For example, in the backtest and bot, set the K-line period on the website page of FMZ platform to 1 hour
var period = exchange.GetPeriod()
Log("K-line period:", period / (60 * 60), "hour")
}
def main():
period = exchange.GetPeriod()
Log("K-line period:", period / (60 * 60), "hour")
void main() {
auto period = exchange.GetPeriod();
Log("K-line period:", period / (60 * 60.0), "hour");
}
Dieexchange.SetMaxBarLen(Len)
Funktion wirkt sich während der Laufzeit der Kryptowährungsstrategie auf zwei Aspekte aus:
function main() {
exchange.SetMaxBarLen(50)
var records = exchange.GetRecords()
Log(records.length, records)
}
def main():
exchange.SetMaxBarLen(50)
r = exchange.GetRecords()
Log(len(r), r)
void main() {
exchange.SetMaxBarLen(50);
auto r = exchange.GetRecords();
Log(r.size(), r[0]);
}
exchange.GetRawJSON()
Gibt den Rohinhalt (Strings) zurück, der von der letztenRESTDie Funktion wird nicht unterstützt. Die Funktion ist nur in der Live-Handelsumgebung für Kryptowährung gültig.
Strategien incpp
Die Sprache unterstützt die Funktion nicht.
function main(){
exchange.GetAccount();
var obj = JSON.parse(exchange.GetRawJSON());
Log(obj);
}
import json
def main():
exchange.GetAccount()
obj = json.loads(exchange.GetRawJSON())
Log(obj)
void main() {
auto obj = exchange.GetAccount();
// C++ doe not support "GetRawJSON" function
Log(obj);
}
exchange.GetRate()
Gibt die Wechselkurse der aktuell im Austausch verwendeten Währung und der aktuell angezeigten Preiswährung zurück, wobei ein zurückgegebener Wert von 1 anzeigt, dass die Umrechnung des Wechselkurses deaktiviert ist.
Anmerkung:
exchange.SetRate()
wurde nicht zur Festlegung des Wechselkurses aufgerufen, wird der vonexchange.GetRate()
ist standardmäßig 1, d. h. die derzeit angezeigte Wechselkursumrechnung wurde nicht ausgetauscht.exchange.SetRate()
wurde verwendet, um einen Wechselkurswert festzulegen, z. B.exchange.SetRate(7)
, werden alle Preisinformationen des aktuellen Tauschobjekts, das die zirkulierende Währung der Handelsplattform darstellt, wie z. B. Angebote, Tiefe, Auftragspreise usw., mit dem zuvor festgelegten Umrechnungskurs 7 multipliziert.exchange
entspricht einem Austausch mit USD als Preiswährung, nachdemexchange.SetRate(7)
, werden alle Preise des Bots umgerechnet in Preise nahe dem CNY, indem sie mit 7 multipliziert werden.exchange.GetRate()
ist 7.exchange.GetUSDCNY()
Gibt den aktuellsten Wechselkurs des US-Dollars zurück (Datenquelle:yahoo
) Der zurückgegebene Wert: numerischer Typ.
Dieexchange.SetData(Key, Value)
Die Funktion wird verwendet, um die Daten zu setzen, die zum Zeitpunkt des Laufens der Strategie geladen werden, was jeder Wirtschaftsindikator, Branchendaten, relevanter Index usw. sein kann. Sie kann verwendet werden, um alle quantifizierbaren Informationen für Handelsstrategien zu quantifizieren und auch die Verwendung im Backtestsystem zu unterstützen.
Anrufmethode vonexchange.SetData(Key, Value)
Funktion:
Daten direkt in die Strategie schreiben
Das Datenformat ist erforderlich, dadata
Variable im folgenden Beispiel.
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
var data = [
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
exchange.SetData("test", data)
while(true) {
Log(exchange.GetData("test"))
Sleep(1000)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
data = [
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
exchange.SetData("test", data)
while True:
Log(exchange.GetData("test"))
Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
json data = R"([
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
])"_json;
exchange.SetData("test", data);
while(true) {
Log(exchange.GetData("test"));
Sleep(1000);
}
}
Bei Ausführung des obigen Prüfcodes werden die entsprechenden Daten zum entsprechenden Zeitpunkt erhalten, wie in der Abbildung dargestellt:
Wie wir sehen können, die entsprechende Zeit des Zeitstempels1579622400000
ist2020-01-22 00: 00: 00
; wenn das Strategieprogramm nach dieser Zeit ausgeführt wird, vor dem nächsten Datenzeitstempel1579708800000
, d. h. vor dem Zeitpunkt der2020-01-23 00: 00: 00
Ruf denexchange.GetData(Source)
Das Ergebnis ist der Inhalt der[1579622400000, 123]
Während das Programm weiterläuft und sich die Zeit ändert, erhalten Sie Daten Stück für Stück, wie diese.
Anforderung von Daten über externe Links
Gefordertes Datenformat
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Wo ist er?schema
ist das Datenformat jedes Datensatzes im Hauptbestand der geladenen Daten, das Format wird wie folgt festgelegt:["time", "data"]
, entspricht derdata
Das Attributformat der Datendata
Das Attribut speichert den Hauptbestand der Daten, und jedes Stück der Daten besteht aus Zeitstempeln auf Millisekundenebene und Dateninhalten (der Dateninhalt kann beliebige JSON-kodierte Daten sein).
Das Serviceprogramm für die Prüfung ist inGo
Sprache:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
defer func() {
fmt.Println("req:", *r)
ret := map[string]interface{}{
"schema": []string{"time","data"},
"data": []interface{}{
[]interface{}{1579536000000, "abc"},
[]interface{}{1579622400000, 123},
[]interface{}{1579708800000, map[string]interface{}{"price":123}},
[]interface{}{1579795200000, []interface{}{"abc", 123, map[string]interface{}{"price":123}}},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
Nach Erhalt der Anfrage reagiert das Programm auf die Daten:
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Teststrategiecode:
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
while(true) {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Sleep(1000)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
while True:
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
while(true) {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
Sleep(1000);
}
}
Dieexchange.GetData(Source)
Funktion wird verwendet, um die Daten durch dieexchange.SetData(Key, Value)
Die Daten werden während des Backtests einmal erhoben und während des tatsächlichen Handels eine Minute lang zwischengespeichert.
Erlangung der Anrufmethode von Daten, die direkt geschrieben werden
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
exchange.SetData("test", [[1579536000000, _D(1579536000000)], [1579622400000, _D(1579622400000)], [1579708800000, _D(1579708800000)]])
while(true) {
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
exchange.SetData("test", [[1579536000000, _D(1579536000000/1000)], [1579622400000, _D(1579622400000/1000)], [1579708800000, _D(1579708800000/1000)]])
while True:
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
json arr = R"([[1579536000000, ""], [1579622400000, ""], [1579708800000, ""]])"_json;
arr[0][1] = _D(1579536000000);
arr[1][1] = _D(1579622400000);
arr[2][1] = _D(1579708800000);
exchange.SetData("test", arr);
while(true) {
Log(exchange.GetData("test"));
Sleep(1000 * 60 * 60 * 24);
}
}
Methode zum Aufrufen von Daten aus externen Verbindungen
function main() {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
}
def main():
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
void main() {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"));
}
Nutzen Sie die grundlegenden Daten des Plattformdatenzentrums
Verwendenexchange.GetData(Source)
Funktion zu erhaltenGrundlegende Daten.
Bei Anrufen derexchange.GetData(Source)
In der Backtest-System, wenn Sie die Zugriffsoberfläche verwenden, um Daten anzufordern, wird das Backtest-System die Parameter
Die folgenden Funktionen können über dieexchange
oderexchanges[0]
Objekt, zum Beispiel:exchange.Sell(100, 1);
Angabe, dass die nächste Bestellung eine Verkaufsbestellung mit einem Preis von 100 und einer Menge von 1 an der Börse ist.
exchange.Buy(Price, Amount)
wird verwendet, um einen Kaufbefehl zu erteilen und eine Order-ID zurückzugeben.Price
ist der Bestellpreis in Nummern undAmount
ist der Auftragsbetrag in Zahlenform. Rückgabewert: Zeichenfolge- oder Zahlenart (der spezifische Typ hängt von der Rückgabeart jeder Börsenplattform ab).
Die zurückgegebene Bestellnummer kann verwendet werden, um Bestellinformationen abzufragen und Bestellungen zu stornieren.
function main() {
var id = exchange.Buy(100, 1);
Log("id:", id);
}
def main():
id = exchange.Buy(100, 1)
Log("id:", id)
void main() {
auto id = exchange.Buy(100, 1);
Log("id:", id);
}
Futures-Orders
Bei der Bestellung von Futures müssen wir darauf achten, ob die Handelsrichtung korrekt eingestellt ist. Wenn die Handelsrichtung und die Handelsfunktion nicht übereinstimmen, wird ein Fehler gemeldet. Die Anzahl der auf einer Kryptowährungs-Futures-Börse platzierten Aufträge ist die Anzahl der Verträge, sofern nicht anders angegeben. Zum Beispiel:
// The following is the wrong call
function main() {
exchange.SetContractType("quarter")
// Set short direction
exchange.SetDirection("sell")
// Place a buy order, and you will get an error, so you can only sell short
var id = exchange.Buy(50, 1)
// Set short direction
exchange.SetDirection("buy")
// Place a sell order, and you will get an error, so you can only buy long
var id2 = exchange.Sell(60, 1)
// Set close long position direction
exchange.SetDirection("closebuy")
// Place a buy order, and you will get an error, so you can only sell short
var id3 = exchange.Buy(-1, 1)
// Set close short position direction
exchange.SetDirection("closesell")
// Place a sell order, and you will get an error, so you can only buy long
var id4 = exchange.Sell(-1, 1)
}
# The following is the wrong call
def main():
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
id = exchange.Buy(50, 1)
exchange.SetDirection("buy")
id2 = exchange.Sell(60, 1)
exchange.SetDirection("closebuy")
id3 = exchange.Buy(-1, 1)
exchange.SetDirection("closesell")
id4 = exchange.Sell(-1, 1)
// The following is the wrong call
void main() {
exchange.SetContractType("quarter");
exchange.SetDirection("sell");
auto id = exchange.Buy(50, 1);
exchange.SetDirection("buy");
auto id2 = exchange.Sell(60, 1);
exchange.SetDirection("closebuy");
auto id3 = exchange.Buy(-1, 1);
exchange.SetDirection("closesell");
auto id4 = exchange.Sell(-1, 1);
}
Fehlermeldungen:
direction is sell, invalid order type Buy
direction is buy, invalid order type Sell
direction is closebuy, invalid order type Buy
direction is closesell, invalid order type Sell
Marktordnung
Anmerkung: Die Exchange-Order-Schnittstelle ist erforderlich, um Marktordern zu unterstützen (wenn der Auftragstyp ein Kaufbefehl ist, ist der Auftragsbetrag der Betrag in der Kurswährung), und die Market-Order-Methode von Kryptowährungs-Futures wird zum Platzieren von Aufträgen verwendet, und die Einheit des Quantitätsparameters ist dieAnzahl der VerträgeEinige Live-Handelsbörsen für digitale Währungen unterstützen keine Marktorder-Schnittstellen.
// For example, trading pairs: ETH_BTC, bought in by market order
function main() {
// Buy a market order, and buy ETH coins equal to 0.1 BTC (quote currency)
exchange.Buy(-1, 0.1)
}
def main():
exchange.Buy(-1, 0.1)
void main() {
exchange.Buy(-1, 0.1);
}
exchange.Sell(Price, Amount)
platziert einen Verkaufsbefehl und gibt eine Order-ID zurück. Parameterwert:Price
ist der Auftragspreis, numerischer Typ.Amount
ist der Auftragsbetrag, numerische Art. Rückgabewert: Zeichenfolge oder numerische Art (der spezifische Typ hängt von der Rückgabeart jedes Austauschs ab).
Zurückgegebene Bestellnummer, mit der Bestellinformationen abfragen und Bestellungen storniert werden können.
function main(){
var id = exchange.Sell(100, 1)
Log("id:", id)
}
def main():
id = exchange.Sell(100, 1)
Log("id:", id)
void main() {
auto id = exchange.Sell(100, 1);
Log("id:", id);
}
Futures-Orders
Bei der Bestellung von Futures müssen Sie darauf achten, ob die Handelsrichtung korrekt eingestellt ist. Wenn die Handelsrichtung und die Handelsfunktion nicht übereinstimmen, wird ein Fehler gemeldet. Der Auftragsbetrag der Kryptowährungs-Futures-Plattformen ist die Anzahl der Verträge, sofern nicht anders angegeben.
Marktordnungen
Hinweis: Plattform-Orderplacement-Schnittstelle ist erforderlich, um Marktordern zu unterstützen. (Wenn der Auftragstyp eine Verkaufsorder ist, ist der Auftragsbetrag Parameter die Anzahl der verkauften Betriebsmünzen), und Kryptowährungs-Futures platzieren Aufträge nach Marktordern Form, und die Auftragsbetrag Parameter-Einheit ist dieAnzahl der VerträgeEinige digitale Währungsaustauschstellen im realen Handel unterstützen keine Marktorder-Schnittstellen.
// For example, trading pairs: ETH_BTC, sold out by market order
function main() {
// Note: Sell by a market order, and sell 0.2 ETH coins
exchange.Sell(-1, 0.2)
}
def main():
exchange.Sell(-1, 0.2)
void main() {
exchange.Sell(-1, 0.2);
}
exchange.CancelOrder(orderId)
Diese Funktion dient der Stornierung einer Bestellung mit Id. Parameterwert:Id
ist die Auftragsnummer, in Zeichenfolge- oder Zahlenart (der spezifische Typ hängt von der Rückgabeart ab, wenn eine Bestellung auf jeder Plattform gestellt wird); Rückgabewert: bool-Typ.
Das Betriebsergebnis wird zurückgegeben.true
bedeutet, dass die Anforderung zur Stornierung der Bestellung erfolgreich gesendet wurde;false
bedeutet, dass die Stornierungsanforderung nicht gesendet wird (der Rückgabewert zeigt nur an, ob die Sendung erfolgreich ist oder nicht, daher ist es am besten,exchange.GetOrders()
um zu überprüfen, ob die Plattform den Auftrag storniert).
function main(){
var id = exchange.Sell(99999, 1)
exchange.CancelOrder(id)
}
def main():
id = exchange.Sell(99999, 1)
exchange.CancelOrder(id)
void main() {
auto id = exchange.Sell(99999, 1);
exchange.CancelOrder(id);
}
Die API-Funktion von FMZ, die Log-Output-Funktionen erzeugen kann, wieLog(...)
, exchange.Buy(Price, Amount)
undexchange.CancelOrder(Id)
. Sie können die erforderlichen Parameter mit einigen zusätzlichen Ausgabeparametern, wieexchange.CancelOrder(orders[j].Id, orders[j])
Auf diese Weise annulliert esorders[j]
Bestellung, die durch die Ausgabe dieser Bestellung Informationen begleitet wird, nämlichOrder
Struktur derorders[j]
.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
exchange.CancelOrder(id, "Incidental data1", data2, "...")
LogProfit(100, "Incidental data1", data2, "...")
}
def main():
Log("data1", "data2", "data3", "...")
data2 = 200
id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
exchange.CancelOrder(id, "Incidental data1", data2, "...")
LogProfit(100, "Incidental data1", data2, "...")
void main() {
Log("data1", "data2", "data3", "...");
int data2 = 200;
auto id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...");
exchange.CancelOrder(id, "Incidental data1", data2, "...");
LogProfit(100, "Incidental data1", data2, "...");
}
exchange.GetOrder(orderId)
Erhält die Bestelldetails nach der Bestellnummer.Id
ist die zu ermittelnde Ordnungsnummer undId
ist von Zeichenfolge- oder Zahlentyp (der spezifische Typ hängt vom Rückgabetyp jedes Austauschs ab).Order
Struktur.
(Nicht von einigen Börsen unterstützt)
Order
StrukturAvgPrice
zeigt den durchschnittlichen ausgeführten Preis an (einige Börsen unterstützen dieses Feld nicht; setzen Sie es auf 0, wenn sie es nicht unterstützen).function main(){
var id = exchange.Sell(1000, 1)
// The parameter id is the order number, you need to fill in the number of the order you want to query
var order = exchange.GetOrder(id)
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type)
}
def main():
id = exchange.Sell(1000, 1)
order = exchange.GetOrder(id)
Log("Id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:",
order["DealAmount"], "Status:", order["Status"], "Type:", order["Type"])
void main() {
auto id = exchange.Sell(1000, 1);
auto order = exchange.GetOrder(id);
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}
exchange.GetOrders()
Erhält alle unvollendeten Aufträge.Order
Struktur-Array.
FürOrder
Struktur, sieheexchange.GetOrder()
Wenn das Konto, das durch den Austauschobjekt dargestellt wirdexchange
hat keine ausstehenden Aufträge, rufenexchange.GetOrders()
um ein leeres Array zurückzugeben, nämlich:[]
.
function main(){
exchange.Sell(1000, 1)
exchange.Sell(1000, 1)
var orders = exchange.GetOrders()
Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
"DealAmount:", orders[0].DealAmount, "type:", orders[0].Type)
Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
"DealAmount:", orders[1].DealAmount, "type:", orders[1].Type)
}
def main():
exchange.Sell(1000, 1)
exchange.Sell(1000, 1)
orders = exchange.GetOrders()
Log("Information for unfinished order 1, ID:", orders[0]["Id"], "Price:", orders[0]["Price"], "Amount:", orders[0]["Amount"],
"DealAmount:", orders[0]["DealAmount"], "type:", orders[0]["Type"])
Log("Information for unfinished order 2, ID:", orders[1]["Id"], "Price:", orders[1]["Price"], "Amount:", orders[1]["Amount"],
"DealAmount:", orders[1]["DealAmount"], "type:", orders[1]["Type"])
void main() {
exchange.Sell(1000, 1);
exchange.Sell(1000, 1);
auto orders = exchange.GetOrders();
Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
"DealAmount:", orders[0].DealAmount, "type:", orders[0].Type);
Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
"DealAmount:", orders[1].DealAmount, "type:", orders[1].Type);
}
Dieexchange.GetOrders()
Funktion erhält die unvollendeten Auftragsinformationen des aktuellen SatzesHandelspaarEs sollte beachtet werden, dass die Kryptowährungs-Futures nicht nur zwischen Handelsparen, sondern auch zwischen Vertragscodes unterscheiden.
// Test OKX contract tradings, to know whether "GetOrders" gets all unfinished contract orders
function main(){
// The next weekly buy order; the price of the order minus 50 guarantees no execution; pending orders
exchange.SetContractType("this_week")
exchange.SetDirection("buy")
var ticker = exchange.GetTicker()
Log(ticker)
exchange.Buy(ticker.Last - 50, 1)
// The next quarterly sell order; the price plus 50 guarantees that it will not be executed, and the pending order has been switched to a quarterly contract
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Sell(ticker.Last + 50, 1)
// Get the unfinished orders
Log("orders", exchange.GetOrders())
}
def main():
exchange.SetContractType("this_week")
exchange.SetDirection("buy")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Buy(ticker["Last"] - 50, 1)
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Sell(ticker["Last"] + 50, 1)
Log("orders", exchange.GetOrders())
void main() {
exchange.SetContractType("this_week");
exchange.SetDirection("buy");
auto ticker = exchange.GetTicker();
Log(ticker);
exchange.Buy(ticker.Last - 50, 1);
exchange.SetContractType("quarter");
exchange.SetDirection("sell");
ticker = exchange.GetTicker();
Log(ticker);
exchange.Sell(ticker.Last + 50, 1);
Log("orders", exchange.GetOrders());
}
Die erhaltenen unvollendeten Auftragsinformationen:
[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]
Es kann gesehen werden, dass im Handel mit Kryptowährungen die Aufträge, die vonexchange.GetOrders()
sind nur die noch nicht abgeschlossenen Aufträge des derzeit festgelegten Auftrags.
exchange.SetPrecision(PricePrecision, AmountPrecision)
setzt die Dezimalpräzision des Preises und des Symbolorderaufkommens; nach Einstellung wird er automatisch abgeschnitten.PricePrecision
ist Zahlenart und dient zur Kontrolle der Anzahl der Dezimalstellen in den Preisdaten;AmountPrecision
ist Zahlenart, verwendet, um den Dezimalpunkt nach dem Auftragsbetrag zu steuern.PricePrecision
undAmountPrecision
Der Backtest unterstützt die Funktion nicht, und die Zahlenpräzision des Backtests wird automatisch verarbeitet.
function main(){
// Set the decimal precision of the price to 2 digits, and set the precision of the quantity of the symbol order to 3 digits
exchange.SetPrecision(2, 3)
}
def main():
exchange.SetPrecision(2, 3)
void main() {
exchange.SetPrecision(2, 3);
}
exchange.SetRate(Rate)
legt den Wechselkurs der in Umlauf befindlichen Währung an der Börse fest.Rate
ist vonnumber
Rückgabewert:number
type.
function main(){
Log(exchange.GetTicker())
// Set the exchange rate conversion
exchange.SetRate(7)
Log(exchange.GetTicker())
// Set to 1, without conversion
exchange.SetRate(1)
}
def main():
Log(exchange.GetTicker())
exchange.SetRate(7)
Log(exchange.GetTicker())
exchange.SetRate(1)
void main() {
Log(exchange.GetTicker());
exchange.SetRate(7);
Log(exchange.GetTicker());
exchange.SetRate(1);
}
Anmerkung:
Wenn Sie einen Wechselkurswert mitexchange.SetRate(Rate)
, wie 7, dann alle Preisinformationen, einschließlich des aktuellen Marktpreises, der Tiefe und des Auftragspreises der von der aktuellen Währung dargestellten Umlaufwährung.exchange
Der Umrechnungskurs wird mit 7 multipliziert.
Zum Beispiel:exchange
ist ein in US-Dollar lautender Wechselkurs.exchange.SetRate(7)
Wenn der Wert des Zinssatzes in der Währung der Union (CZK) in der Währung der Gemeinschaft (CZK) angegeben wird, werden alle Preise des realen Handels mit 7 multipliziert und auf Preise in der Nähe des CNY umgerechnet.
exchange.IO("api", httpMethod, resource, params, raw)
, andere funktionelle Schnittstellen der Exchange aufrufen.httpMehod
ist String-Typ; er füllt den Anforderungstyp aus, z. B.POST
oderGET
. resource
ist String-Typ, füllt den Anforderungspfad aus.params
ist von String-Typ, füllt er die Anforderungsparameter ein.raw
ist der ursprüngliche JSON-Stringparameter und kann weggelassen werden.exchange.IO("api", httpMethod, resource, params, raw)
Wenn ein Fehler auftritt und der Anruf fehlschlägt, gibt er einen Nullwert zurück (die Funktion mit der Netzwerkanfrage, z. B.GetTicker()
undGetAccount()
, etc., die Nullwerte zurückgeben, wenn Anrufe fehlschlagen).exchange.IO("api", ...)
function.
Für das Beispiel von OKX-Batchorder verwenden Sie den Parameterraw
Um die Bestellparameter zu übergeben:
function main() {
var arrOrders = [
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
]
// Call exchange.IO to directly access the platform batch ordering interface
var ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", JSON.stringify(arrOrders))
Log(ret)
}
import json
def main():
arrOrders = [
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
]
ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", json.dumps(arrOrders))
Log(ret)
void main() {
json arrOrders = R"([
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
])"_json;
auto ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", arrOrders.dump());
Log(ret);
}
Um diese Funktion zu verwenden, müssen Sie zum Austausch gehen, um dieAPI
Sie müssen sich nicht um den Prozess der Parameterverschlüsselung, Signatur und Verifizierung kümmern, wenn Sie einePOST
Anfrage. FMZ hat vollständig an der unteren Schicht verarbeitet, so dass Sie nur die entsprechenden Parameter ausfüllen müssen).
Anmerkung:
Wenn der Schlüsselwert in derparams
Parameter (d.h. der HTTP-Anfrageparameter) ist eine Zeichenkette, sie muss mit einzelnen Anführungszeichen (Symbol'
) auf beiden Seiten des Parameterwerts.
Zum Beispiel:bitfinex
exchange.
var amount = 1
var price = 10
var basecurrency = "ltc"
function main () {
// Notice that amount.toString() and price.toString() both have a ' character on the left and right
var message = "symbol=" + basecurrency + "&amount='" + amount.toString() + "'&price='" + price.toString() + "'&side=buy" + "&type=limit"
var id = exchange.IO("api", "POST", "/v1/order/new", message)
}
amount = 1
price = 10
basecurrency = "ltc"
def main():
message = "symbol=" + basecurrency + "&amount='" + str(amount) + "'&price='" + str(price) + "'&side=buy" + "&type=limit"
id = exchange.IO("api", "POST", "/v1/order/new", message)
void main() {
auto amount = 1.0;
auto price = 10.0;
auto basecurrency = "ltc";
string message = format("symbol=%s&amount=\"%.1f\"&price=\"%.1f\"&side=buy&type=limit", basecurrency, amount, price);
auto id = exchange.IO("api", "POST", "/v1/order/new", message);
}
Beispiel für den ZugriffOKX
Schnittstelle:
function main(){
var ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
}
def main():
ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
void main() {
auto ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT");
Log(ret);
}
Daten, die während der Prüfung zurückgegeben werden:
{"code":"0","data":[],"msg":""}
Weitere Einstellungen desexchange.IO
Funktion:
Wechseln Sie die Handelspare der aktuellen Börse
exchange.IO("currency", "ETH_BTC")
function main() {
// For example, set the current trading pair of the exchange object on the bot to BTC_USDT, and print the current trading pair market
Log(exchange.GetTicker())
// Switch trading pair to LTC_BTC
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
}
def main():
Log(exchange.GetTicker())
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
void main() {
Log(exchange.GetTicker());
exchange.IO("currency", "LTC_BTC");
Log(exchange.GetTicker());
}
Auf diese Weise wird dieHandelspaarekonfiguriertwenn der Bot hinzugefügt wirdoderDer Backtest ist ausgeführtwird durch die Codes gewechselt.
Anmerkung:
ETH_BTC
, die nur aufLTC_BTC
, nichtLTC_USDT
.websocket
Protokollmodus ist auf den Huobi Spot-Austausch-Objekte geschaltet, können Sie nicht verwendenexchange.IO("currency", "XXX_YYY")
Um die Währungen zu wechseln.exchange.SetCurrency(Symbol)
Funktion, um Handelspare zu wechseln undexchange.IO("currency","XXX_YYY")
Methode zur Aufrechterhaltung der Kompatibilität.exchange.IO
Funktion die Exchange-API-Basisadresse (RESET-Vertrag; einige Börsen unterstützen das nicht) wechseln.
Jetzt die Verwendung vonexchange.SetBase(Base)
Funktion wurde unterstützt, um die Exchange-API-Basisadresse zu wechseln undexchange.IO("base","https://xxx.xxx.xxx")
Methode zur Aufrechterhaltung der Kompatibilität.
Zum Beispiel: Wenn das Exchange-Objekt verkapselt ist, ist die Standardbasisadressehttps://api.huobipro.com
, um auf:https://api.huobi.pro
, verwenden Sie den folgenden Code.
function main () {
// exchanges[0] is the first exchange object added when the bot is added
exchanges[0].IO("base", "https://api.huobi.pro")
}
def main():
exchanges[0].IO("base", "https://api.huobi.pro")
void main() {
exchanges[0].IO("base", "https://api.huobi.pro");
}
Wechseln Sie die Basisadresse zurück auf:https://api.huobipro.com
.
function main () {
exchanges[0].IO("base", "https://api.huobipro.com")
}
def main():
exchanges[0].IO("base", "https://api.huobipro.com")