Wenn ich noch keine Strategien mit dieser leicht zu erlernenden Sprache schreiben würde, dann würde ich...

Schriftsteller:Kleine Träume, Erstellt: 2022-06-01 17:37:55, Aktualisiert: 2023-09-18 20:19:45

img

Wenn ich noch keine Strategien mit dieser leicht zu erlernenden Sprache schreiben würde, dann würde ich...

Es ist bedauerlich, dass so viele großartige Strategien, Ideen und Indikatoren auf TradingView nicht realisiert werden können. FMZ ist natürlich nicht in der Lage, den Drang zu unterdrücken, diese Bedürfnisse zu lösen, da es sich darum bemüht hat, die Quantitative-Trading-Technologie für viele Händler zu verbreiten.

Die Nachfrage ist absolut unerträglich!

In der Welt der Programmierung entwickelte sich der Code, in der man sich auf den Berg schwimmt, über viele Berge hinweggeht, 9*9=81 Gräber durchlebt, unzählige schlaflose Nächte durchlebt, und die Wandwinkeln nach dem Aufstauen von kleinen Red Bull-Leerkästchen häufen.

Ich habe es auch erst vor kurzem selber gelernt. Aber die Wahrheit ist, dass die Pine-Sprache als Quantitative-Transaktions-Sprache einfach und leicht zu lernen ist. Was? Glaubst du nicht? Schau, meine Zwiebeln haben dir eine Gitterstrategie geschrieben.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

FMZ verfügt über eine Vielzahl von Funktionen, einschließlich einer realen Platte, Retest-Tools und der einfachen Benutzerfreundlichkeit der Pine-Sprache.

Natürlich ist diese Strategie eine Netz-Strategie, Netz-Strategie hat auch eine Verletzung, und nicht ein Win-Win-Druckmaschine, der Schlüssel ist der Gebrauch, die Parameter. Das ist nicht zu beschreiben, wir konzentrieren uns mehr darauf, wie einfach Strategie zu schreiben, um Ihre eigene Handelslogik zu realisieren, selbst schreiben Strategie Handel Geld zu verdienen, ohne Menschen zu bitten.

Code-Erläuterung

Ich bin hier, um Ihnen zu erklären, dass der Code einfach und leicht verständlich ist, und wenn Sie noch keine Strategien in dieser leicht zu erlernenden Pine-Sprache schreiben, dann werde ich... im Detail erzählen!

Anfangs/*backtestund*/Der Inhalt der Verpackung ist der Wiederholungskonfigurationscode von FMZ, der eine Funktion von FMZ ist und nicht der Inhalt der Pine-Sprache. Natürlich können Sie diesen Teil nicht schreiben.

/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/

Der Code lautet:

strategy(overlay=true)

varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
  • strategy(overlay=true)Einige Optionen, mit denen man das Skript einstellt, sind:overlayDie Bezeichnung "true" wird verwendet, um das Hauptdiagramm des Diagramms (das K-Strangdiagramm ist das Hauptdiagramm, das ist so einfach zu verstehen) zu zeichnen.
  • varip beginPrice = 0: Mit dem Schlüsselwort varip wird eine Variable beginPrice mit dem ursprünglichen Wert 0 angegeben, der als ursprünglicher Preis für das Gitter verwendet wird.
  • var spacing = input.float(-1, title="间距价格"): Setzen Sie einen Strategieparameter, den Sie "Price Gap" nennen, der für jeden Gitterpunkt liegt. Setzen Sie 100 auf den Preis pro 100 und handeln Sie einmal.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"])Es gibt eine Strategie-Parameter: Sie setzen einen Strategie-Parameter, der sich "Last Direction" nennt. Dieser Parameter ist eine Option mit einem Drag-and-Roll-Rahmen, bei der Sie auswählen können: long, short, both.
  • var amount = input.float(-1, title="下单量"): Setzt einen Parameter, der die Anzahl der Transaktionen an jedem Gitterpunkt steuert.
  • var numbers = input.int(-1, title="网格数量"): Anzahl der Gitterpunkte, 20 ist 20 Gitterpunkte in einer Richtung.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintickEin Parameter wird festgelegt, um zu steuern, wie viel Preisdifferenz bei jedem Gitterpunkt steigt.

Der nächste Schritt ist der Code:

if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
    runtime.error("参数错误")

