Inventor Quantitative PINE Language Einführungs-Tutorial

Erstellt in: 2022-05-30 16:23:43, aktualisiert am: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Inventor Quantitative PINE Language Einführungs-Tutorial

Video-Tutorials: Wie schwer ist es, mit dem Trading-View in die Quantifizierungs-Sprache zu kommen?

Die Inventor-Quantitative-Trading-Plattform unterstützt die Programmierung in der Sprache Pine, unterstützt die Rückmeldung, die Real-Time-Betriebsstrategie der Sprache Pine und ist kompatibel mit niedrigeren Versionen der Sprache Pine.StrategieplatzEs gibt eine Vielzahl von Pine-Strategien, die gesammelt und übertragen wurden.

FMZ unterstützt nicht nur die Pine-Sprache, sondern auch die leistungsstarke Diagrammfunktion der Pine-Sprache. Die Funktionen der FMZ-Plattform, die vielfältigen praktischen Tools, die effiziente und einfache Verwaltung, verbessern auch die Funktionalität der Pine-Strategie.

Einige der deutlichsten Unterschiede sind:

  • 1. Die Pine-Strategie auf der FMZ, Versionskennzeichen am Anfang des Codes//@versionBeginnt mit dem CodestrategyindicatorDie Sätze sind nicht obligatorisch und werden von FMZ vorerst nicht unterstützt.importImportierenlibraryFunktion.

Einige der Strategien, die wir sehen können, lauten:

  //@version=5
  indicator("My Script", overlay = true)
  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue)
  plot(b, color = color.black)
  plotshape(c, color = color.red)

Oder wie es heißt:

  //@version=5
  strategy("My Strategy", overlay=true)

  longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
  if (longCondition)
      strategy.entry("My Long Entry Id", strategy.long)

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)

Auf der FMZ kann es sich so vereinfachen:

  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue, overlay=true)
  plot(b, color = color.black, overlay=true)
  plotshape(c, color = color.red, overlay=true)

