avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann ...

Erstellt in: 2022-06-01 17:37:55, aktualisiert am: 2023-09-18 20:19:45
comments   6
hits   2992

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Auf TradingView gibt es eine überwältigende Anzahl von Open-Source-Strategien. Es ist schade, dass so viele hervorragende Strategien, Ideen und Indikatoren nicht in die Praxis umgesetzt werden können. Vor diesem Hintergrund kann FMZ, das sich der Popularisierung quantitativer Handelstechnologie bei vielen Händlern verschrieben hat, den Drang, dieser Nachfrage nachzukommen, natürlich nicht unterdrücken!

Diese Forderung ist schlichtweg unerträglich!

In der Welt des Programmiercodes reiste ich durch Berge und Flüsse und erlebte 9*9=81-Boxengasse, nach zahllosen schlaflosen Nächten türmte sich in der Ecke ein Berg leerer Red-Bull-Dosen. Schließlich unterstützt FMZ die Sprache Pine und ist mit dieser kompatibel, und es können verschiedene TradingView Pine-Skripte verwendet werden.

Apropos Pine-Sprache: Ich habe sie mir erst vor Kurzem selbst beigebracht. Aber um ehrlich zu sein, ist die Pine-Sprache für quantitativen Handel wirklich einfach, leicht zu verwenden und leicht zu erlernen. Was? Sie glauben es nicht? Schauen Sie, wie ich eine Rasterstrategie für Sie schreibe~

/*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)

FMZs Echtzeithandel, Backtesting-Tools, zahlreiche Funktionen und die Benutzerfreundlichkeit der Pine-Sprache sind wie das Hinzufügen von Flügeln zu einem Tiger! Einschließlich der Parametereinstellungen und der Backtest-Konfigurationscodes überschreitet die Gesamtzahl der Codes 50 Zeilen nicht. Anfänger müssen sich nicht mehr mit dem Schreiben eines Rasters herumschlagen…

Natürlich handelt es sich bei dieser Strategie um eine Gitterstrategie. Auch Gitterstrategien haben ihre Schwächen und sind keine garantierten Gelddruckmaschinen. Der Schlüssel liegt in ihrer Verwendung und ihren Parametern. Ich werde auf diesen Punkt nicht näher eingehen. Konzentrieren wir uns mehr darauf, wie Sie ganz einfach Strategien schreiben, Ihre eigene Handelslogik implementieren und durch das Schreiben Ihrer eigenen Strategien Geld verdienen können. Es fühlt sich so gut an, ohne jemanden um Hilfe bitten zu müssen! !

Code Erklärung

Lassen Sie es mich Ihnen erklären. Der Code ist einfach und leicht zu verstehen. Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Pine-Sprache schreiben können, dann werde ich es tun…….. ……… …………………….Lassen Sie es mich Ihnen im Detail erzählen!

Am Anfang/*backtestUnd*/Der gepackte Inhalt ist der FMZ-Backtest-Konfigurationscode, der die Funktion von FMZ ist, und nicht der Inhalt der Pine-Sprache. Natürlich können Sie diesen Teil auch weglassen. Beim Backtesting müssen Sie die Parametersteuerelemente manuell anklicken, um die Backtest-Konfiguration und -Parameter festzulegen.