Das heißt, wenn keine der Parameter spacing, amount, numbers, profit eingestellt ist und die Standardzahl -1 ist, wird die Strategie gestoppt (ohne Parameter kann man nicht blind laufen - haha!)

Geht weiter!

if not barstate.ishistory and beginPrice == 0 
    beginPrice := close 

Dies bedeutet, dass, wenn die Strategie in der Echtzeit-K-Linienphase ist und beginPrice == 0 ist, der BeginPrice der aktuelle aktuelle Preis gegeben wird. Es kann verstanden werden, dass der ursprüngliche aktuelle Preis beim offiziellen Betrieb der Strategie der ursprüngliche Gitterpreis ist. Da das Skript eine historische K-Line BAR-Phase hat, wird die Strategie in der historischen BAR-Phase logisch wiederholt ausgeführt.

Was ist die historische BAR-Phase?

Ein einfaches Beispiel: Zum Beispiel, wenn die Strategie im Moment A beginnt zu laufen, bekommt die Strategie eine Datenbank mit 100 K-LinienBAR, die mit der Zeit sicherlich 100 BARs werden und 101 werden, 102... N. Wenn sie im Moment A beginnt zu laufen, ist die 101. BAR die Echtzeit-K-Linienphase, die aktuelle Echtzeit-Datenphase. Also von der 1. BAR bis zur 100. BAR, das sind alle vergangene historische Verläufe, aber die Strategie läuft auch in diesen historischen Verläufen, also ist diese Phase die historische K-Linienphase.

barstate.ishistoryDas ist eine Variable, die in der Sprache Pine eingebaut ist.barstate.ishistoryWenn es nicht die historische Phase ist, ist es falsch. Wenn es also nicht die historische Phase ist, ist es falsch.

Dann haben wir eine Funktion erstellt.

findTradeId(id) =>
    ret = "notFound"
    for i = 0 to strategy.opentrades - 1
        if strategy.opentrades.entry_id(i) == id 
            ret := strategy.opentrades.entry_id(i)
    ret 

Die Funktion sucht nach der Existenz einer bestimmten ID unter allen Bestellungen, die bereits ausgeführt wurden. Wenn die Funktion findTradeId vorhanden ist, wird die ID der vorhandenen Einheit aufgerufen (beachten Sie, dass diese ID nicht die Order-ID der Börse ist, sondern der Name oder das Etikett der Strategie für die Bestellung ist).

Der nächste Schritt war, das Netz zu gestalten:

// 实时K线阶段
if not barstate.ishistory
    // 检索网格
    for i = 1 to numbers
        // 做多
        direction = dir == "both" ? "long" : dir 
        plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
        if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.long,  qty=amount, limit=beginPrice-i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
        // 做空
        direction := dir == "both" ? "short" : dir 
        plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
        if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
            strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
            strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)

Die For-Runde wird verwendet, um die Anzahl der Runden zu bestimmen, d.h. die entsprechenden Zahlen der Bestellungen zu platzieren. Die Dir-Funktion wird eingesetzt, um die Richtung festzulegen. Die FindTradeId-Funktion wird verwendet, um herauszufinden, ob die Markierung der aktuellen Gitterposition bereits ausgeführt wurde und nur dann nach unten zu gehen, wenn sie nicht ausgeführt wurde. Die Unterorder wird mit der Strategy.order-Funktion mit dem Limit-Parameter als Planlist verwendet. Die gleichzeitige Unterordnungsliste wird mit der Strategy.exit-Funktion ausgeführt.

img

img

img

img

Wenn man sich die Ertragskurve ansieht, sieht man, dass die Netze auch riskant sind, nicht ein Gewinn, sondern nur ein wenig geringer, wenn man die Netze auf einer großen Skala vergrößert.

Also, wenn ich noch keine Strategien in dieser leicht zu erlernenden Sprache, Pine, geschrieben habe, dann würde ich...


Verwandt

Mehr

StalkerDiese Art von Tutorials kann man mehr als ein paar, vorzugsweise speziell für eine Pine Tutorials (Kenntnisse bezahlt)hhh...

ArtronIch danke Ihnen.

Bbbwwed 2009Die Träume von V5

Kleine TräumeJa, eine Reihe von Pine-Tutorials wurden bereits auf Station B gemacht: https://www.bilibili.com/video/BV1sU4y1B71i/

Kleine TräumeDanke für die Unterstützung von FMZ.

Kleine TräumeAuf der B-Station gibt es ein Einführungsvideo zur PINE-Sprache.