Jetzt sind wir endlich in Kapitel 2, und durch die Besichtigung des vorhergehenden Kapitels sollten wir ein gewisses Verständnis für die Funktionen der Erfinderquantifizierung haben.
Nehmen wir an, dass die Führung durch den ersten Kapitel bereits den Treuhänder, die Börse hinzugefügt hat, und natürlich können wir mit der Erfinder-Quantifizierungs-Analogdiskette für Code-Tests arbeiten.
Also, wenn wir eine Strategie erstellen, dann nennen wir sie Test 1.
Strategie-Editing-Schnittstelle
Der Code lautet:
function main() {
Log(exchange.GetAccount()); // 看过API 文档后知道, exchange就是交易所对象,实际上策略有个全局变量
// exchanges 数组,这个数组存放的就是你创建机器人或者回测时添加的交易所(可以是多个)
// 添加1个交易所 exchanges 数组就只包含1个交易所对象,即添加的交易所对象。
// 那么 exchange 和 exchanges 是什么关系呢? 其实 exchange 就是 exchanges[0] ,
// exchange 就是 exchanges 数组的第一个元素(这里这个元素是交易所对象)。
// Log()函数应该也不陌生吧,这个API 就是输出一条日志,日志内容就是Log括号里面的参数。
}
Erstellen eines Roboters, auch Test 1 genannt, ist eine Strategie, die mit dem Namen Test 1 gebunden ist.
Die Strategie wird sofort ausgeführt und zeigt eine Kontoinformation an.
Das zeigt, dass wir die Kontoinformationen der Analogdiskette mit denen der Analogdiskette vergleichen.
function main() {
Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了
//下面我们来试试 不停的获取行情数据。
while(true){ // 这里用一个无限循环的结构来不停的获取 交易所行情数据。
Log("行情数据:", exchange.GetTicker()); // 哇! Log() 函数的括号里面可以写2个参数,第一个参数是: "行情数据:"
// 第二个参数是 exchange.GetTicker() 这个函数的返回值。就是主交易所的行情数据。
// 注意 Log() 函数的参数要用 逗号分隔。
Sleep(1000); // 咦~ 这个又是什么? 答:机器人程序 执行循环也需要休息!它可是执行很快的哦!(一秒N次)
// Sleep 函数的作用就是让程序暂停一会儿,括号里面的参数 1000 是 毫秒数, 1秒 = 1000毫秒。Sleep(1000);就是暂停1000毫秒。
// 不要小看这个参数,这个参数控制了程序的轮询频率,间接影响访问 交易所API 的频率,有些交易所API访问过于频繁可是会拒绝访问的。
}
}
Anmerkung:Einige Kollegen werden vielleicht feststellen, dass die Daten, die von der GetTicker-Funktion erhalten werden, zwischen Höchst- und Mindestpreisen sehr unterschiedlich sind. Hierbei handelt es sich um die höchsten und niedrigsten Preise der Marktdaten, die von GetTicker zurückgegeben werden. Die höchsten und niedrigsten Preise innerhalb eines von der Börse vereinbarten Zyklus sind, je nachdem, wie die Börse eingestellt ist.
GetRecords(Period) 返回一个K线历史, K线周期在创建机器人时指定, Record数组结构
不加参数, 默认返回添加机器人时时指量的K线周期, 但也可以自定义K线周期
支持: PERIOD_M1 指1分钟, PERIOD_M5 指5分钟, PERIOD_M15 指15分钟, PERIOD_M30 指30分钟, PERIOD_H1 指1小时, PERIOD_D1 指一天
Wir schreiben einen Testcode, der die Daten der K-Linien für die Standard-Zyklen (z.B. 5 Minuten) erhält.
function main() {
Log(exchange.GetAccount()); // 已经知道怎么获取 主交易所 账户信息了
//下面我们来试试 不停的获取行情数据。
var records = exchanges[0].GetRecords(); // 按照默认周期获取K线数据
Log("records:", records); // 在日志中输出 获取到的K线数据。
}
Die Ausgabe zeigt:
Aufzeichnungen:
[{
Variable records ist eine strukturelle Array, die in der Reihenfolge von fern (index0) bis nahe (indexrecords.length - 1) in der Reihenfolge von K-Zeilen angeordnet ist. Wir verstehen die K-Linien übrigens: (einige Diagramme sind rot für die Sonnenstrahlen, grün für die Venen, andere sind umgekehrte Farben.)Schauen Sie sich die K-Linien-Beispieldiagramme für die 5-minütige Periode der Plattform an. Bitte beachten Sie:Ein K-Rechenschaftszyklus ist abgeschlossen, und sein Wert ist festgesetzt. In der Praxis nennen wir var records = exchanges. GetRecords (); das letzte Element in der zurückgegebenen Datensatz-Array, nämlich: records [records.length - 1], ändert sich ständig, bis sein Zyklus abgeschlossen ist. Es ist sogar möglich, dass er in der letzten Sekunde von Sonnenlicht zu Sonnenlicht verändert wird.
Die Funktion GetRecords kehrt die Daten nach den Standardeinheiten der Politik zurück, wenn keine Parameter hinzugefügt werden. Sie kann auch Parameter für die Periode von K-Linien übertragen. Derzeit unterstützt das Retesting-System GetRecords, um Parameter für die Periode zu übertragen (die Daten nach den Standardeinheiten der Politik zurückgeben, wenn keine Parameter hinzugefügt werden).
function main() {
var depth = exchanges[0].GetDepth(); //获取市场深度信息, 返回订单薄信息,一个对象包含2个属性,每个属性是一个对象数组。
Log("depth:", depth); // 日志中输出,一下的输出是 整理过的格式,是方便读者理解,实际上是所有内容都在一行显示的。
}
Die Code-Rückprüfung zeigt:
depth:
{"Asks":[{"Price":4726.07,"Amount":15}, // 卖单数组,回测时,数据都是模拟出来的,所以Amount 都是 15,索引为0的是卖一,依次类推。
{"Price":4726.08,"Amount":15},
{"Price":4726.09,"Amount":15},
{"Price":4726.1,"Amount":15},
{"Price":4726.11,"Amount":15},
{"Price":4726.12,"Amount":15},
{"Price":4726.13,"Amount":15},
{"Price":4726.14,"Amount":15},
{"Price":4726.15,"Amount":15},
{"Price":4726.16,"Amount":15},
{"Price":4726.17,"Amount":15}],
"Bids":[{"Price":4726.05,"Amount":15}, // 买单数组,索引为0的是买一, 向后依次类推。
{"Price":4726.04,"Amount":15},
{"Price":4726.03,"Amount":15},
{"Price":4726.02,"Amount":15},
{"Price":4726.01,"Amount":15},
{"Price":4726,"Amount":15},
{"Price":4725.99,"Amount":15},
{"Price":4725.98,"Amount":15},
{"Price":4725.97,"Amount":15},
{"Price":4725.96,"Amount":15},
{"Price":4725.95,"Amount":15}]
}
Die entsprechenden Orderbins sehen so aus (hier sind die tatsächlichen Daten von OKCoin). Die tatsächlichen Markttiefen der Informationen ändern sich schnell, interessierte Schüler können OKCoin registrieren und sich dann anmelden.
Wie kann man Marktdetails nutzen, wenn man tiefgreifende Informationen über den Markt hat?
function main() {
var depth = exchanges[0].GetDepth(); // 获取市场深度
Log("depth:", depth); // 日志输出显示
Log(exchanges[0].GetAccount()); // 输出 吃单前的 账户信息
var buyPrice = depth.Asks[0].Price; // 设置吃卖单的价格,即卖一,
// 有时为确保吃单成功,这样处理:var buyPrice = depth.Asks[0].Price + slidePrice;
var buyAmount = depth.Asks[0].Amount; // 吃卖单的量
exchanges[0].Buy(buyPrice, buyAmount); // 执行买入操作, 吃掉卖一 这个单子
Log(exchanges[0].GetAccount()); // 显示买入后的 账户信息,对比初始账户信息。可以对比出 买入操作的成交的数量。
}
Das Ergebnis der Quantitative Erfindung der Analogie:
FlydogZweitens, als ich einen öffentlichen Host in den USA wählte, gab es kein Warnzeichen in der Liste der Roboter, aber als ich losfuhr, gab es keine Informationen in den Logs, was darauf hindeutete, dass es keine Login-Informationen gab.
FlydogErgänzen Sie die Beobachtung des Problems: In der Liste der Roboter ist der Zustand ein Ohrringe in einem roten oberen Dreieck, als wäre es eine Ausnahmerufung.
FlydogHallo, ich habe mit der Plattform simuliert und Tests durchgeführt, der erste Schritt war die Prüfung der Kontoinformationen, keine Log-Ausgabe, Fehler werden angezeigt, ich weiß nicht, wo das Problem ist? Der Roboter-Testcode: Funktion main (() { Log ((exchange.GetAccount (())); Log (("Test"); Wir sind hier. Das Ergebnis: Test 1 Strategie: Test 1 (letztes Mal aktualisiert 2018-09-13 14:25:33) Datum: Erstellt am 13.09.2018 14:07:57 Jüngst gestartet am 13.09.2018 14:40:24 Ende am 13.09.2018 14:40:25 Zustand: K-Linie-Zyklus 1 Minute fehlerhaft, gehostet in China: 42.236.82.38 - linux/amd64 (öffentlich), ID: 118025 Die Handelsplattform: BotVS/BTC_USD
FlydogHallo, ich habe mit der Plattform simuliert und Tests durchgeführt, der erste Schritt war die Prüfung der Kontoinformationen, keine Log-Ausgabe, Fehler werden angezeigt, ich weiß nicht, wo das Problem ist? Der Roboter-Testcode: Funktion main (() { Log ((exchange.GetAccount (())); Log (("Test"); Wir sind hier. Das Ergebnis: Test 1 Strategie: Test 1 (letztes Mal aktualisiert 2018-09-13 14:25:33) Datum: Erstellt am 13.09.2018 14:07:57 Jüngst gestartet am 13.09.2018 14:40:24 Ende am 13.09.2018 14:40:25 Zustand: K-Linie-Zyklus 1 Minute fehlerhaft, gehostet in China: 42.236.82.38 - linux/amd64 (öffentlich), ID: 118025 Die Handelsplattform: BotVS/BTC_USD
HokshelatoBei der Simulation wird `exchange.GetTicker()` aufgerufen, oft erscheint **GetTicker: timeout**, warum?
Das ist alles.Hallo, ist die Simulation der Echtzeitdaten die Echtzeitdaten der Börse?
- Das ist nicht wahr.Zhejiang
ShandyanliyuGibt exchange.GetDepth (()) die gesamte Datenbank der aktuellen Börse zurück? Gibt es zu viele Datenbanken, die nur einen Teil der Daten zurückgeben?
MaohbaoGetRecords ((Period)) gibt eine K-Zeilengeschichte zurück, aber wie viele K-Zeilbars enthält diese K-Zeilengeschichte und wo wird dies angegeben?
ZürichOkay, ich hatte den falschen Schlüssel, ich habe ihn korrigiert.
ZürichGetAccount: Unterschriften nicht übereinstimmen Wie soll ich das machen, Monk?
Andy2 ist einfach.Warum ist der Amount für die Analogie-Depth immer 15? Ist die Analogie-Disk vergangene Daten oder zufällig generierte Daten? Wenn es vergangene Daten sind, kann der Amount einen Wert haben.
Czz140Wie unterscheiden sich Objekte von Funktionen? Zum Beispiel depth (Asks (Preis, Menge)), wo depth das Objekt ist, und asks die Array?
FangBeiWas ist slidePrice?
Die Erfinder quantifizieren - Kleine TräumeWenn Sie noch Fragen haben, können Sie die offizielle QQ-Gruppe @Administrator anmelden.
FlydogDanke für die vielen Antworten, ich habe den Tipp befolgt und versuche es noch einmal.
Die Erfinder quantifizieren - Kleine TräumeIch weiß nicht, ob es ein Problem mit einem öffentlichen Host ist, aber Sie können es mit einem privaten Host testen, und der private Host sollte möglich sein.
Die Erfinder quantifizieren - Kleine TräumeVersuchen Sie es mit Ihrem eigenen privaten Host.
Die Erfinder quantifizieren - Kleine TräumeDies könnte konkret sein, was für eine Logik die Strategie ausführt, oder es könnte sein, dass die Strategie normal funktioniert, aber keine Aktionen auslöst.
Die Erfinder quantifizieren - Kleine TräumeBei einem roten Ausbruch ist es ein Roboter, der einen Fehler meldet, der dazu führt, dass das Roboterprotokoll oder die Administratorenprotokollierung überprüft werden muss.
Die Erfinder quantifizieren - Kleine TräumeEin kürzlich aufgetretenes Netzwerkproblem, bei dem die Analogdisk-Verbindungen nicht aktualisiert werden, ist überfällig.
Die Erfinder quantifizieren - Kleine TräumeDie Simulation ist eine 24-Stunden-Simulation, die sich an den Märkten mehrerer Mainstream-Börsen orientiert. Alle Benutzer, die die Simulation nutzen, sind Teilnehmer an dieser Simulation.
ShandyanliyuOkay, jetzt verstehe ich. Danke.
Die Erfinder quantifizieren - Kleine TräumeDas ist eine sehr schwierige Frage, aber es ist eine sehr schwierige.
ShandyanliyuDanke. Bitte fragen Sie auch, ob bei der simulierten Echtplatten-Simulation der Analogie getestet wurde, dass exchange.GetDepth ()) BotVS-konforme Daten oder echte historische Daten zurückgibt?
Die Erfinder quantifizieren - Kleine TräumeDie Anzahl der zurückgegebenen Dateien Wie viele genau? Schauen Sie auf die API-Schnittstelle der Börse. Einige Börsen geben mehr zurück, andere weniger, und einige Börsen unterstützen die Schnittstelle.
Die Erfinder quantifizieren - Kleine TräumeEs ist nicht möglich, zu bestimmen, wie viele zurückgekehrte K-Streifen an den Börsen gesendet werden. Die Anzahl der Pushes kann von einer Börse zur anderen variieren. Einige andere Börsen bieten keine K-Streifen-Schnittstelle an.
Die Erfinder quantifizieren - Kleine Träume^^ Ich habe mich auch am Anfang geirrt~
Die Erfinder quantifizieren - Kleine TräumeNun, lassen Sie uns darüber nachdenken, es gibt zwei Hauptpunkte: - 1. Die Datenmenge in der Tiefe ist so riesig, sie verändert sich jede Sekunde, und sie verändert sich so schnell, dass wir tatsächlich nur ein Stückchen sehen. - 2, selbst wenn wir die tatsächlichen Tiefendaten erstellen, können wir keine genauen Simulationen von Auftrags-Dünenumgebungen erstellen, da wir zu diesem Zeitpunkt nur wir selbst und keine anderen Teilnehmer in der Rückmessung sind. Aber wir werden uns Gedanken machen, wie wir die Optimierung so gut wie möglich an die Realität anpassen.
Andy2 ist einfach.Tiefdaten sind noch nicht passiert, die Preiskurven sind in der Vergangenheit passiert. Einzelpersonen glauben, dass die Daten aus der Vergangenheit und aus der Zukunft zusammen das aktuelle Kauf- und Verkaufsspruch zuverlässiger machen. Es wird dringend empfohlen, die Tiefdaten auch aufzuzeichnen.
Die Erfinder quantifizieren - Kleine TräumeDie Tiefendaten sind zu groß, wenn sie alle erfasst werden. Daher sind die Tiefendaten außer Grade 1 nur simulierte Werte.
Die Erfinder quantifizieren - Kleine Träumerecords ist eine Variable, mit der die API-Funktion GetRecords die K-Streckendaten zurückgibt, length ist die Längenattribute der Array-Typ-Variablen in der JS-Sprache, die die Arraylänge (d. h. die Anzahl der Elemente darunter) repräsentiert.
Die Erfinder quantifizieren - Kleine TräumeDer Preis, der etwas unmissverständlich übersetzt wird, ist, dass es einfacher ist, einen Preis für ein Stück zu essen und ein Stück zu kaufen.