[TOC]
Das ist ein Video-Tutorial:Quantifizierte Transaktionen sind zu schwierig, um einzutauchen?
Die Inventor-Quantitative-Trading-Plattform unterstützt Schreibstrategien in der Pine-Sprache, unterstützt Retargeting, läuft die Pine-Sprache auf Festplatten und ist kompatibel mit niedrigeren Versionen der Pine-Sprache.FMZ.COM(Siehe unten)Das StrategieplatzEs gibt eine Vielzahl von Pine-Strategien (Skripte) für das Suchen und Transportieren.
FMZ unterstützt nicht nur die Sprache Pine, sondern auch die leistungsstarken Grafikfunktionen der Sprache. Die Funktionen der FMZ-Plattform, die umfangreichen praktischen Tools, die effiziente und einfache Verwaltung und die Nützlichkeit der Pine-Skripte werden weiter verbessert. FMZ basiert auf der Kompatibilität mit der Sprache Pine und bietet eine Reihe von Erweiterungen, Optimierungen und Beschnitten für die Sprache Pine.
Ein einfacher Überblick über einige der deutlichsten Unterschiede:
1. Die Pine-Richtlinie auf FMZ, die Versionsmarkierung am Anfang des Codes//@version
Und das beginnt mit Code.strategy
、indicator
Der Satz ist nicht obligatorisch und wird von FMZ vorerst nicht unterstütztimport
Importlibrary
Die Funktionen sind hier:
Einige der Strategien, die man sehen kann, sehen so aus:
//@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 sie schreibt:
//@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 FMZ kann man es 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)
2, Strategien (Skript) Einige transaktionsbezogene Einstellungen werden durch die Parameter "Pine Language Transaction Library" in der FMZ-Skript-Oberfläche festgelegt.
Abschluss- und Echtzeit-Preismodelle
In der Handelsansicht können wirstrategy
Die Funktioncalc_on_every_tick
Parameter, um ein Strategie-Skript zu erstellen, das bei jeder Preisänderung die Strategie-Logik in Echtzeit ausführt.calc_on_every_tick
Die Parameter sollten auftrue
Und das ist der Grund.calc_on_every_tick
Die Parameter sind:false
Das bedeutet, dass die Strategie nur dann ausgeführt wird, wenn die aktuelle K-Line BAR vollständig abgelaufen ist.
Auf der FMZ wird dies durch die Parameter der Schablone "Pine Language Exchange Library" festgelegt.
Bei der Ausführung der Strategie ist eine numerische Präzision der Preise, der Stückzahlen usw. auf der FMZ erforderlich. In der Handelsansicht gibt es keine Präzisionsprobleme, da nur simulierte Tests möglich sind. In der FMZ kann die Pine-Strategie in der Praxis ausgeführt werden. Dann ist eine Strategie erforderlich, mit der die Preispräzision, die Anzahl der Bestellungen flexibel festgelegt werden kann. Diese Präzisions-Einstellungen steuern die kleinen Zahlen der relevanten Daten, um zu vermeiden, dass die Daten nicht den Anforderungen der Börsenanzeige entsprechen und daher nicht bestellt werden können.
Futures-Kontrakt-Code
Die Handelsvarietät auf FMZ hat zwei Eigenschaften, wenn es sich um einen Vertrag handelt. Sie ist als "Trading Pair" oder "Contract Code" bezeichnet.swap
Der Kontraktcode hängt davon ab, ob die Börse, an der der Handel stattfindet, einen solchen Vertrag hat. Hier können Sie beispielsweise alle Quartalskontrakte ausfüllen.quarter
│Diese Kontraktcodes stimmen mit den Futures-Kontraktcodes überein, die in der Java/Python/C++-API-Dokumentation von FMZ definiert sind.│
Weitere Einstellungen, wie z.B. Mindest- und Default-Nummern, finden Sie in der Pine-Dokumentation."Pine ist eine Sprache, in der man sich verhandelt".Einführung in die Parameter.
3、runtime.debug
、runtime.log
、runtime.error
Funktionen der FMZ-Erweiterung, für Debugging.
Auf der FMZ-Plattform wurden drei Debugging-Funktionen hinzugefügt.
runtime.debug
: Das Drucken von Variableninformationen auf dem Controller ist in der Regel nicht möglich.
runtime.log
: Inloginhalte ausfüllen.. FMZ PINE hat eine spezielle Funktion..
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: wird aufgerufen, führt zu Ausführungsfehlern und trägt die Fehlermeldung, die in den Message-Parametern angegeben ist.
runtime.error(message)
4 und erweitert in der Grafikfunktion.overlay
Parameter
Pine-Sprache auf FMZ, Grafikfunktionenplot
、plotshape
、plotchar
Es ist so weit.overlay
Parameterunterstützung, die es erlaubt, Bilder in dem Haupt- oder Nebendiagramm anzugeben.overlay
Einstellungentrue
Sie werden in der Grundriss angezeigt.false
Zeichnen Sie in einem Unterdiagramm. Lassen Sie die Pine-Richtlinie auf FMZ laufen, wenn Sie einen Unterdiagramm und ein Unterdiagramm zeichnen.
5、syminfo.mintick
Die Werte der Variablen erfassen
syminfo.mintick
Die eingebaute Variable ist definiert als der kleinste Schnittwert der aktuellen Sorte.Echtzeitplatte/WiederholungDer Modellparameter "Price Currency Precision" in der "Pine Language Trading Library" in der Oberfläche kann diesen Wert steuern. Die Precision Currency Precision ist auf 2 gesetzt, d.h. der Preis ist bis zum zweiten Dezimalpunkt genau, wobei der Preis mit der geringsten Veränderungseinheit 0.01 geschätzt wird.syminfo.mintick
Das ist der Wert von 0.01 ∞.
6. Die durchschnittlichen Preise in FMZ PINE Script sind die Preise, die die Gebühren beinhalten
Zum Beispiel: Auftragspreis 8000, Verkaufsanweisung, Anzahl 1 Hand (ein paar), Durchschnittspreis nach der Transaktion nicht 8000, unter 8000 (die Kosten beinhalten die Bearbeitungsgebühren).
Wenn wir anfangen, die Grundlagen der Pine-Sprache zu lernen, sind wir vielleicht nicht vertraut mit den Anweisungen und der Code-Symmetrie in einigen Beispielen.
Bei der Einführung in die Sprache Pine ist es sehr notwendig, sich mit Konzepten wie dem Ausführungsverfahren von Pine-Skripten vertraut zu machen. Die Strategien der Pine-Sprache sind grafikbasiert und können als eine Reihe von Berechnungen und Operationen verstanden werden, die in der Reihenfolge der Zeitreihenfolge in einem Diagramm mit den frühesten Daten, die bereits in dem Diagramm geladen wurden, durchgeführt werden. Die Datenmenge, die am Anfang des Diagramms geladen wurde, ist begrenzt.bar_index
Verweist auf den Indexwert von K-LineBar, der zum Zeitpunkt der Ausführung des Pine-Skriptes aktuell ist.
plot(bar_index, "bar_index")
plot
Die Funktion ist eine der Funktionen, die wir in Zukunft häufiger verwenden werden.bar_index
Die Linie heißtbar_index
Sie können sehen, dass der Wert der Zeile, die als bar_index bezeichnet wird, in der ersten Bar-Name 0 ist, und dass 1 nach rechts zunimmt, wenn Bar zunimmt.
Je nach Einstellung der Strategie unterscheidet sich auch die Modelldurchführung der Strategie.收盘价模型
und实时价模型
Wir haben die Konzepte der Schlusskursmodelle und der Echtzeit-Kursmodelle bereits kurz vorgestellt.
Modell für die Abschlusspreise
Bei der Ausführung des Strategiecodes ist die Laufzeit der aktuellen K-LineBar vollständig abgeschlossen, und wenn die K-Line geschlossen wird, ist die K-Line-Laufzeit abgeschlossen. Bei dieser Ausführung wird die Pine-Strategie-Logik erneut ausgeführt, und das ausgelöste Handelssignal wird bei Beginn der nächsten K-LineBar ausgeführt.
Echtzeit-Preismodell
Bei der Ausführung des Strategiecodes wird die aktuelle K-LineBar unabhängig davon, ob sie geschlossen ist, bei jeder Marktänderung wiederholt mit der Pine-Strategie-Logik ausgeführt, und das ausgelöste Handelssignal wird sofort ausgeführt.
Wenn die Pine-Sprache-Politik von links nach rechts auf einem Diagramm ausgeführt wird, wird die K-LineBar in einem Diagramm in历史Bar
und实时Bar
Siehe auch:
Historische Bar
Wenn die Strategie als "Real Price Model" eingestellt wird, werden alle K-Line-Bars außer der K-Line-Bar auf der rechten Seite des Diagramms ausgeführt.历史Bar
Ich bin nicht derjenige, der das sagt.历史Bar
Das ist eine sehr schwierige Aufgabe.
Wenn die Strategie als "Schließpreismodell" eingestellt wird, werden alle Bars auf dem Diagramm ausgeführt.历史Bar
Ich bin nicht derjenige, der das sagt.历史Bar
Das ist eine sehr schwierige Aufgabe.
Die Berechnung basiert auf der historischen Bar: Die Strategiecode wird einmal in der Geschichte Bar-Schließung ausgeführt, und dann wird die Strategiecode in der nächsten Geschichte Bar ausgeführt, bis alle Geschichte Baren einmal ausgeführt werden.
Live-Bar
Wenn die Strategie auf die letzte K-Line Bar am rechten Rand ausgeführt wird, wird die Bar zu einer Live-Bar. Wenn die Live-Bar geschlossen wird, wird sie zu einer passiven Live-Bar (die zu einer historischen Bar wird).
Wenn die Strategie als "Real-Time-Preis-Modell" eingestellt ist, wird bei jeder Marktänderung auf der Real-Time-Bar eine Strategie-Logik ausgeführt. Die Strategie, die als "Schließpreismodell" eingestellt ist, zeigt beim Ausführen keine Live-Bar auf dem Chart.
Die Berechnung basiert auf der Echtzeit-Bar:
Wenn die Strategie als "Schließpreismodell" eingestellt ist und das Diagramm keine Live-Bar zeigt, wird der Strategiecode nur einmal bei der aktuellen Schließbar ausgeführt.
Wenn die Strategie als "Real-Price-Modell" eingestellt wird, ist die Berechnung auf der Real-Time-Bar völlig anders als die Berechnung auf der Historische-Bar, bei der eine Strategie-Code für jede Marktänderung auf der Real-Time-Bar ausgeführt wird.high
、low
、close
In der historischen Bar ist festgestellt, dass sich diese Werte bei jeder möglichen Veränderung des Marktes in der Echtzeitbar ändern. Daher werden auch Daten wie Indikatoren, die auf diesen Werten basieren, in Echtzeitbar geändert.close
Es gibt immer einen aktuellen Preis, der den aktuellsten Preis darstellt.high
undlow
Stets die höchsten und niedrigsten Höhen und Tiefen, die seit Beginn der aktuellen Live-Bar erreicht wurden. Diese eingebauten Variablen repräsentieren den Endwert, der bei der letzten Aktualisierung der Live-Bar erreicht wurde.
Ein Rückschlagmechanismus bei der Ausführung von Strategien auf der Echtzeit-Bar (Echtzeit-Preismodell): Bei der Real-Time-Bar-Ausführung wird die Variable, die der Benutzer definiert hat, bei jeder Neuauflage der Strategie vor der Ausführung neu eingestellt.
Bitte beachten Sie:
/*backtest
...
..
.
*/
Der Inhalt des Pakets ist die Rückrufkonfigurationsinformationen, die in Codeform auf der FMZ-Plattform gespeichert werden.
/*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")
Wir haben nur Szenen untersucht, die in Bar-Zeit ausgeführt wurden, also haben wirnot barstate.ishistory
Die Ausdrucksbeschränkung gilt nur für die Realzeit-Bar-Überschreibung von Variablen n und wird vor und nach der Ausführung der Überschreibung verwendet.runtime.log
Die Funktion liefert Informationen in den Strategieloggern.plot
Die gezeichnete Kurve n zeigt, dass n immer 0 war, als die Strategie in der historischen Bar ausgeführt wurde. Die Operation n plus 1 wurde ausgelöst, als sie bis zur Echtzeitbar ausgeführt wurde, und n plus 1 wurde bei jeder Runde der Ausführung von Strategien in der EchtzeitBar ausgeführt. Aus den Login-Informationen kann beobachtet werden, dass n bei jeder erneuten Ausführung des Strategiekodes auf den Wert der letzten Ausführung der Politik Bar zurückgesetzt wird.
Ich bin der Meinung, dass es nicht richtig ist. 1, wenn die Politik in der Echtzeit in Bar ausgeführt wird, wird bei jedem Geschäftsupdate ein Politikcode ausgeführt. 2. Bei der Ausführung auf der Echtzeit-Bar wird die Variable vor jeder Ausführung des Strategic-Codes rückgängig gemacht. 3. Bei der Ausführung auf RealtimeBar werden die Variablen bei der Schließungserneuerung einmal eingereicht.
Grafikoperationen wie Kurven auf den Diagrammen können auch zu Umschreibungen führen, da die Daten rückwärts rollen.
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")
Bild von Moment A
Bild von Moment B
Wir haben nur diesen Satz geändert:n := open > close ? n + 1 : n
In der ersten Abbildung kann man sehen, dass in Moment A, da der Eröffnungspreis zu diesem Zeitpunkt höher als der Schließpreis ist, n addiert wird, und die Grafikkurve n einen Wert von 5 zeigt. Dann zeigt sich die Bewegung, die Preisveränderung wie in der zweiten Abbildung.
Kontext der Variablen in einer Funktion
Im Folgenden untersuchen wir gemeinsam die Variablen in den Funktionen der Sprache Pine. Gemäß der Beschreibung in einigen Pine-Tutorials unterscheiden sich Variablen in den Funktionen von Variablen außerhalb der Funktion wie folgt:
Die Geschichte der in der Pine-Funktion verwendeten Reihe von Variablen wird durch jeden aufeinanderfolgenden Aufruf der Funktion erstellt. Wenn die Funktion nicht auf jede Spalte aufgerufen wird, auf die das Skript ausgeführt wird, wird dies zu einer Differenz zwischen den historischen Werten innerhalb des Funktionsobjekts und den historischen Werten der externen Reihe führen. Wenn daher die Funktion nicht auf jede Spalte aufgerufen wird, wird die Reihe, die mit dem gleichen Indexwert innerhalb der Funktion und mit externen Referenzen verwendet wird, nicht auf den gleichen historischen Punkt beziehen.
Ist es nicht etwas schwer zu lesen? Schon gut, wir haben das mit einem Testcode gelöst, der auf FMZ läuft:
/*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)
Wiederholung des Laufbilds
Die Test-Code ist relativ einfach und zielt vor allem darauf ab, Daten zu untersuchen, die auf zwei Arten zitiert werden:f(a) => a[1]
undf2() => close[1]
。
f(a) => a[1]
: Wie man die Parameter überträgt, und die Funktion endlich zurückkehrta[1]
。
f2() => close[1]
Direkt mit den eingebauten Variablenclose
Die Funktion wird endlich zurückgegeben.close[1]
。
[]
Die Symbole werden für Referenzoperationen an den historischen Werten der Variablen in der Datenserie verwendet, die close[1] beziehen sich auf die Daten des aktuellen Schlusskurses vor dem Schlusskurs 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 f(close)
Der Wert wird zurückgegeben.
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
Zeichnen Sie ein Zeichen mit B, in grüner Farbe, wenn oneBarInTwo wahr ist, und die Position (auf der Y-Achse) ist:f2()
Der Wert wird zurückgegeben.
plot(close[2], title = "close[2]", color = color.red, overlay = true)
Die Linie ist in Rot angezeigt, und die Position (auf der Y-Axis) ist:close[2]
Das ist der Schlusskurs auf Bar, der 2. Linie vor der aktuellen Zahl Bar.
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Die Linie ist grün und zeigt (auf der Y-Achse):close[1]
Das ist der Verkaufspreis auf Bar, der 1. Linie vor der aktuellen Zahl Bar (die 1. Linie nach links).
Bildschirm, der durch die Strategie Retargeting ausgeführt wird, kann gesehen werden, obwohl Bild A die Funktion markiert, die verwendet wirdf(a) => a[1]
und die Funktion, die in Abbildung B markiert wirdf2() => close[1]
Alle werden verwendet, um[1] historische Daten in Datenreihen zu referenzieren, aber die Markierungsposition von "A" und "B" auf dem Diagramm ist völlig unterschiedlich. Die Markierungsposition von "A" fällt immer auf die rote Linie, also den Code in der Strategie.plot(close[2], title = "close[2]", color = color.red, overlay = true)
Die Daten, die in der Linie verwendet werden, sind:close[2]
。
Das ist, weil wir die Index von K-LineBar, die eingebaute Variable, benutzen.bar_index
Berechnen, ob "A" und "B" markiert werden sollen. Die "A" und "B" markiert werden, aber nicht auf jeder K-Line.f(a) => a[1]
Wenn die Funktion nicht an jeder Bar aufgerufen wird, wird der Wert, der auf diese Weise referenziert wird, mit der Funktion verglichen.f2() => close[1]
Diese Methode bezieht sich auf unterschiedliche Werte (auch wenn der gleiche Index wie [1] verwendet wird).
Einige eingebaute Funktionen müssen an jedem Bar berechnet werden, um ihre Ergebnisse richtig berechnen zu können.
Das kann man mit einem einfachen Beispiel beschreiben:
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 den Code.ta.barssince(close < close[1])
Wir schreiben es in einem dreifachen Operator.condition ? value1 : value2
Das führt dazu, dass es nur in der Türkei gibt.close > close[1]
时去调用ta.barssince函数。可偏偏ta.barssince
Die Funktion wird von der letzten Zeit abgerechnet.close < close[1]
Die Anzahl der K-Streifen bei der Einrichtung; die Ta.barssince-Funktion wird bei Anruf von close > close eingesetzt[1], d.h. der aktuelle Schlusskurs ist größer als der Schlusskurs des letzten Bar. Die Ta.barssince-Funktion wird bei Anruf der Bedingung close < close[1] nicht eingesetzt und hat keine letzte Einrichtung.
ta.barssince : Bei Aufruf kehrt die Funktion na zurück, wenn diese Bedingung noch nie vor der aktuellen K-Zeile erfüllt wurde.
Siehe Bild:
Also, wenn wir das Diagramm zeichnen, zeichnen wir nur die Daten, wenn die Res-Variable den Wert ((-1) ∞ hat.
Um dieses Problem zu vermeiden, können wir einfachta.barssince(close < close[1])
Funktionsanrufe werden aus den dreifachen Operatoren entnommen und werden in jeder möglichen Bedingungsverzweigung außerhalb geschrieben.
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)
Das Konzept der Zeitreihe ist in der Sprache Pine sehr wichtig und ist ein Konzept, das wir verstehen müssen, wenn wir die Sprache Pine lernen. Eine Zeitreihe ist nicht ein Typ, sondern die grundlegende Struktur für die Kontinuität von Variablen, die mit der Zeit gespeichert werden. Wir wissen, dass Pine-Skripte auf Diagrammen basieren.open
ist eine Variable in der Pine-Sprache, deren Struktur die Zeitreihe für die Eröffnungspreise für jede K-Zeile Bar speichert.open
Diese Zeitreihenstruktur stellt den Startpreis für alle K-String-Bars des aktuellen K-Strings dar, von der ersten Bar, an der es begann, bis zu diesem Bar, an dem das aktuelle Skript ausgeführt wurde. Wenn das aktuelle K-String-String eine 5-minütige Periode ist, dann zitieren wir (oder verwenden) es in der Pine-Strategie-Code.open
Der Startpreis von K-LineBar bei der aktuellen Ausführung des Strategiekodes. Wenn ein historischer Wert in der Zeitreihe verwendet werden muss.[]
Der Operator. wird verwendet, wenn die Pine-Politik auf einer K-LineBar ausgeführt wird.open[1]
Angabe von Quellenopen
Der Startpreis des vorherigen K-Line-Bars (d. h. der Startpreis des letzten K-Line-Zyklus) für dieses K-Line-Bar, das das aktuelle Skript in der Zeitreihenfolge ausgeführt hat.
Die Variablen in der Zeitreihe sind sehr praktisch für die Berechnung.
Wir haben eine eingebaute Funktion.ta.cum
Ein 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
Test-Code: Das ist das erste Mal, dass ich einen Test habe.
v1 = 1
v2 = ta.cum(v1)
plot(v1, title="v1")
plot(v2, title="v2")
plot(bar_index+1, title="bar_index")
Es gibt viele ähnliche.ta.cum
Solche eingebauten Funktionen können Daten aus der Zeitreihe direkt verarbeiten, z. B.ta.cum
Das bedeutet, dass wir die entsprechenden Werte der eingegangenen Variablen auf jeder K-LineBar addieren, und dann verwenden wir ein Diagramm, um es zu verstehen.
Strategie und Betrieb | Eingebettete Variable bar_index | V1 | V2 |
---|---|---|---|
Die Strategie läuft auf der ersten K-Linie Bar | 0 | 1 | 1 |
Die Strategie läuft auf der zweiten K-Linie Bar. | 1 | 1 | 2 |
Die Strategie läuft auf der dritten K-Linie Bar. | 2 | 1 | 3 |
… | … | … | … |
Die Strategie läuft auf der n + 1 K-Strecke Bar | N | 1 | N+1 |
Wie man sieht, sind v1, v2 und sogar bar_index Zeitreihenstrukturen, die für jeden Bar eine entsprechende Datenmenge haben. Der Testcode unterscheidet zwischen "Echtzeit-Preismodell" und "Schließpreismodell" nur, ob die Echtzeit-Bar auf dem Diagramm angezeigt wird.
Die Variable v1 ist für jeden Bar gleich 1.ta.cum(v1)
Da die Funktion nur die erste Bar auf der ersten K-Linie Bar ausgeführt wird, ergibt sich für die Variable v2 ein Ergebnis von 1.
Wennta.cum(v1)
Bei der Ausführung auf der zweiten K-Linie Bar gibt es bereits 2 K-LinienBar (die erste entsprechende Eingabebar_index ist 0, die zweite entsprechende Eingabebar_index ist 1), so dass das Ergebnis 2 ist und die Variable v2 so weiter zugeordnet wird. Es kann tatsächlich beobachtet werden, dass v2 die Anzahl der K-LinienBar in einem Diagramm ist, da die Indexzahl der K-Linien ist.bar_index
Wenn wir von 0 ansteigen, dannbar_index + 1
Das ist die Anzahl der K-Linienbars.v2
undbar_index
Ich bin nicht derjenige, der das Problem nicht löst.
Ich kann es auch benutzen.ta.cum
Die eingebaute Funktion berechnet die Summe aller Bar-Schließpreise auf dem aktuellen Diagramm und kann nur so geschrieben werden:ta.cum(close)
, wenn die Strategie in der rechten Echtzeit Bar läuftta.cum(close)
Das Ergebnis der Berechnung ist die Summe der Schlusskosten für alle Bar auf dem Diagramm (wenn man nicht bis zur rechten Spitze läuft, nur auf die aktuelle Bar addiert).
Die Variablen in der Zeitreihe können auch mit Operatoren berechnet werden, z. B. Code:ta.sma(high - low, 14)
Die Variablen sind in derhigh
(K-Line Bar höchste Preis) minuslow
(K-Line-Bar-Mindestpreis), zum letzten Mal verwendetta.sma
Die Funktion sucht nach dem Mittelwert.
Die Ergebnisse von Funktionsanrufen hinterlassen auch Werte in der Zeitreihe.
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 Nachprüfen getestet und kann beobachtet werden, dassv1
undv2
Die Werte sind identisch und die auf dem Diagramm gezeichneten Linien sind vollständig überlappend. Die Ergebnisse der Funktionsanrufe hinterlassen Spuren von Werten in der Zeitreihenfolge, z. B. Code.ta.highest(high, 10)[1]
Einer davonta.highest(high, 10)
Die Ergebnisse, die durch den Aufruf der Funktion berechnet werden, können auch verwendet werden, um[1] ihren historischen Wert zu zitieren.ta.highest(high, 10)
Das Ergebnis ist:ta.highest(high[1], 10)
Ich bin nicht derjenige.ta.highest(high[1], 10)
undta.highest(high, 10)[1]
Das ist ein absolut gleichwertiges Produkt.
Ausgabe von Informationen mit einer anderen Grafikfunktion:
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)
Man kann sehen, dass die Werte der Variablen a und b in der Zeitreihe oben und unten der entsprechenden Bar angezeigt werden.
Im Anfangsteil des Tutorials haben wir einige Unterschiede zwischen der Verwendung der Sprache Pine auf FMZ und der Verwendung der Sprache Pine in Trading View zusammengefasst.indicator()
、strategy()
Ich bin nicht derjenige, der das tun will.library()
Für die Kompatibilität mit den früheren Versionen von Pine-Skript schreibt man natürlich beim Schreiben von Strategien wie://@version=5
,indicator()
,strategy()
Das ist auch möglich. Einige Strategie-Einstellungen können auch in der App verwendet werden.strategy()
Die Parameter-Einstellungen in der Funktion.
<version>
<declaration_statement>
<code>
<version>
Versionskontrollinformationen können ausgelassen werden.
Pine-Sprache//
Als einzeilige Anmerkung, da die Pine-Sprache keine mehrseitigen Anmerkungen hat. FMZ erweitert die Anmerkung/**/
Für mehrzeilige Kommentare.
Eine Zeile in einem Skript, die keine Anmerkungen oder Kompilatoranweisungen enthält, ist ein Satz, der die Algorithmen des Skripts implementiert. Eine Statement kann eine dieser Inhalte sein.
if
,for
,while
oderswitch
Äquivalente StrukturenSätze können auf verschiedene Weise sortiert werden.
空格
oder制表符
(Tab-Taste) beginnen. Ihr erstes Zeichen muss auch das erste Zeichen der Zeile sein. Die Zeile, die an der ersten Position der Zeile beginnt, ist per Definition Teil des globalen Bereichs des Skripts.local block
│ Ein Localblock muss in einen Zeichnersatz oder vier Räume zusammengefasst werden (sonst wird er als serieller Code der vorherigen Zeile analysiert, d.h. als kontinuierlicher Inhalt der vorherigen Code-Zeile beurteilt), wobei jedes Localblock eine andere Lokalfläche definiert.Beispielsweise besteht aus drei Lokalblöcken, von denen eine in der Angabe einer benutzerdefinierten Funktion und zwei in der Angabe einer Variablen die If-Struktur verwenden, die folgenden Code enthalten:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Eine lange Zeile kann in mehrere Zeilen aufgeteilt oder "umgepackt" werden. Eine umgepackte Zeile muss in jede Anzahl von Räumen verkleinert werden, solange sie nicht ein Vielfaches von 4 ist (diese Grenzen werden für die Verkleinerung von Teilen verwendet).
a = open + high + low + close
Kann so verpackt werden (beachten Sie, dass die Anzahl der Schrumpffflächen pro Zeile keine Vielfache von 4 ist):
a = open +
high +
low +
close
Ein langer Plot ((() -Aufruf kann in.
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)
Ein Satz in einer vom Benutzer definierten Funktionserklärung kann auch verpackt werden. Da jedoch ein Lokalblock syntaxgetreu mit einem Schrumpfbeginn beginnen muss ((4 Räume oder 1 Zeichnersatz), muss der Fortlauf des Satzes bei seiner Aufteilung in die nächste Zeile mit mehr als einem Schrumpfbeginn beginnen ((nicht gleich einem Multiplikator von 4 Räumen); zum Beispiel:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Bevor wir die Variablen kennen, müssen wir zuerst das Konzept der Symbolzeichen verstehen.FunktionenundVariablenDer Name (für die Benennung von Variablen, Funktionen) wird verwendet.FunktionenWie wir in unseren nächsten Tutorials erfahren werden, lernen wir zuerst die Symbole für die Anzeichen an.
(A-Z)
Oder klein geschrieben.(a-z)
Buchstaben oder Unterstreifen(_)
Der Beginn, der erste Charakter eines Kennzeichens.Ein Beispiel dafür ist ein Kennzeichen mit folgenden Namen:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
Wie in den meisten Programmiersprachen gibt es auch in der Pine-Sprache Schreibempfehlungen.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
Operatoren sind einige Operationszeichen, die in Programmiersprachen verwendet werden, um Expressions zu konstruieren, und Expressions sind Rechenregeln, die wir für einen bestimmten Rechenzweck entworfen haben, wenn wir Strategien schreiben. Operatoren in der Pine-Sprache werden nach Funktionen klassifiziert als:
Es gibt viele verschiedene Arten von Funktionen, wie z. B. Angabeoperatoren, Rechenoperatoren, Vergleichsoperatoren, Logikoperatoren,? :
Die drei-Wert-Operatoren[]
Historische Referenz-Operatoren.
Mit Arithmetischen Operatoren*
Zum Beispiel gibt es den folgenden Testcode, um die Art der Probleme zu unterscheiden, die durch die Ergebnisse der Pine-Language-Operatoren in Trading View zurückgegeben 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)
Bei der Ausführung dieses Skripts in Trading View wird ein Fehler berichtet, weiladjustedLength = lenInput * factor
Das Ergebnis nach dem Multiplikator ist:series int
Typ ((Serie), jedochta.ema
Der zweite Parameter der Funktion unterstützt diesen Typ nicht. Allerdings gibt es auf FMZ keine solchen strengen Einschränkungen.
Hier sehen wir gemeinsam, wie verschiedene Operatoren verwendet werden.
Es gibt zwei Arten von Bewertungsoperatoren:=
、:=
Das haben wir auch in einigen Beispielen zu Beginn dieses Tutorials gesehen.
=
Die Operatoren werden verwendet, um eine Variable zu initialisieren oder zu deklarieren.=
Die Variablen nach der Initialisierung, der Erklärung der Zuordnung, beginnen mit diesem Wert in jedem folgenden Bar. Dies sind alle 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)
Vorsicht.a = close
Bewertungsstatements, bei denen die Variable a für jede Bar der aktuelle Schlusspreis für diese Bar ist (siehe unten). Andere Variablenb
、c
、d
Die Ergebnisse werden durch ein Diagramm angezeigt.
:=
Es wird verwendet, um einen Wert an eine vorhandene Variable neu zuzuordnen.:=
Die Operatoren werden verwendet, um den Wert einer bereits deklarierten, initialierten Variable zu ändern.
Wenn es verwendet wird:=
Ein Operator kann Fehler bei nicht initialierten oder deklarierten Variablen erzeugen, z. B.:
a := 0
Das ist ein sehr schwieriger Fall.:=
Die Assignment-Operatoren werden in der Regel verwendet, um bereits vorhandene Variablen neu zuzuordnen, z. B.:
a = close > open
b = 0
if a
b := b + 1
plot(b)
Beurteilen, obclose > open
(d.h. das aktuelle BAR ist die Sonnenscheinlinie), a ist der Wahrheitswert (true) ; dann wird der Code im lokalen Block der if-Sätze ausgeführt.b := b + 1
, mit einem Assignment-Operator:=
Die Variable b wird neu bewertet, einem 1 hinzugefügt und dann mit der Plot-Funktion in einem Diagramm die Werte der Variablen b in den einzelnen BARs der Zeitreihen in Zeilen dargestellt.
Ist es nicht so, dass wir hier die Variable b erklären, ohne dass wir beim Initiieren auf 0 irgendein Schlüsselwort verwenden?b=0
Wir können also sehen, dass das Ergebnis der Ausführung dieses Codes ist, dass wir die Variable b jedes Mal wieder auf 0 setzen, wenn a ein wahrer Wert ist.close > open
Dann wird b bei dieser Ausführung 1 addiert, wenn die Plot-Funktion ein Diagramm zeichnet, aber b wird bei der nächsten Ausführung zu 0 neu zugewiesen. Auch hier ist es für Anfänger in der Pine-Sprache leicht, in eine Grube zu treten.
Wenn es um die Angabeoperatoren geht, müssen wir zwei Schlüsselwörter erweitern:var
、varip
Ver-
In der Tat ist dieses Schlüsselwort, das wir in früheren Tutorials gesehen und verwendet haben, nur nicht zu der Zeit ausführlich erörtert worden.
var ist ein Schlüsselwort, das verwendet wird, um Variablen zu vergeben und einmalig zu initialisieren. In der Regel führt die Variablenbezeichnungssymmetrie, die das Schlüsselwort var nicht enthält, dazu, dass der Wert der Variablen bei jedem Datenaufruf überschattet wird. Im Gegensatz dazu können Variablen, die mit dem Schlüsselwort var vergeben werden, trotz der Datenauflage den Status erhalten.
Wir benutzen dieses Beispiel immer noch, aber wir benutzen es, wenn wir b zuordnen.var
Schlüsselwörter.
a = close > open
var b = 0
if a
b := b + 1
plot(b)
var
Die Schlüsselwörter lassen die Variable b nur die ursprüngliche Erstbezeichnung ausführen und setzen sie bei jeder Ausführung der Strategielogik nicht mehr auf 0, so dass die Linie, die beim Laufen gezogen wird, beobachtet werden kann, dass b die Anzahl der Sonnenstrahlen BARs ist, die bei der aktuellen K-Linie BAR aufgetreten sind.
Variablen mit der Erklärung var können nicht nur global geschrieben werden, sondern auch in einem Codeblock, 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
Variation
varip
Wir sehen dieses Schlüsselwort zum ersten Mal, und wir können die Beschreibung dieses Schlüsselworts ansehen:
varip ((var intrabar persist) ist ein Schlüsselwort für die Zuordnung und Einmalinitialierung von Variablen. Es ist ähnlich dem Schlüsselwort var, aber Variablen mit der Varip-Deklaration behalten ihren Wert zwischen Echtzeit-K-Linien-Aktualisierungen.
Ist es schwieriger zu verstehen? Ist es okay, wir erklären es mit Beispielen und 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 zeigt sich in verschiedenen Formen im "Schließpreismodell" und "Echtzeitpreismodell":
Das Modell der Echtzeitpreise:
Denken Sie daran, dass wir die Strategie in der historischen BAR-Phase und in der Echtzeit-BAR-Phase ausgeführt haben.var
、varip
Variablen für die Erklärungi
、ii
Bei jeder Runde der Ausführung des Strategiekodes werden inkrementelle Operationen ausgeführt. So kann man sehen, dass die Zahlen, die auf der K-Line BAR für die Wiederholung des Ergebnisses angezeigt werden, jeweils inkrementell 1 sind. Wenn die historische K-Line-Phase endet, beginnt die Echtzeit-K-Line-Phase.i := i + 1
undii := ii + 1
Der Unterschied ist, dass ii jedes Mal geändert wird. i wird zwar jedes Mal geändert, aber bei der nächsten Ausführung der Strategielogik wird der vorherige Wert wiederhergestellt. (Erinnern Sie sich an den Rücklaufmechanismus, den wir im vorherigen Kapitel "Modelldurchführung" erörtert haben?), Der Wert von i wird erst festgestellt, wenn die aktuelle K-Leitung BAR abgelaufen ist.
Das Modell der Verkaufspreise: Da das Schlusspreismodell eine Strategie-Logik ausführt, die nur einmal ausgeführt wird, wenn jede K-Linie BAR abläuft. In dem Schlusspreismodell werden die Variablen der historischen K-Linie-Phase und der Echtzeit-K-Linie-Phase, die von var, varip erklärt werden, in den oben genannten Beispielen inkrementell vollständig übereinstimmend dargestellt, wobei jede K-Linie BAR inkrementell 1 ist.
Die Operatoren | Erläuterung |
---|---|
+ | Die Gafa |
- | Abbau von Gesetzen |
* | Multiplikation |
/ | Ausnahme |
% | Modellsuche |
+
、-
Die Operatoren können als Binäroperatoren oder als Einheitsoperatoren verwendet werden. Andere Arithmetische Operatoren können nur als Binäroperatoren verwendet werden und geben Fehler zurück, wenn sie als Einheitsoperatoren verwendet werden.
1, Die Operatoren sind auf beiden Seiten mit einem Zahlentyp versehen. Das Ergebnis ist der Zahlentyp, der Ganztyp oder die Floppzahl.
Wenn die Operatorzahl eine String ist, dann ist die Operatorzahl+
, wird das Ergebnis eine String, die Zahlen werden in die Form einer String umgewandelt, die dann zusammengefügt wird. Wenn es sich um andere Arithmetik-Operatoren handelt, wird versucht, die String in eine Zahlenzahl zu konvertieren und dann zu arbeiten.
3. Wenn eine der Operationszahlen na ist, wird die Berechnung als Nullwert na ausgeführt und wird beim Drucken auf der FMZ NaN 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 etwas von der Pine-Sprache auf Trading View.
a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A"
plot(a)
plot(b)
plot(c)
Die Funktion ist in der FMZ möglich, wird aber in der Trading-Ansicht mit einem Typenfehler versehen. Wenn die Operationen an beiden Seiten der Arithmetik-Operatoren Strings sind, wird das System die String zu einem Zahlenwert umwandeln. Wenn die nicht-numerische String nicht berechnet werden kann, wird das System-Operationsergebnis als null na betrachtet.
Die Vergleichsoperatoren sind binäre Operatoren.
Die Operatoren | Erläuterung |
---|---|
< | Weniger als |
> | Größer als |
<= | Weniger ist gleich |
>= | Größer als 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 Sie sehen können, ist der Vergleichsoperator sehr einfach zu verwenden, aber er ist auch der Operator, den wir am häufigsten verwenden, wenn wir Strategien schreiben.close
、open
Und so weiter.
Wie bei den Operationsoperatoren unterscheidet sich Pine auf FMZ von Trading View, da FMZ keine besonders strengen Anforderungstypen hat.d = "1" >= 2
In FMZ gibt es keine Fehlermeldung. Bei der Ausführung wird die String zu einem Zahlenwert umgewandelt und dann wird die Operation verglichen. In Trading View gibt es Fehlermeldungen.
Die Operatoren | Codezeichen | Erläuterung |
---|---|---|
Nicht | - Nein. | Einmalige Operatoren, nicht ausgeführt |
und | und | Binäre Operatoren, die mit ((und) arbeiten |
oder | oder | Binäre Operatoren oder Operationen |
Wenn es um logische Operatoren geht, dann muss es um die Echtwerttabelle gehen. Wie wir es in der Highschool gelernt haben, nur dass wir hier im Retrospektivsystem testen und lernen:
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 zu verhindern, dass die immer wieder gedruckten Informationen durch das Retrospektiv die Beobachtung beeinflussen, benutzen wir eine neue Methode.runtime.error("stop")
Die Aussage wird nach einer Druckdurchführung mit einem ungewöhnlichen Fehler gestoppt, sodass die Ausgabe beobachtet werden kann und festgestellt wird, dass der gedruckte Inhalt und die Echtwerttabelle identisch sind.
Mit dreifachen Operatoren? :
Die Kombination von drei Elementen und Operatoren.condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
Wir haben es in früheren Lektionen schon gelernt. Eine sogenannte Dreifach-Expression, eine Dreifach-Operator, bedeutet, dass es insgesamt drei Operationen gibt.
condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
In der Mittecondition
Wenn die Ausdrücke "true" oder "true" sind, dann ist der Wert:valueWhenConditionIsTrue
Wenncondition
Wir haben eine Hypothese.valueWhenConditionIsFalse
。
Es gibt viele Beispiele, die praktisch nicht nützlich sind, aber einfach zu demonstrieren sind:
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)
Was passiert, wenn wir einen Kreuzstab treffen, ist egal! Dreifache Ausdrücke können auch eingebettet werden, so wie wir es in einem früheren Tutorial 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 das gleiche wiecondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
InnerlichvalueWhenConditionIsTrue
、valueWhenConditionIsFalse
, wird auch mit einem anderen Dreifach-Ausdruck ersetzt.
Mit historischen Operatoren[]
, beziehen sich auf die historischen Werte der Zeitreihe. Diese historischen Werte sind die Werte der Variablen auf der K-Linie BAR vor der aktuellen K-Linie BAR, wenn das Skript ausgeführt wird.[]
Die Operatoren werden nach den Anrufen von Variablen, Ausdrücken und Funktionen verwendet.[]
Die Zahlen in den Klammern sind die Abweichung der historischen Daten, die wir anführen wollen, von der Entfernung der aktuellen K-Line BAR. Zum Beispiel, wenn ich den Schlusskurs einer K-Line BAR zitieren möchte, dann kann man schreiben:close[1]
。
Wir haben in früheren Kursen schon so etwas gesehen:
high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)
[]
Der Operator kann nur einmal für denselben Wert verwendet werden, also wird er falsch geschrieben und gibt einen Fehler zurück:
a = close[1][2] // 错误
Sie können sehen, dass einige meiner Schüler sagen, dass die Operatoren[]
Das ist für die Serie-Struktur, die ähnlich aussieht wie eine Serie und eine Matrix.
Im Folgenden zeigen wir mit einem Beispiel, wie sich eine Reihe und eine Array in der Pine-Sprache unterscheiden.
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]
Wenn man die Zahlen in der normalen Arithmetik versteht, dann ist es nicht falsch, wenn man sie in der normalen Arithmetik schreibt.b = close[1]
Nach der Zuordnung sollte b ein Wert sein.c = b[1]
, b kann abermals mit dem historischen Operator auf den historischen Wert zurückgeführt werden. Wie man sieht, ist das Konzept der Reihe in der Sprache Pine nicht so einfach wie die Array. Man kann den historischen Wert auf dem letzten Bar, der zu b zugeordnet wurde, als "close" verstehen. b ist auch eine Zeitreihenstruktur, die ihren historischen Wert weiter zitiert.
Wir können das Diagramm nach links ziehen und feststellen, dass die Werte von b und c auf der ersten K-Zeile null sind. Das ist, weil ein oder zwei Perioden-Historien, die beim Ausführen des Skripts auf der ersten K-Zeile BAR nicht vorne zitiert werden, nicht vorhanden sind.na
、nz
Wir haben es auch in früheren Studien angesprochen.nz
、na
Funktionen, erinnern Sie sich noch, in welchem Abschnitt?) spezifische Fälle von Leerwerten behandelt, wie zum Beispiel:
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
Dies ist eine Art Handhabung für mögliche Referenzen an Nullwerte ((na)).
Wir haben schon viele Operatoren in der Pine-Sprache gelernt, die durch verschiedene Kombinationen von Operationszahlen und Operationszahlen Ausdrücke bilden. Wie ist die Priorität dieser Operationen, wenn sie in den Ausdrücken berechnet werden?
Prioritäten | Die Operatoren |
---|---|
9 | [] |
8 | Einheitliche Operatoren+ 、- undnot |
7 | * 、/ 、% |
6 | Binäre Operatoren+ 、- |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
Die mit hoher Priorität ausgewiesenen Ausdrucksbereiche werden zuerst bearbeitet, wenn die Priorität gleich ist, dann von links nach rechts.()
Die Ausdrücke werden in einem Umschlag umgeben, in dem die Teilbearbeitung gezwungen ist.
Wir haben bereits das Konzept der Variablen-Kennzeichen gelernt, die Variablen als Namen für Variablen benannt werden. Also: Variablen sind Kennzeichen, die Werte speichern.
Die Erklärung:
Bei der Erklärung einer Variablen wird zuerst "Deklarationsmodus" geschrieben.
1. Verwenden Sie das Schlüsselwortvar
Das ist nicht wahr.
2. Verwenden Sie Schlüsselwörtervarip
Das ist nicht wahr.
3. Nichts geschrieben.
var
、varip
Die Schlüsselwörter, die wir bereits in den vorherigen Kapiteln über "Zuschreibungsoperatoren" gelernt haben, werden hier nicht mehr beschrieben.i = 1
, in der Tat haben wir bereits gesagt, dass die Variablen, die so erklärt werden, und die Angabe, dass sie auf jeder K-Line BAR ausgeführt werden.
Typ Die Pine-Sprache auf FMZ ist für Typanforderungen nicht streng und kann in der Regel übersprungen werden. Allerdings kann eine Variable auch mit einem Typ deklariert werden, um die Skriptsysteme in Trading View zu unterstützen.
int i = 0
float f = 1.1
Typen in der Trading View sind strengere Anforderungen, wenn der folgende Code in der Trading View verwendet wird:
baseLine0 = na // compile time error!
Kennzeichen Ein Identifier ist der Name einer Variable, die in den vorherigen Kapiteln erwähnt wurde.https://www.fmz.com/bbs-topic/9390#标识符
Zusammenfassend kann man sagen, dass eine Variable so geschrieben werden kann:
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
Hier wird ein Angabe-Operator verwendet:=
Bei der Variablenerklärung wird eine Variablenbezeichnung gegeben. Bei der Bezeichnung können Werte Strings, Zahlenwerte, Ausdrücke, Funktionsanrufe,if
、 for
、while
oderswitch
Die Strukturen werden in den folgenden Kursen erläutert, obwohl wir in den vorherigen Kursen bereits die einfache Angabe von If-Sätzen gelernt haben.
Wir haben uns hier auf die Input-Funktion konzentriert, eine Funktion, die wir häufig verwenden, wenn wir unsere Design-Policies schreiben.
Die Eingabefunktion:
input函数,参数defval、title、tooltip、inline、group
Die Input-Funktion auf der FMZ unterscheidet sich etwas von der Funktion in der Trading View, allerdings wird sie als Assignierungsinput für die Strategieparameter verwendet.
param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")
ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)
Bei der Erklärung von Variablen wird häufig die Input-Funktion verwendet. In FMZ wird die Input-Funktion automatisch in der FMZ-Politik-Interface die Steuerung für die Einstellung der Politikparameter dargestellt. Die auf FMZ unterstützten Steuerungen verfügen derzeit über Zahlen-Eingabefelder, Text-Eingabefelder, Drop-Boxen, Blur-Wert-Auswahl.
Wir haben einige wichtige Parameter für die Input-Funktion erläutert:
Neben der Erklärung einzelner Variablen und der Zuordnung gibt es in der Pine-Sprache auch eine Schreibweise, in der eine Gruppe von Variablen und eine Zuordnung erklärt wird:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
Die häufigste ist, dass wirta.macd
Bei der Berechnung des MACD-Indikators können drei Datensätze berechnet werden, da der MACD-Indikator ein Multiline-Indikator ist.
[dif,dea,column] = ta.macd(close, 12, 26, 9)
plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)
Wir können einfach MACD-Diagramme mit diesem Code zeichnen. Nicht nur die eingebauten Funktionen können mehrere Variablen zurückgeben, sondern auch die geschriebenen Custom-Funktionen können mehrere Daten zurückgeben.
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
Die Verwendung von Strukturen wie if als Multi-Variablen-Zuteilung ist ähnlich wie bei den oben genannten Custom Functions.
[ema10, ema20] = if true
fast = ta.ema(close, 10)
slow = ta.ema(close, 20)
[fast, slow]
plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)
Einige Funktionen sind in lokalen Codeblöcken, die nicht in den bedingten Zweigen geschrieben werden können, vor allem folgende Funktionen:
Barfarbe (), Füllfarbe (), Linie (), Indikator (), Grafik (), Grafikleuchten (), Grafikbild (), Grafikbild (), Grafikbild ().
Auf Trading View werden Fehlerberichte zusammengestellt. Auf FMZ sind die Einschränkungen nicht so streng, aber es wird empfohlen, die Regeln auf Trading View zu befolgen. Zum Beispiel ist es nicht empfohlen, so zu schreiben, obwohl es auf FMZ keine Fehlerberichte gibt.
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")