Oder:

  longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
  if (longCondition)
      strategy.entry("My Long Entry Id", strategy.long)

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)
    1. Strategie ((Skript) Einige der Transaktions-bezogenen Einstellungen werden durch die Parameter “Pine-Sprache-Trading-Klassenlager” in der FMZ-Strategie-Schnittstelle eingestellt.
    • Schlusskursmodelle und Echtzeit-Preismodelle In der Trading View können wir durchstrategyFunktioncalc_on_every_tickDie Parameter setzen die Strategie-Skripte, die die Strategie-Logik in Echtzeit bei jeder Preisänderung ausführen, wobeicalc_on_every_tickDie Parameter sollten so eingestellt werden:true◦ Standardcalc_on_every_tickDer Parameter istfalseDas bedeutet, dass die Strategie-Logik nur ausgeführt wird, wenn die aktuelle K-Linie BAR abgelaufen ist. Auf der FMZ wird die Einstellung über die Parameter der Template “Pine Language Exchange Classroom” vorgenommen.

    Inventor Quantitative PINE Language Einführungs-Tutorial

    • Die Präzision von Zahlen wie Preis und Bestellmenge bei der Ausführung der Strategie muss auf der FMZ festgelegt werden. In der Trading-View gibt es keine Probleme mit der Ordnungs-Genauigkeit, da nur Simulationen möglich sind. In der FMZ ist es möglich, die Pine-Strategie in der Realität auszuführen. Dann ist eine Strategie erforderlich, die die Preisgenauigkeit der Handelsarten und die Ordnungsgrößen flexibel festlegt. Diese Genauigkeits-Einstellungen steuern die kleinen Zahlen der relevanten Daten, um zu vermeiden, dass die Daten nicht den Anforderungen der Börsenanzeige entsprechen, wodurch keine Bestellung möglich ist.

    • Code für den Terminkontrakt Wenn es sich um einen Vertrag handelt, hat die Handelsvariante auf der FMZ zwei Eigenschaften: “Handelspaar” und “Vertragscode”. Zusätzlich zur klaren Einstellung des Handelspaares auf dem Display und bei der Rückmeldung muss auch der spezifische Vertragscode in den Parametern “Variety Code” der Pine-Sprach-Handelsbibliothek-Vorlage eingestellt werden.swap, Vertragskodex, je nachdem, ob die Börse, die betrieben wird, einen solchen Vertrag hat. Zum Beispiel können alle Quartalsverträge für einige Geschäfte hier ausgefüllt werdenquarter❚ Die Codes für diese Verträge stimmen mit den Codes für Futures-Verträge überein, die in der Dokumentation der Javascript/python/c++ Language API von FMZ definiert sind.

Weitere Einstellungen, wie z. B. Minimum Order Quantity, Default Order Quantity, etc. finden Sie in der Dokumentation für die Sprache Pine.“Pine-Sprachen-Klassenbörse”Einführung in die Parameter

  • 3、runtime.debugruntime.logruntime.errorFunktion der FMZ-Erweiterung zum Debuggen

Auf der FMZ-Plattform wurden drei Funktionen für die Debugging hinzugefügt.

  • runtime.debug: Im Allgemeinen kann diese Funktion nicht verwendet werden, um Variablen auf der Steuerung zu drucken.

  • runtime.logInhalte in der Log-Ausgabe. FMZ PINE-Sprache spezielle Funktionen.

    runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
    
  • runtime.error: wird aufgerufen, was zu einem Betriebsfehler führt und die Fehlermeldung mit sich bringt, die in den Message-Parametern angegeben ist.

    runtime.error(message)
    
    1. Teile der Graphik-Funktion erweitertoverlayParameter

Pine-Sprache auf der FMZ, GrafikfunktionplotplotshapeplotcharEs gibt noch mehr.overlayParameter-Unterstützung, die es erlaubt, Bilder in der Haupt- oder Untergrafik zu bestimmen.overlayaufstellentrueDas Bild ist in der Hauptkarte, auffalseDie Funktion “Draw in sub-graphs” ermöglicht es, die Hauptgraphie und die Subgraphie gleichzeitig zu zeichnen, wenn die Pine-Strategie auf der FMZ funktioniert.

  • 5、syminfo.mintickVariablen für die eingebauten Variablen

syminfo.mintickDie eingebaute Variable ist definiert als die Mindestmessung der aktuellen Sorte. In der FMZFestes Angebot/BacktestingDie Präzision der Preise wird durch die Schablonenparameter in der “Pine Language Trading Classroom” in der Oberfläche gesteuert. Die Präzision der Preise wird mit 2 eingestellt, d. h. der Preis ist auf die zweite Stelle der kleinen Zahl exakt, wenn der Preis mit 0,01 der kleinste Änderung der Einheit handelt.syminfo.mintickDer Wert von {\displaystyle } ist 0.01 {\displaystyle 0.01}

  • 6. Die Durchschnittspreise in FMZ PINE Script sind alle inklusive Gebühren.

Zum Beispiel: Der Auftragswert ist 8000, die Verkaufsrichtung, die Anzahl von 1 Hand ((einfach), der Durchschnittspreis nach dem Abschluss ist nicht 8000, weniger als 8000 ((die Kosten beinhalten die Verfahrensgebühren)).

Grundlagen der Pine-Sprache

Wenn wir anfangen, die Grundlagen der Pine-Sprache zu lernen, sind die Anweisungen in einigen Beispielen und die Code-Grammatik möglicherweise nicht vertraut. Es spielt keine Rolle, dass wir nicht verstehen. Wir können uns zuerst mit den Konzepten vertraut machen, den Testzweck verstehen, oder wir können die Pine-Sprachdokumentation von FMZ einsehen.

Modelldurchführung

Bei der Einführung in die Pine-Sprache ist es sehr notwendig, die entsprechenden Konzepte wie die Ausführung von Pine-Skriptprogrammen zu verstehen. Die Pine-Sprachstrategie kann als eine Reihe von Berechnungen und Vorgängen verstanden werden, die auf einer Grafik in chronologischer Reihenfolge durchgeführt werden, beginnend mit den frühesten Daten, die bereits in der Grafik geladen sind.bar_indexVerweist auf den Indexwert der K-Zeile Bar, die bei Ausführung des Pine-Skriptes aktuell ist.

plot(bar_index, "bar_index")

Inventor Quantitative PINE Language Einführungs-Tutorial

plotDie Funktion ist eine der Funktionen, die wir in Zukunft am häufigsten verwenden werden.bar_indexDie Linie heißtbar_index。 Die Linie bar_index auf der ersten Bar hat einen Wert von 0 und steigt mit dem Bar-Zuwachs nach rechts um 1。

Das Modell der Strategie wird in unterschiedlicher Weise ausgeführt, je nachdem, wie die Strategie eingerichtet ist.收盘价模型Und实时价模型Die Konzepte von Schlusskursmodellen und Echtzeitkursmodellen haben wir bereits kurz vorgestellt.

  • Schlusskursmodell

Wenn der Strategiecode ausgeführt wird, ist der Zyklus der aktuellen K-Linie-Bar vollständig ausgeführt, und wenn die K-Linie geschlossen wird, ist der K-Linie-Zyklus abgeschlossen. An diesem Punkt wird die Pine-Strategie-Logik ausgeführt, und das ausgelöste Transaktionssignal wird beim Beginn der nächsten K-Linie-Bar ausgeführt.

  • Echtzeit-Preismodell

Wenn der Strategiecode ausgeführt wird, wird die aktuelle K-Linie Bar, unabhängig davon, ob sie geschlossen ist oder nicht, bei jeder Bewegung die Pine-Strategie-Logik ausgeführt, und das ausgelöste Handelssignal wird sofort ausgeführt.

Wenn die Pine-Sprache-Strategie von links nach rechts auf der Grafik ausgeführt wird, wird die K-Linie-Bar auf der Grafik unterteilt in历史BarUnd实时BarDas war’s.

  • Geschichte der Bar

Wenn die Strategie als “Real-Time-Price-Modell” eingestellt wird, werden alle K-Linienbars in der Grafik, mit Ausnahme der K-Linienbar auf der rechten Seite, ausgeführt历史BarStrategische Logik in jeder Wurzel历史BarNur einmal ausgeführt. Wenn die Strategie als “Endpreismodell” eingestellt ist und die Ausführung beginnt, sind alle Bars auf dem Diagramm历史BarStrategische Logik in jeder Wurzel历史BarNur einmal ausgeführt.

Berechnung basierend auf der History Bar: Der Strategiecode wird einmal in der History Bar ausgeführt, und der Strategiecode wird dann in der nächsten History Bar ausgeführt, bis alle History Bars einmal ausgeführt sind.

  • Echtzeit-Bar

Wenn die Strategie auf die letzte K-Zeile Bar rechts durchgeführt wird, ist diese Bar die Echtzeit-Bar. Wenn die Echtzeit-Bar geschlossen wird, wird diese Bar zu einer vergangenen Echtzeit-Bar (in die Historik-Bar umgewandelt). Die rechte Seite des Diagramms erzeugt eine neue Echtzeit-Bar.

Wenn die Strategie als “Echtzeit-Preismodell” eingestellt ist, wird für jede Änderung der Situation in der Echtzeit-Bar eine Strategie-Logik ausgeführt. Wenn die Strategie als “Endpreismodell” eingestellt ist, wird die Bar in Echtzeit nicht angezeigt, wenn die Ausführung beginnt.

Auf Basis der Berechnung von Bar in Echtzeit: Wenn die Strategie als “Schlusskursmodell” eingestellt ist und die Bar nicht in Echtzeit angezeigt wird, wird der Strategiecode nur einmal beim Schlusskurs der aktuellen Bar ausgeführt. Wenn die Strategie als “real-time-Price-Modell” eingestellt ist, ist die Berechnung auf der Real-Time-Bar und die Berechnung auf der History-Bar völlig unterschiedlich. Jede Änderung auf der Real-Time-Bar führt einen Strategie-Code aus.highlowcloseIn der historischen Bar sind die Werte fest, in der Echtzeit Bar können sie sich ändern, wenn sich die Situation ändert. Daher können auch die Daten wie die Indikatoren, die auf diesen Werten basieren, in Echtzeit geändert werden.closeEs ist ein sehr interessantes Thema, aber es ist auch ein sehr wichtiges Thema.highUndlowStets die höchsten und niedrigsten Werte seit dem Beginn der aktuellen Live-Bar. Diese eingebauten Variablen stellen die Endwerte der letzten Aktualisierung der Live-Bar dar.

Der Rücklaufmechanismus bei der Ausführung der Strategie auf der Live-Bar (Real-Time-Preismodell): Bei der Realtime-Bar-Ausführung wird bei jeder neuen Ausführung der Strategie eine Variable, die vom Benutzer definiert wurde, vor dem Zurücksetzen ausgeführt. Um den Zurücksetzungsmechanismus mit einem Beispiel zu verstehen, testen wir den Code.

Beachten:

  /*backtest 
  ...
  ..
  .
  */

Das Paket enthält die Rückmeldungskonfiguration, die in Codeform auf der FMZ-Plattform gespeichert ist.

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := n + 1
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Inventor Quantitative PINE Language Einführungs-Tutorial

Inventor Quantitative PINE Language Einführungs-Tutorial

Wir untersuchten nur Szenen, die in der Echtzeit-Bar ausgeführt wurden, also benutzten wirnot barstate.ishistoryAusdrucksbeschränkungen werden nur für die Variablen n in Echtzeit in Bar erstellt und vor und nach der Ausführung der Aggregation verwendetruntime.logFunktions-Ausgabe-Informationen in der Strategie-Log.plotDie gezeichnete Kurve n zeigt, dass die Strategie in der historischen Bar immer 0 war. Die Aktion n + 1 wurde ausgelöst, als die Strategie in der realen Bar ausgeführt wurde, und die Aktion n + 1 wurde bei jeder Ausführung der Strategie in der realen Bar ausgeführt. Aus den Login-Informationen lässt sich erkennen, dass bei jeder erneuten Ausführung des Strategiecodes in der realen Bar der Wert n auf den Wert der letzten Ausführung der Strategie in der letzten Ausführung der Strategie zurückgesetzt wird.

Zusammenfassend: 1. Wenn die Strategie in der Echtzeit-Bar ausgeführt wird, wird der Strategiecode bei jeder Aktualisierung ausgeführt. 2. Bei der Ausführung in der Real-Time-Bar werden die Variablen vor jeder Ausführung des Strategiecodes zurückgerollt. 3. Wenn die Variablen in der Echtzeit-Bar ausgeführt werden, werden sie bei der Erneuerung des Abschlusses eingereicht.

Da die Daten rückläufig sind, können auch Grafikoperationen wie Kurven auf dem Diagramm zu einer Neugestaltung führen, z. B. wenn wir den Testcode, den wir gerade getestet haben, ändern:

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := open > close ? n + 1 : n
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Screenshot von Moment A Inventor Quantitative PINE Language Einführungs-Tutorial

Screenshot von Moment B Inventor Quantitative PINE Language Einführungs-Tutorial

Wir haben nur den Satz geändert:n := open > close ? n + 1 : nIn der ersten Zeichnung (Moment A) wurde n 1 hinzugefügt, da der Eröffnungspreis höher war als der Schließungspreis (Moment B). Die Grafikkurve n zeigte den Wert 5 . Als sich dann die Situation änderte, wurde der Preis aktualisiert, wie in der zweiten Zeichnung (Moment B) gezeigt. Die Grafikkurve n wurde sofort neu gezeichnet, und die Kurve n wurde sofort neu gezeichnet, als die Kurve n 4 war.

  • Variablen in einer Funktion

Im Folgenden untersuchen wir die Variablen in den Funktionen der Sprache Pine. Gemäß der Beschreibung in einigen Pine-Tutorials unterscheiden sich die Variablen in der Funktion von den Variablen außerhalb der Funktion wie folgt:

Die Historie der in der Pine-Funktion verwendeten Serienvariablen wird bei jedem aufeinanderfolgenden Aufruf der Funktion erstellt. Wenn keine Funktion in jeder Spalte des Skriptes aufgerufen wird, führt dies zu einer Differenz zwischen den Historien innerhalb und außerhalb der lokalen Block der Funktion. Wenn die Funktion also nicht in jeder Spalte aufgerufen wird, werden die Serien mit den gleichen Indexwerten, die innerhalb und außerhalb der Funktion referenziert werden, nicht auf die gleichen Historienpunkte verweisen.

Ist das etwas, was schwer zu verstehen ist? Es ist in Ordnung, wir haben es durch einen Testcode, der auf FMZ läuft, herausgefunden:

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  f(a) => a[1]
  f2() => close[1]  

  oneBarInTwo = bar_index % 2 == 0
  plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
  plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
  plot(close[2], title = "close[2]", color = color.red, overlay = true)
  plot(close[1], title = "close[1]", color = color.green, overlay = true)

Bildschirmherstellung der Rückmeldung

Inventor Quantitative PINE Language Einführungs-Tutorial

Der Testcode ist relativ einfach und basiert hauptsächlich auf Daten, die in zwei Arten zitiert werden:f(a) => a[1]Undf2() => close[1]

  • f(a) => a[1]Die Funktion wird als letztes zurückgegeben.a[1]

  • f2() => close[1]Verwenden Sie die Variablen direkt:closeDie Funktion wird als letztes zurückgegeben.close[1]

[]Das Symbol für die Referenzierung auf die historischen Werte der Variablen der Datenreihe, close[1] bezieht sich auf die Schlusskosten der aktuellen Schlusskosten auf der vorangegangenen Bar.

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A") Zeichnen Sie ein Zeichen von A bis Z, rot, wenn oneBarInTwo wahr ist, und die Position (auf der Y-Achse) istf(close)Die zurückgegebenen Werte:

  • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B") Zeichne ein Zeichen in B, die Farbe ist grün, wenn oneBarInTwo wahr ist, und zeichne die Position (auf der Y-Achse) als:f2()Die zurückgegebenen Werte:

  • plot(close[2], title = "close[2]", color = color.red, overlay = true) Die Zeichnung ist rot und zeigt die Position (auf der Y-Achse) wie folgt:close[2]Das ist der Schlusskurs auf der aktuellen Bar (Zweite Linke).

  • plot(close[1], title = "close[1]", color = color.green, overlay = true) Die Farbe ist grün und die Position (auf der Y-Achse) ist:close[1]Das ist der Schlusskurs auf der aktuellen Bar (die erste Linksradie).

Durch die Strategie Rückverfolgung Run Screenshot zu sehen, obwohl die Funktion verwendet wird, um die Markierung von Diagramm Af(a) => a[1]Funktionen, die mit dem Zeichen B markiert werdenf2() => close[1]Es ist alles.[1] um die historischen Daten in der Datenreihe zu zitieren, aber die Markierung von “A” und “B” auf der Grafik ist völlig unterschiedlich. Die Markierung von “A” fällt immer auf die rote Linie, also auf den Code in der Strategieplot(close[2], title = "close[2]", color = color.red, overlay = true)Die Daten, die in der Zeile verwendet werden, sind:close[2]

Inventor Quantitative PINE Language Einführungs-Tutorial

Der Grund dafür ist, dass die Indexierung durch die K-Linie Bar, die in-Variablenbar_indexBerechnen, ob die Markierungen “A” und “B” gezeichnet werden. Die Markierungen “A” und “B” werden nicht auf jeder K-Linien-Bar gezeichnet.f(a) => a[1]Wenn die Funktion nicht auf jeder Bar aufgerufen wird, werden die Werte, die auf diese Weise zitiert werden, mit der Funktion verknüpft.f2() => close[1]Diese Methode verwendet unterschiedliche Referenzwerte, auch wenn[1] mit der gleichen Indexierung).

  • Einige eingebaute Funktionen müssen auf jeder Bar berechnet werden, um ihre Ergebnisse richtig berechnen zu können.

Ein einfaches Beispiel:

  res = close > close[1] ? ta.barssince(close < close[1]) : -1
  plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

Wir rufen die Funktion in Code auf.ta.barssince(close < close[1])Schreiben Sie es in einem dreifachen Operator.condition ? value1 : value2Das hat zur Folge, dass nur inclose > close[1]Wenn Sie die ta.barssince-Funktion aufrufen.ta.barssinceDie Funktion wird berechnet von der letztenclose < close[1]Die Anzahl der K-Zeilen, die bei der Erstellung vorhanden waren.[1], d.h. der aktuelle Schlusskurs ist größer als der Schlusskurs der vorherigen Bar, wenn die Funktion ta.barssince aufgerufen wird, deren Bedingung close < close ist[1] wurde nicht gegründet, und es gab auch keine letzte gegründete Stelle.

ta.barssince: Wenn die Funktion aufgerufen wird und diese Bedingung noch nie vor der aktuellen K-Zeile erfüllt wurde, wird na。 zurückgegeben.

Wie in der Abbildung gezeigt:

Inventor Quantitative PINE Language Einführungs-Tutorial

Also, wenn wir die Grafik malen, dann zeichnen wir nur die Daten, wenn die Res-Variable ((-1) }} hat.