/*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 folgende Code:

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): Wird verwendet, um einige Optionen des Skripts festzulegen, overlay=true, d. h. Parameter anzugebenoverlayWeisen Sie den Wert „true“ zu, um das Bild auf dem Hauptbild des Diagramms zu zeichnen (das K-Linien-Diagramm ist das Hauptbild, es kann so einfach verstanden werden).
  • varip beginPrice = 0: Eine Variable beginPrice wird mit dem Schlüsselwort varip deklariert und erhält zunächst den Wert 0, der als Anfangspreis des Rasters verwendet wird.
  • var spacing = input.float(-1, title="间距价格"): Legen Sie einen Strategieparameter fest. Der Parametername lautet „Intervallpreis“, also das Intervall zwischen den einzelnen Gitterpunkten. Wenn er auf 100 eingestellt ist, bedeutet dies, dass jedes Mal eine Transaktion durchgeführt wird, wenn der Preis 100 überschreitet.
  • var dir = input.string("long", title="方向", options = ["long", "short", "both"]): Ein Strategieparameter mit dem Namen „Richtung“ wird festgelegt. Dieser Parameter ist eine Option mit einem Dropdown-Feld, und Sie können „Long“, „Short“ oder beides auswählen. Sie geben jeweils an, dass das Raster nur Long-Trades, nur Short-Trades oder sowohl Long- als auch Short-Trades durchführt.
  • var amount = input.float(-1, title="下单量"): Legen Sie einen Parameter fest, um das Transaktionsvolumen bei jeder Gitterpunkttransaktion zu steuern.
  • var numbers = input.int(-1, title="网格数量"): Die Anzahl der Gitterpunkte. Wenn Sie den Wert auf 20 setzen, bedeutet dies, dass es 20 Gitterpunkte in einer Richtung gibt.
  • var profit = input.int(-1, title="盈利价差") / syminfo.mintick: Legen Sie einen Parameter fest, um die Preisdifferenz zu steuern, bei der die Position an jedem Gitterpunkt geschlossen wird.

Schauen Sie sich als nächstes den Code an:

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

Dies bedeutet, dass der Standardwert -1 ist, wenn einer der Parameter wie Abstand, Betrag, Zahlen und Gewinn nicht festgelegt ist, was bedeutet, dass die Strategie gestoppt wird (Sie können nicht herumlaufen, ohne Parameter festzulegen ~ haha!)

Go on !

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

Dies bedeutet, dass, wenn sich die Strategie in der Echtzeit-K-Line-Phase befindet und beginPrice == 0 ist, der Wert von beginPrice auf den aktuell neuesten Preis geändert werden muss. Es ist davon auszugehen, dass bei offizieller Ausführung der Strategie der anfängliche aktuelle Preis dem anfänglichen Preis des Netzes entspricht. Da das Skript eine historische K-Line-BAR-Phase hat, führt die Strategie die Logik in der historischen BAR-Phase aus. Es ist definitiv sinnlos, das Raster auf der historischen BAR anzuordnen.

Was ist die historische BAR-Phase?

Um ein einfaches Beispiel zu nennen: Zum aktuellen Zeitpunkt A wird die Strategie gestartet und die Strategie erhält Daten mit 100 K-Line-BARs. Mit der Zeit werden aus den 100 BARs definitiv 101, 102 … N. Beim Ausführen ab Zeitpunkt A ist der 101. BAR die Echtzeit-K-Linienstufe, die die neuesten Echtzeitdaten enthält. Vom 1. BAR bis zum 100. BAR sind das alles vergangene historische Marktbedingungen, aber die Strategie wird auch auf der Grundlage dieser historischen Marktbedingungen ausgeführt, daher ist diese Phase die historische K-Linien-Phase.

barstate.ishistoryDies ist eine eingebaute Variable der Sprache Pine. Wenn der aktuelle BAR ein historischer BAR ist,barstate.ishistoryWenn es kein historischer BAR ist, ist es falsch. Wenn barstate.ishistory nicht wahr ist, befindet es sich daher in der Echtzeit-K-Line-Phase.

Als nächstes 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 dieser Funktion besteht darin, herauszufinden, ob eine bestimmte ID in allen aktuell geöffneten Aufträgen vorhanden ist. Wenn dies der Fall ist, gibt die Funktion findTradeId beim Aufruf die ID des bestehenden Auftrags zurück (beachten Sie, dass diese ID nicht die Auftrags-ID von die Börse, sondern die der Bestellung von der Strategie zugewiesene ID). , oder als Label interpretiert), wenn es nicht existiert, wird die Zeichenfolge „notFound“ zurückgegeben.

Als nächstes beginnen wir mit dem Mesh Sheet:

// 实时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)

Eine For-Schleife dient dazu, anhand des Wertes des Numbers-Parameters die Anzahl der Schleifen zu ermitteln, also die entsprechende Anzahl an Aufträgen anzuordnen. Legen Sie die Richtung entsprechend dem Dir-Parameter fest. Mit der Funktion findTradeId können Sie herausfinden, ob die Bestellung des Labels an der aktuellen Rasterposition eröffnet wurde. Platzieren Sie eine geplante Bestellung nur, wenn sie noch nicht eröffnet wurde (wenn sie eröffnet wurde, können Sie keine doppelte Bestellung platzieren). Verwenden Sie beim Aufgeben einer Bestellung die Funktion „strategy.order“, um den Limitparameter anzugeben und eine Planbestellung aufzugeben. Platzieren Sie gleichzeitig mit der Planorder auch die entsprechende Closingorder. Um eine Position zu schließen, verwenden Sie die Funktion „strategy.exit“, geben Sie den Gewinnparameter an und legen Sie die Gewinnpunkte fest.

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Wenn Sie immer noch keine Strategien mit der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …

Schon beim Blick auf die Renditekurve wird deutlich, dass das Netz auch Risiken birgt und kein garantierter Gewinn ist. Nur ist das Risiko relativ geringer, wenn das Netz im großen Maßstab ausgebaut wird.

Wenn Sie immer noch keine Strategien in der leicht zu erlernenden und benutzerfreundlichen Sprache Pine schreiben können, dann …