Grid-Strategie und Martingale-Strategie, die gerne die Marktkurse schwankt, haben inhärente Nachteile, und ähnliche Strategien wurden auf dem ETH-Kontraktmarkt für einen Zeitraum getestet.FMZ.COMEs gibt eine Sache, mit der ich wirklich mit einem Freund über diese Art von Strategie übereinstimme. Das ist, Kontrakte im Währungskreis zu machen, und das Risiko, lange zu gehen, ist geringer als das von Shorting. Oder einfach gesagt, der schlimmste Fall ist, auf Null zurückzukehren, aber der Anstieg ist unendlich.
Sind Strategien wie Martingale und Grid also nur lang, aber nicht kurz? Ist es besser, das Risiko der Grundfischung in einer langen Reichweite zu verbreiten, als bilateral zu tun? Diese Idee klingt sehr gut, aber niemand weiß, ob sie dem tatsächlichen Kampf standhalten kann. Aber zumindest können wir diese Idee einfach zurückprüfen. Deshalb haben wir das Thema des heutigen Artikels - Entwerfen Sie eine Vertragsgrundfischstrategie.
Der Code zur Umsetzung dieser Idee ist sehr einfach, dank der Flexibilität, der Schnittstellenverkapselung und des leistungsstarken Backtestsystems der FMZ-Plattform usw. Der gesamte Code besteht nur aus 60 Zeilen (für die Code-Schreibspezifikationen sind viele Zeilen, die abgekürzt werden können, nicht abgekürzt).
Der Entwurf der Strategieidee ist sehr einfach. Gemäß dem Anfangspreis am Anfang der Logik, platzieren Sie eine Kauforder, wenn die Intervalldistanz reduziert. Wenn der Preis weiter sinkt, setzen Sie eine Kauforder und halten Sie den Boden Fischen. Dann warten Sie auf die Schließung der Position nach dem Positionpreis Hinzufügen eines bestimmten Gewinnspreises, und warten Sie auf den Schluss. Wenn die Position geschlossen ist, wird die obige Logik mit dem aktuellen Preis als Anfangspreis wiederholt. Die Strategie ist nicht kurz, nur lang.
Strategie-Quellcode:
function cancelAll() {
while (true) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(interval)
}
}
}
function getLong(arr, kind) {
var ret = null
for (var i = 0 ; i < arr.length ; i++) {
if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
ret = arr[i]
}
}
return ret
}
function pendingBidOrders(firstPrice) {
var index = 0
var amount = baseAmount
while (true) {
var pos = _C(exchange.GetPosition)
var price = firstPrice - index * baseSpacing
amount *= ratio
index++
exchange.SetDirection("buy")
exchange.Buy(price, amount)
if (pos.length != 0) {
var longPos = getLong(pos, "pos")
if (longPos) {
exchange.SetDirection("closebuy")
exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
}
}
while (true) {
Sleep(interval)
if (!getLong(_C(exchange.GetOrders), "orders")) {
cancelAll()
break
}
if (!getLong(_C(exchange.GetPosition), "pos")) {
cancelAll()
return
}
}
}
}
function main() {
exchange.SetContractType(symbol)
while (true) {
pendingBidOrders(_C(exchange.GetTicker).Last)
}
}
Die Konstruktion der Parameter ist ebenfalls sehr einfach:
Es gibt nur mehrere Parameter.
Setzen Sie den Backtest-Zeitrahmen zufällig:
Rücktest:
Es sieht aus wie eine Gitter- oder Martingale-Art-Strategie. Haben neue Lernende, die gerade erst anfangen, große Angst vor dieser Art langer Strategien und werden leicht davon überzeugt, aufzuhören? Eine kurze und prägnante Strategieeinführung ist besser geeignet, und es ist einfacher, Strategieideen zu verdauen und logisches Design zu lernen.
Die oben genannten Strategiecodes dienen ausschließlich zur Untersuchung und Forschung.