Um dieses Problem zu vermeiden, benutzen wir nurta.barssince(close < close[1])Der Funktionsaufruf wird aus dem Trinitären Operator herausgenommen und an jede mögliche Bedingungsabteilung externe geschrieben. Damit wird die Berechnung auf jeder K-Zeile Bar durchgeführt.

  a = ta.barssince(close < close[1])
  res = close > close[1] ? a : -1
  plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

Inventor Quantitative PINE Language Einführungs-Tutorial

Zeitfolge

Das Konzept der Zeitreihen ist sehr wichtig in der Sprache Pine und ist ein Konzept, das wir verstehen müssen, wenn wir die Sprache Pine lernen. Die Zeitreihen sind keine Art, sondern die grundlegende Struktur für die Speicherung von Variablen mit der Zeit. Wir wissen, dass die Schrift von Pine auf Diagrammen basiert, und das grundlegendste, was in den Diagrammen angezeigt wird, ist die K-Linien-Diagramme.openist eine eingebaute Variable der Sprache Pine, die als Zeitreihen für die Speicherung der Eröffnungspreise für jeden K-Line-Bar aufgebaut ist.openDiese Zeitreihenstruktur repräsentiert den Eröffnungswert aller K-Linienbars, wenn die aktuelle K-Linienkarte von der ersten Bar am Anfang bis zur Bar, die das aktuelle Skript ausführt. Wenn die aktuelle K-Linienkarte eine 5-Minuten-Periode ist, dann zitieren wir in der Pine-Strategie den Code ((oder verwenden)openDer Startpreis der K-Line-Bar bei der aktuellen Ausführung des Strategiecodes.[]Operator wird verwendet, wenn die Pine-Strategie auf einer K-String-Bar ausgeführt wirdopen[1]Angabe von ReferenzenopenDer Anfangspreis des vorherigen K-Linienbars dieser K-Linienbar, der von der aktuellen Schrift ausgeführt wird (d.h. der Anfangspreis des vorherigen K-Linienzyklus).

  • Variablen auf Zeitreihen sind sehr einfach zu berechnen Wir benutzen die eingebaute Funktion.ta.cumEin Beispiel:
  ta.cum

  Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
  ta.cum(source) → series float
  RETURNS
  Total sum series.
  ARGUMENTS
  source (series int/float)
  SEE ALSO
  math.sum

Testcode:

  v1 = 1
  v2 = ta.cum(v1)
  plot(v1, title="v1")
  plot(v2, title="v2")
  plot(bar_index+1, title="bar_index")

Es gibt viele ähnlicheta.cumEine solche integrierte Funktion kann Daten in einer Zeitreihenfolge direkt bearbeiten, z. B.ta.cumDas Ergebnis ist, dass wir die eingegebenen Variablen auf jeder K-Linie auf die entsprechenden Werte addieren, und wir verwenden eine Grafik, um es zu verstehen.

Die Strategie läuft mit der Variablen bar_index und v1 und v2. | - | - | - | - | Die Strategie funktioniert auf der ersten K-Linie Bar ≠ 0 ≠ 1 ≠ 1. Die Strategie funktioniert auf der zweiten K-Linie Bar Die Strategie funktioniert auf der dritten K-Linie Bar ≠ 2 ≠ 1 ≠ 3 ≠ |…|…|…|…| Die Strategie läuft auf der ersten N+1 K-Linie

Wie man sehen kann, sind v1, v2 und sogar bar_index tatsächlich Zeitreihenstrukturen, die auf jeder Bar mit entsprechenden Daten versehen sind. Dieser Testcode unterscheidet sich unabhängig davon, ob ein “Echtzeit-Preismodell” oder ein “Abschlusskursmodell” verwendet wird. Der Unterschied besteht nur darin, ob die reale Bar auf der Grafik angezeigt wird.

Inventor Quantitative PINE Language Einführungs-Tutorial

Da die Variable v1 auf jeder Bar 1 ist,ta.cum(v1)Da die Funktion auf der ersten K-Zeile Bar ausgeführt wird und nur die erste Bar vorhanden ist, erhält die Funktion 1 und wird der Variablen v2 gegeben. Wennta.cum(v1)Bei der Ausführung auf der zweiten K-Linie Bar gibt es bereits 2 K-Linien Bar ((das erste entspricht der eingebauten Variablen bar_index ist 0, das zweite entspricht der eingebauten Variablen bar_index ist 1), so dass das Ergebnis 2 berechnet wird, der Wert wird der Variablen v2 zugeteilt, und so weiter. Es kann tatsächlich beobachtet werden, dass v2 die Anzahl der K-Linien Bar in der Grafik ist, da die K-Linienbar_indexEs ist also 0 und es wird immer größer.bar_index + 1Das ist eigentlich die Anzahl der K-Linien.v2Undbar_indexDas ist eine echte Überschneidung.

Inventor Quantitative PINE Language Einführungs-Tutorial

Ich kann das auch.ta.cumDie eingebaute Funktion berechnet die Summe der Schlusskosten aller Bars auf dem aktuellen Diagramm und kann so geschrieben werden:ta.cum(close), wenn die Strategie auf die rechte Echtzeit-Bar läuftta.cum(close)Das Ergebnis ist die Summe der Schlusskosten für alle Bars in der Tabelle (ohne die rechte Seite zu berechnen, wird nur der aktuelle Bar addiert).

Variablen auf Zeitreihen können auch mit Operatoren berechnet werden, z. B. mit dem Code:ta.sma(high - low, 14)Die Variablen sind inhigh(Höchstpreis der K-Linie Bar) abzüglichlow(K-Line-Bar-Mindestpreise), Endverbrauchta.smaDie Funktion verlangt den Mittelwert.

  • Die Funktionsaufrufe hinterlassen auch ihre Spuren in der Zeitreihenfolge.
  v1 = ta.highest(high, 10)[1]
  v2 = ta.highest(high[1], 10)
  plot(v1, title="v1", overlay=true)
  plot(v2, title="v2", overlay=true)

Der Testcode wird beim Testlauf zurückgemessen und kann beobachtet werdenv1Undv2Die Werte der Funktion sind identisch, und die auf der Grafik gezeichneten Linien überschneiden sich vollständig. Die Ergebnisse der Funktionsaufrufe hinterlassen eine Spur von Werten in der Zeitreihenfolge, z. B. Codeta.highest(high, 10)[1]Einer davonta.highest(high, 10)Die Ergebnisse der Funktionsaufrufe können auch verwendet werden.[1] um den historischen Wert zu zitieren.ta.highest(high, 10)Das Ergebnis istta.highest(high[1], 10)Das ist es.ta.highest(high[1], 10)Undta.highest(high, 10)[1]Genau das gleiche.

Die Ausgabe wird mit einer anderen Diagrammfunktion verifiziert:

  a = ta.highest(close, 10)[1]
  b = ta.highest(close[1], 10)
  plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
  plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)

Die Werte der Variablen a und b in der Zeitreihenfolge werden über und unter den entsprechenden Bars angezeigt. Der Zeichnungscode kann während des Lernens beibehalten werden, da bei Tests und Experimenten häufig Informationen zur Beobachtung auf der Grafik ausgegeben werden müssen.

Inventor Quantitative PINE Language Einführungs-Tutorial

Schriftstruktur

Allgemeine Struktur

Im Anfang des Tutorials haben wir einige Unterschiede zwischen der Verwendung von Pine auf der FMZ und der Verwendung von Pine in Trading View zusammengefasst.indicator()strategy()Und, vorläufig nicht unterstützt.library()Um mit früheren Versionen von Pine kompatibel zu sein, wurde natürlich die Strategie geschrieben://@version=5indicator()strategy()Es ist auch möglich. Einige Einstellungen können instrategy()In der Funktion werden die Übertragungsparameter festgelegt.

<version>
<declaration_statement>
<code>

<version>Versionskontrollinformationen können weggelassen werden.

Anmerkungen

Pine-Sprache//Als Einzelzeilenkommentare wurde die Kommentare von FMZ erweitert, da es in der Sprache Pine keine Mehrzeilenkommentare gibt/**/Für mehrsprachige Anmerkungen.

Der Code

Eine Zeile in einem Skript, die keine Kommentare oder Kompilierer-Anweisungen enthält, ist ein Statement, das die Algorithmen des Skripts umsetzt. Ein Statement kann eines dieser Inhalte sein.

  • Variablenerklärung
  • Variablen neu zuordnen
  • Funktionserklärung
  • Eingebettete Funktionsaufrufe, benutzerdefinierte Funktionsaufrufe
  • ifforwhileoderswitchGleichgewichtsstruktur

Sätze können auf verschiedene Arten angeordnet werden.

  • Einige Sätze können in einer Zeile ausgedrückt werden, wie z. B. die meisten Variablenerklärungen, die nur eine Zeile mit einem Funktionsaufruf oder eine Einzelarbeitserklärung enthalten. Andere, wie Strukturen, benötigen immer mehrere Zeilen, da sie einen lokalen Block benötigen.
  • Die globalen Aussagen des Skripts (d. h. die Teile, die nicht zu den lokalen Blöcken gehören) können nicht als空格oder制表符(Tab-Taste) beginnen. Ihr erster Buchstabe muss auch der erste Buchstabe der Zeile sein. Zeilen, die mit der ersten Position in der Zeile beginnen, sind per Definition Teil des globalen Umfangs des Skripts.
  • Eine Struktur- oder Mehrzeilenfunktionsanweisung erfordert immer einelocal block。 Ein lokaler Block muss in ein Kennzeichen oder vier Leerzeichen geschrumpft werden (andernfalls wird er als die fortlaufende Inhalte der vorherigen Codezeile analysiert), wobei jeder lokale Block einen anderen lokalen Bereich definiert。
  • Mehrere einzelne Sätze können in einer Zeile durch die Verwendung des Kommas ((,) als Trennzeichen in einer Reihe zusammengefügt werden.
  • Eine Zeile kann Kommentare enthalten oder nur Kommentare sein.
  • Die Zeilen können auch eingewickelt werden (weiter auf mehreren Zeilen).

Zum Beispiel umfasst es drei lokale Blöcke, eine in einer benutzerdefinierten Funktionsanweisung und zwei, die die if-Struktur in einer Variablenanweisung verwenden, wie folgt:

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

Code-Wechsel

Längere Zeilen können in mehrere Zeilen aufgeteilt oder “eingepflanzt” werden. Die eingepflanzte Zeile muss in eine beliebige Anzahl von Leerstellen geschrumpft werden, sofern sie nicht ein Vielfaches von 4 ist (diese Grenzen dienen dazu, in lokale Blöcke zu schrumpfen).

a = open + high + low + close

Es kann in folgenden Formularen verpackt werden (beachten Sie, dass die Anzahl der Zeilen, die pro Zeile eingekrümmt werden, kein Vielfaches von 4 ist):

a = open +
      high +
          low +
             close

Ein langer Plot ((() -Aufruf kann in eine Packe packt werden.

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

Sätze in einer benutzerdefinierten Funktionsanweisung können auch verpackt werden. Da jedoch die lokalen Blöcke grammatisch mit einem Verkürzungszeichen beginnen müssen (z. B. 4 Felder oder 1 Schreibzeichen), müssen die Fortsetzungssätze der Sätze, wenn sie in die nächste Zeile aufgeteilt werden, mit einem oder mehr Verkürzungen beginnen (z. B. nicht gleich dem Vielfachen von 4 Feldern).

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)
           
                   
a = test(close, open)
plot(a, title="a")

Identifikator und Operator

Kennzeichen

Bevor wir uns mit Variablen befassen, müssen wir zunächst die Konzepte von Antennen-Identifikatoren verstehen.FunktionUndVariableDie Namen der Variablen und Funktionen.FunktionWie wir im nächsten Tutorial erfahren werden, lernen wir zuerst den Zitronen-Kennzeichen 。

  • 1. Die Kennzeichen müssen in Großbuchstaben stehen(A-Z)oder klein(a-z)Buchstaben oder Unterstriche(_)Der Beginn, als erster Zeichen der Kennung ▽.
  • 2. Das nächste Zeichen nach dem ersten Zeichen des Identifikators kannDie BuchstabenUnterstreichungoderZahlen
  • 3. Die Namen der Kennzeichen sind in Groß- und Kleinbuchstaben geschrieben.

Ein Beispiel dafür sind folgende Namen:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

Wie in den meisten Programmiersprachen gibt es auch in der Sprache Pine Schreibempfehlungen.

  • 1. Alle Buchstaben werden in Großbuchstaben geschrieben, um Konstanten zu benennen.
  • 2. VerwendungDie Kamelspitze-RegelBenannt nach anderen Kennungen.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

Operator

Operatoren sind in Programmiersprachen einige Operator-Zeichen, die zum Erstellen von Ausdrücken verwendet werden, während Ausdrücke Berechnungsregeln sind, die für einen bestimmten Berechnungszweck entwickelt wurden, wenn wir eine Strategie schreiben. Die Operatoren in der Sprache Pine werden nach Funktion als:

Es gibt auch andere Operatoren, wie z.B. den Verwertungsoperator, den Algorithmusoperator, den Vergleichsoperator, den Logikoperator, den Logikoperator, den Algorithmusoperator, den Algorithmusoperator, den Algorithmusoperator.? :Das ist ein Triple-Operator.[]Der Operator für historische Verweise.

Mit der Arithmetikoperator*Zum Beispiel gibt es die folgenden Testcodes, um die Art von Problemen zu unterscheiden, die durch die Ergebnisse des Pine-Sprachoperators in Trading View verursacht werden:

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

Wenn Sie das Skript in der Trading View ausführen, wird ein Kompilierungsfehler auftreten, weil:adjustedLength = lenInput * factorDas Ergebnis nach der Multiplikationseries intTyp (Serie), jedochta.emaDer zweite Parameter der Funktion unterstützt diesen Typ nicht. Auf FMZ gibt es jedoch keine solchen strengen Einschränkungen.

Im Folgenden sehen wir uns die verschiedenen Operatoren an.


Zuweisungsoperator

Es gibt zwei Arten von Verwertungsoperatoren:=:=Wir haben einige Beispiele im Anfang des Tutorials gesehen.

=Der Operator wird verwendet, um eine Variable zu initialisieren oder zu deklarieren.=Variablen, die nach der Initiialisierung und der Angabe eines Wertes zugewiesen werden, beginnen mit diesem Wert auf jeder Bar danach. Diese sind gültige Variablenerklärungen:

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

Beachtena = closeDie Variablen a auf jeder Bar sind die aktuellen Schlusskosten für diese Bar. Die anderen VariablenbcdDas ist unveränderlich und kann in einem Rückmeldesystem auf der FMZ getestet werden.

:=Die Variablen, die zur Wiedergabe von Werten in vorhandene Variablen verwendet werden, können einfach so verstanden werden::=Die Operatoren werden verwendet, um die Werte von Variablen zu ändern, die bereits deklariert und initialisiert wurden. Wenn verwendet:=Die Zuteilung eines Operators an eine Variable, die nicht initialisiert oder deklariert wurde, führt zu Fehlern, z. B.:

a := 0

Das ist es.:=Zuweisungsoperatoren werden im Allgemeinen für die Neubewertung bereits vorhandener Variablen verwendet, z. B.:

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

Beurteilen, obclose > open(d.h. der aktuelle BAR ist die Sonnenlinie) und a ist der wahre Wert ((true) ) und führt den Code in der lokalen Block der if-Anweisung ausb := b + 1Verwenden Sie den Assignment-Operator:=Geben Sie b einen neuen Wert, addieren Sie 1 ◦ und zeichnen Sie dann mit der Plot-Funktion die Werte der Variablen b auf den BARs der Zeitreihen auf der Tabelle, verbinden Sie sie in eine Linie ◦.

Sind wir der Meinung, dass, wenn wir eine Sonnenstrahl BAR haben, b immer 1 addiert? Natürlich nicht, hier haben wir keine Schlüsselwörter verwendet, um die Variable b zu deklarieren und mit 0 zu initialisieren.b=0Wir können also sehen, dass das Ergebnis dieses Codes ist, dass die Variable b jedes Mal wieder auf 0 gesetzt wird, wenn die Variable a wahr ist.close > openIn dieser Ausführung wird b mit 1 addiert, in der Plot-Funktion wird b mit 1 dargestellt, aber in der nächsten Ausführungsrunde wird b mit 0 neu bewertet. Dies ist auch der Punkt, an dem Pine-Anfänger leicht in die Irre gehen können.

In Bezug auf die Zuteilung von Operatoren müssen wir zwei Schlüsselwörter erweitern:varvarip

  • var

Wir haben dieses Schlüsselwort bereits in den vorherigen Tutorials gesehen, aber es wurde nicht detailliert diskutiert.

var ist ein Schlüsselwort für die Verteilung und einmalige Initialisierung von Variablen. In der Regel führt die Variablen-Bewertungssymbolik ohne das Schlüsselwort var dazu, dass die Werte der Variablen bei jeder Datenaktualisierung überschrieben werden. Im Gegensatz dazu, wenn das Schlüsselwort var verwendet wird, können die Variablen verteilt werden, obwohl die Daten aktualisiert werden.

Wir benutzen dieses Beispiel, aber wir benutzen es, wenn wir b etwas geben.varSchlüsselwort:

  a = close > open 
  var b = 0 
  if a
      b := b + 1

  plot(b)

varDie Schlüsselwörter lassen die Variable b nur die ursprüngliche erste Zuweisung ausführen, sodass bei jeder weiteren Ausführung der Strategie-Logik b nicht mehr auf 0 zurückgesetzt wird, so dass man aus der Laufzeit gezogenen Linie b beobachten kann, d. h. die Anzahl der Y-Linien BAR, die bei der aktuellen K-LinienBAR aufgetreten sind, als Rückmessung des aktuellen K-LinienBAR.

Variablen in einer var-Erklärung können nicht nur global geschrieben werden, sondern auch in Code-Blöcken, wie in diesem Beispiel:

  strategy(overlay=true)
  var a = close
  var b = 0.0
  var c = 0.0
  var green_bars_count = 0
  if close > open
      var x = close
      b := x
      green_bars_count := green_bars_count + 1
      if green_bars_count >= 10
          var y = close
          c := y
  plot(a, title = "a")
  plot(b, title = "b")
  plot(c, title = "c")

Die Variable ‘a’ behält den Schlusskurs der ersten Säule in der Reihe. Die Variable ‘b’ hält den Schlusskurs der ersten in der Reihe, der grünen Zitronen-Preisschwange. Die Variable ‘c’ hält den Schlusskurs für die zehnte Kartoffel in der Reihe.

  • varip

varipWir haben dieses Schlüsselwort zum ersten Mal gesehen, und wir können die Beschreibung dieses Schlüsselworts sehen:

varip ((var intrabar persist) ist ein Schlüsselwort für die Verteilung und einmalige Initialisierung von Variablen. Es ist ähnlich wie das Schlüsselwort var, aber die Variablen mit der Varip-Erklärung behalten ihren Wert zwischen den K-Linien-Aktualisierungen in Echtzeit.

Ist es schwierig zu verstehen? Es ist okay, wir werden es mit Beispielen erklären, es ist leicht zu verstehen.

  strategy(overlay=true)

  // 测试 var varip
  var i = 0
  varip ii = 0  

  // 将策略逻辑每轮改变的i、ii打印在图上
  plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
  plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)  

  // 每轮逻辑执行都给i、ii递增1
  i := i + 1
  ii := ii + 1

Der Testcode wirkt unterschiedlich auf die Schlusskursmodelle und die Echtzeit-Kursmodelle:

Das sind die Faktoren, die uns helfen. Erinnern Sie sich an die Strategie, die wir zuvor beschrieben haben, die in historische BAR-Phasen und in Echtzeit-BAR-Phasen ausgeführt wird?varvaripVariablen in der ErklärungiiiBei jeder Ausführung des Strategie-Codes wird die Erhöhung durchgeführt. Die Zahlen, die in der Rückmessung auf der KBAR-Zeile angezeigt werden, werden also jeweils um 1 erhöht. Wenn die historische K-Zeile endet und die Echtzeit-K-Zeile beginnt, ändern sich die Variablen der Var-Varip-Aussagen.i := i + 1Undii := ii + 1Der Unterschied ist, dass ii jedes Mal geändert wird. Obwohl i jedes Mal geändert wird, wird der vorherige Wert bei der nächsten Ausführung der Strategie-Logik wiederhergestellt (Erinnern Sie sich an den Rücklaufmechanismus, den wir im vorherigen Kapitel “Modelldurchführung” erläutert haben?), bis die aktuelle KBAR-Linie abgeschlossen ist, um den Wert von i zu aktualisieren (d. h. die vorherige Wert wird bei der nächsten Ausführung der Strategie-Logik nicht mehr wiederhergestellt).

Die Schlusskursmodelle: Da das Schlusskursmodell eine Strategie-Logik ausführt, wenn jeder K-Line BAR abgelaufen ist. In dem Schlusskursmodell sind die Variablen der historischen K-Line-Phase und der Echtzeit-K-Line-Phase, die Variablen der Var-Varip-Erklärungen, in den obigen Beispielen exakt identisch und pro K-Line BAR 1 erhöht.


Arithmetik-Operator
Operator veranschaulichen
+ Zusatz
- Abzug
* Multiplikation
/ Verbot
% Ich suche nach Vorbildern.

+-Die Operatoren können als binäre Operatoren oder als unitarische Operatoren verwendet werden. Andere Operatoren können nur als binäre Operatoren verwendet werden, wenn sie als unitarische Operatoren verwendet werden.

  1. Die beiden Seiten des Operators sind Zahlenarten, was zu Zahlenarten, Ganzenarten oder Floating-Point-Zahlen führt.
  2. Wenn eine der Operationen ein String ist, ist der Operator+, wird als String berechnet, die Werte werden in Stringform umgewandelt und dann zusammengefügt. Wenn es sich um einen anderen Algorithmus-Operator handelt, wird versucht, die Strings in Werte umzuwandeln und dann zu berechnen.
  3. Wenn eine der Operationszahlen na ist, ist die Berechnung null und NaN wird beim Drucken auf dem FMZ angezeigt.
a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

Die Pine-Sprache auf FMZ unterscheidet sich hier ein wenig von der Pine-Sprache auf Trading View. Die Pine-Sprache auf FMZ ist nicht sehr anspruchsvoll und streng in Bezug auf die Variablen-Typen. Zum Beispiel:

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

Auf der FMZ ist dies möglich, aber in der Trading View wird ein Typfehler gemeldet. Wenn die operativen Zahlen auf beiden Seiten des Operators Strings sind, wird das System die Strings in Zahlen umgewandelt. Wenn nicht-numerische Strings nicht berechnet werden können, wird das Ergebnis der Systemoperation null.


Vergleichen der Operatoren

Vergleiche sind binäre Operatoren.

Operator veranschaulichen
< Weniger als
> Mehr als
<= Weniger als gleich
>= Größer ist gleich
== Gleichwertig
!= Ungleichheit

Testbeispiel:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

Wie wir sehen können, ist der Vergleichsoperator sehr einfach zu verwenden, aber es ist der Operator, den wir am häufigsten verwenden, wenn wir Strategien schreiben. Sie können sowohl Werte als auch eingebaute Variablen vergleichen, z. B.closeopenWarten. Wie bei den operativen Operatoren unterscheidet sich Pine von Trading View in der FMZ, die keine besonders strengen Anforderungstypen hat, so dass solche Aussagend = "1" >= 2Auf FMZ wird kein Fehler gemeldet, die String wird erst in Zahlen umgewandelt und dann verglichen. Auf Trading View wird ein Fehler gemeldet.


Logische Operatoren
Operator Codezeichen veranschaulichen
Nein not Einzeloperator, nicht operativ
Und and Binäre Operatoren, mit (und)
oder or Binäre Operatoren, oder Operationen

Wenn wir über Logik-Operatoren sprechen, dann müssen wir auch über Wahrheitszahlen sprechen. Genau wie wir es in der Highschool gelernt haben, nur dass wir es hier im Feedback-System getestet und gelernt haben:

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

Um nicht zu beobachten, dass das System ständig Druckinformationen druckt, verwenden wirruntime.error("stop")Die Aussage: Nach dem Ausdrucken wird ein Ausnahmefehler ausgelöst, der die Rückmessung beendet, und die Ausgabe wird beobachtet, um festzustellen, dass der Inhalt des Drucks und die Tabelle der wahren Werte identisch sind.


Trinitäre Operatoren

Verwendung von dreifachen Operatoren? :Dreifache Ausdrücke mit einer Kombination von Operationencondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseWir haben es bereits in den vorherigen Kursen gelernt. Die sogenannten Dreier-Ausdrücke und Dreier-Operatoren bedeuten, dass es insgesamt drei Operationen gibt.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseIn derconditionDas sind die Beurteilungsbedingungen, wenn die Werte für die Wahrheitsformel:valueWhenConditionIsTrueWennconditionDer Wert für den Fall-Ausdruck istvalueWhenConditionIsFalse

Es ist zwar nicht sehr praktisch, aber es sind Beispiele, die es Ihnen erleichtern, dies zu demonstrieren:

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

Wenn Sie eine Kreuzung finden, ist es egal, was Sie tun. Die Triad-Ausdrücke können auch eingebettet werden, wie wir es bereits in den vorherigen Tutorials getan haben.

a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

Das ist so, als würde mancondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseInvalueWhenConditionIsTruevalueWhenConditionIsFalseEs wird auch eine andere trinitäre Formulierung verwendet.


Historischer Operator

Verwenden Sie den Historiker[], beziehen sich auf die Historik der Zeitschiene. Diese Historikwerte sind die Werte der Variablen auf der K-Linie vor der aktuellen K-Linie BAR, als das Skript ausgeführt wurde.[]Operatoren werden nach Variablen, Ausdrücken und Funktionen aufgerufen.[]Der Wert in dieser Eckklammer ist die Abweichung der historischen Daten von der aktuellen K-Linie BAR. Wenn ich beispielsweise den Schlusskurs der letzten K-Linie BAR anzeige, schreibt man:close[1]

Wir haben in früheren Kursen ähnliche Schreibweisen gesehen:

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

[]Der Operator kann nur einmal auf demselben Wert verwendet werden, so dass dies falsch geschrieben wird und fehlerhaft ist:

a = close[1][2]   // 错误

Vielleicht sehen Sie hier, dass einige Ihrer Kommilitonen sagen, Operatoren[]Es ist eine Reihe von Strukturen, die ähnlich wie Arrays aussehen. Im Folgenden zeigen wir anhand eines Beispiels, dass es zwischen einer Reihe (series) und einer Array in der Sprache Pine nichts zu unterscheiden gibt.

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

Obwohla = close[1][2]Das ist ein Fehler, aber:

b = close[1]
c = b[1]

Es ist nicht falsch, wenn man es in Form eines gewöhnlichen Arrays interpretiert.b = close[1]Nach der Zuordnung sollte b ein Wert sein, aberc = b[1], b kann noch einmal mit dem historischen Operator auf die historische Wert bezogen werden. Das Konzept der Reihe in der Sprache von Pine ist nicht so einfach wie das der Arrays. Es kann als die historische Wert auf der letzten Bar von close verstanden werden, b ist auch eine Zeitreihenstruktur, die ihre historische Wert weiter bezieht. So sehen wir in den drei gezeichneten Linien a, b, c, b ist langsamer als a eine BAR, b langsamer als b eine BAR.

Wir können das Diagramm ganz links nach unten ziehen und sehen, dass die Werte b und c auf der ersten K-Zeile null sind. Das liegt daran, dass es keine historischen Werte gibt, wenn die Schrift auf der ersten K-Zeile BAR ausgeführt wird.nanzWir haben es in der Vergangenheit auch schon mal mit der Funktion in der Input-Funktion zu tun.nznaFunktionen, erinnern Sie sich, in welchem Kapitel?) die Null-Werte behandeln, z. B.:

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

Das ist eine Behandlung für den Nullwert ((na) ≠ 0).


Betreiberpriorität

Wir haben schon viele Operatoren in der Sprache Pine gelernt, die durch verschiedene Kombinationen von Operatoren und Zahlen zum Ausdruck kommen. Was ist die P