[TOC]
ビデオ・チュートリアル:取引の量化への入門は難しいですか? trading view Pine を使って小白からQuant 大神まで - Pine の言語初心者
発明者量化取引プラットフォームは,Pine言語の書き込みポリシーをサポートし,復習をサポートし,Pine言語のポリシーを実体盤で実行し,Pine言語の低バージョンに対応しています.FMZ.COM公開された戦略広場検索・移植の多くのPineの策略 (脚本) が含まれています.
FMZはPine言語だけでなく,Pine言語の強力な図面機能もサポートしています.FMZプラットフォームの機能,豊富な実用ツール,効率的な管理がPineのポリシー (スクリプト) の実用性をさらに強化しています.FMZはPine言語との互換性に基づいており,Pine言語にいくつかの拡張,最適化,カットも行っています.正式なチュートリアルに入る前に,FMZのPine言語と原版Pineの変更点を見てみましょう.
簡単に説明すると,最も顕著な違いは:
1 FMZのPine ポリシー,コードの初めのバージョン表示//@version
プログラムが始まってstrategy
、indicator
文言は書き込みを義務付けていません.FMZは一時的にサポートしていません.import
輸入するlibrary
機能はこちらです.
戦略のいくつかはこんな感じで書かれています.
//@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)
この記事へのトラックバック一覧です.
//@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)
FMZでは以下のように簡略化できます.
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)
イスラム教は,
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, 策略 (脚本) 取引に関連する設定は,FMZのポリシーインターフェイス上の"Pine Language Transaction Library"のパラメータによって設定されます.
閉店価格モデルとリアルタイム価格モデル
取引視野では,strategy
この関数は,calc_on_every_tick
パラグマーは,価格の変化ごとにリアルタイムで戦略ロジックを実行する戦略スクリプトを設定します.calc_on_every_tick
このパラメータは,true
│ │ │calc_on_every_tick
この式は,false
実行する. 実行する. 実行する.
FMZでは",Pine言語取引庫"のテンプレートのパラメータで設定します.
策略実行時の価格,下位単位量などの数値精度制御はFMZで指定する必要がある. トレーディングビューでは,模擬テストのみが可能であるため,実盤下注の精度の問題はない. FMZでは,実盤でPine戦略を実行できる.その場合,戦略が柔軟に取引品種の価格精度,下注数量精度を指定できる.これらの精度設定は,関連データの小数値を制御し,データが取引所の表記要求を満たさないので下注ができないことを防ぐ.
フューチャー契約コード
FMZにおける取引品種は,契約である場合,2つの属性がある. "取引対"と"契約コード"はそれぞれである.実盤と復習では,取引対を明確に設定するだけでなく",Pine Language Trade Library"テンプレートのパラメータ"種コード"に特定の契約コードを設定する必要がある.例えば,永続契約は記入される.swap
契約コードは,取引所がそのような契約を持っているかどうかを特定します.例えば,取引のすべての四半期契約は,ここで記入できます.quarter
■これらの契約コードは,FMZのJavaScript/python/c++言語API文書で定義されたフューチャー契約コードと一致する.
他の設定は,例えば,最小単位の量,デフォルト単位の量などについては,Pine 言語のドキュメントを参照してください."Pine Language Exchange Library (パイヌ言語取引データベース) "というサイトを立ち上げましたパラメータの紹介.
3、runtime.debug
、runtime.log
、runtime.error
FMZの拡張機能は,デビューに使用される.
FMZプラットフォームには3つの機能が追加されました.
runtime.debug
: コントロールで変数情報をプリントするには,この関数は一般的に使用できません.
runtime.log
:ログの内容の出力、FMZ PINE言語に特化した機能、
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: を呼び出すとき,実行時にエラーが発生し,メッセージパラメータで指定されたエラーメッセージを持ちます.
runtime.error(message)
4 図解関数の一部を拡張しましたoverlay
パラメータ
FMZのPine言語,図形関数plot
、plotshape
、plotchar
増えたのですoverlay
パラグマサポート,主図または副図で絵を指定することを許可します.overlay
設定するtrue
絵は主題に設定されています.false
副図で描画する. FMZ上のPineのポリシーが実行されているときに主題,副図を同時に描画する.
5、syminfo.mintick
内蔵変数の取值
syminfo.mintick
内置変数は,現在の品種の最小刻印値として定義される.リアルディスク/復習するインターフェース上の"Pine Language Trading Library"の模板パラメータの価格設定通貨精度は,この値を制御できます.価格設定通貨精度は,取引時に価格が小数点2まで精度で,このとき価格の最小変動単位は0.01です.syminfo.mintick
この値は 0.01 です.
6. FMZ PINE Script の平均価格は,手続費を含む価格です
例えば,下注の価格は8000,出荷方向,手数1枚,取引後の平均価格は8000ではなく,8000以下 (手数料は費用に含まれています).
パイン言語の基礎を学び始めたとき,いくつかの例の指示やコード文法について,私たちはあまり知らないかもしれません. 読み取れないことは問題ありません. 概念やテストの目的を理解するために,FMZのパイン言語のドキュメントを調べて説明をご覧ください. その後,教科書に順次順次順次従って,様々な文法,指示,関数,内置変数を徐々に習得します.
パイン言語のスクリプトの実行プロセスなどの関連概念を学ぶことは,パイン言語の学習初心者にとって非常に必要である. パイン言語の戦略は,グラフに基づいた実行であり,グラフ上で,グラフに既にロードされている最初のデータから,時間序列の先後の順序で実行される一連の計算と操作として理解される. グラフの初期ロード量は限られている. リアルタイムでは,このデータ量は通常,取引所インターフェイスから返されたデータ量に基づいて決定され,回測時のデータ量制限は,回測システムデータ源から提供されたデータに基づいて決定される. グラフの左端にある最初のKBar,すなわちグラフデータセットの最初のデータ,インデックス値は0である. パイン言語の内蔵変数は,bar_index
パインスクリプトの実行時に現在のK線Barのインデックス値を参照します.
plot(bar_index, "bar_index")
plot
この関数は,将来,私たちがもっと使う関数の一つになります. その使い方は簡単です. 参数によってグラフに線を描くことで,bar_index
線はbar_index
│ Barが右に増加すると1が増加する順番で,最初のBarの名前上のbar_indexと呼ばれる行の値が0であることがわかります.
策略の設定によって,策略のモデルの実行方法も異なります.收盘价模型
そして实时价模型
⇒ 閉店価格モデル,リアルタイム価格モデルの概念は,以前も簡単に紹介しました.
閉店価格モデル
策略コードが実行される時,現在のK線Barのサイクルが完全に実行され,K線が閉じる時,K線サイクルが終了する.このとき,Pine策略ロジックを再実行すると,触発された取引信号は次のK線Barの開始時に実行される.
リアルタイム価格モデル
戦略コードが実行される時,現在のK線Barが閉ざされても閉ざされなくても,市場変化ごとにPine戦略ロジックが繰り返され,触発された取引信号は即座に実行される.
パイン言語のポリシーは,グラフ上で左から右に実行すると,グラフ上のK線Barが分割されます.历史Bar
そして实时Bar
フォローしている:
歴史バー
"実価モデル"に設定された戦略が実行される時に,右端にあるK線Barを除くすべてのK線Barが,历史Bar
戦略的論理はあらゆる根源にある.历史Bar
実行は1回だけ.
グラフ上のすべてのBarは,BALの値が,BALの値が,BALの値が,BALの値が,BALの値が,BALの値が,BALの値が,BALの値が,BALの値が,历史Bar
戦略的論理はあらゆる根源にある.历史Bar
実行する場合は1回だけ.
計算は,歴史バーに基づいています: 策略コードは,歴史バーの閉じる状態で一度実行され,その後,すべての歴史バーが一度実行されるまで,次の歴史バーで実行され続ける.
リアルタイムバー
策略が右端の最後のK線Barに実行されたとき,BarはリアルタイムBarになります.リアルタイムバーが閉じると,このBarはリアルタイムバー (歴史バーに変わります).グラフの右端は新しいリアルタイムBarを生成します.
戦略設定は"リアルタイム価格モデル"で実行開始時に,リアルタイムバーで市場変化ごとに戦略論理が実行されます. 戦略設定は"閉じる価格モデル"で実行開始時に,チャートにリアルタイムBarが表示されない.
リアルタイムBarによる計算:
策略を"閉じる価格モデル"に設定すると,チャートはリアルタイムBarを表示しない場合,策略コードは現在のBarの閉じる時に1回しか実行されません.
戦略を"リアル価格モデル"に設定すると,リアルタイムバーの計算と歴史バーは全く異なる. リアルタイムバーでは,市場の変化ごとに戦略コードが実行されます. 例えば,内蔵変数.high
、low
、close
リアルタイムバーでは,市場が変化するたびにこれらの値が変化する可能性がある.したがって,これらの値に基づいて計算された指標などのデータもリアルタイムに変化する.close
価格が常に最新の価格を表しています.high
そしてlow
常に,現在のリアルバーの開始以来の最高高値と最低低値を表しています.これらの内蔵変数は,リアルバーが最後に更新された時の最終値を表しています.
リアルタイムバーで戦略を実行する時のリロールメカニズム (リアルタイム価格モデル): リアルタイムBarでは,実行前にユーザー定義された変数をリセットする毎回のリターニングをリロールと呼びます.リロールメカニズムを理解するために,以下のテストコードで例を挙げましょう.
警告:
/*backtest
...
..
.
*/
このパケットは,FMZプラットフォームでコードで保存されている回検配置情報です.
/*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")
リアルタイムで実行されるシーンだけを見て,not barstate.ishistory
表現の制限は,リアルタイム Bar のときのみ n 変数に対して加算し,加算操作を実行する前に使用する.runtime.log
機能はポリシーログに情報を出力する.plot
描かれた曲線nは,ポリシーが歴史Barで実行されているとき nが0であったことがわかります. リアルバーまで実行するとn加1の操作が引き起こされ,リアルバーで実行する毎回策略でn加1の操作が実行されます. ログ情報から,毎回策略コードを再実行するたびにnが前の策略Barが最終的に提出した値にリセットされていることが観察できます. リアルバーで実行した最後の策略コードが n値更新を提出しているとき,グラフはリアルバーから始まり,Barがタイムカーブnの値を1に増加するたびに曲線nが表示されていることがわかります.
概要はこうです: 1, ポリシーがリアルタイムBarで実行開始時に,行程更新ごとに 1 つのポリシーコードを実行します. 2, リアルタイムバーで実行すると,ポリシーのコードを実行するたびに変数をロールバックします. 3、リアルタイムBarで実行すると,変数は閉盘更新時に1回提出される.
データが回転しているため,グラフ上の曲線などのグラフ操作も再描写を引き起こす可能性があります. 例えば,テストコードを修正して,
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")
Aの瞬間のスクリーンショット
Bの瞬間の画面
この文章は,この記事の記事の記事です.n := open > close ? n + 1 : n
現時点のリアルタイムBarはシグナル (つまり開盤価格が閉盤価格より高い) のときのみn+1を与えます. 第1図 (とき A) では,開盤価格が閉盤価格より高いのでn+1が加えられ,グラフ曲線nが表示される値は5です. その後,行情の変化,価格更新が2図 (とき B) のように表示されます. このとき開盤価格が閉盤価格より低いとき (とき B) はn回転し,1も加算されません. グラフの曲線nも即座に再描画され,このとき曲線上のnは4です. したがって,リアルタイムBarで表示される金
関数内の変数は文脈
以下は,Pine 言語の関数内の変数を一緒に研究します. いくつかのPine チュートリアルで説明されているように,関数内の変数は,関数外の変数と以下のように異なります.
パイン関数で使用される一連の変数の歴史は,関数に対する毎回の連続的な呼び出しによって作成される. スクリプトが実行される各列に関数を呼び出さない場合,関数の本位と外部列の歴史値の間に差が生じる.したがって,各列に関数を呼び出さない場合,関数の内部と外部に同じインデックス値を参照する列は同じ歴史点を参照しない.
FMZで実行されるテストコードで,この問題を解くことができます.
/*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)
復習実行スクリーンショット
テストコードは比較的シンプルで,主に2つの方法で引用されたデータを調べます.f(a) => a[1]
そしてf2() => close[1]
。
f(a) => a[1]
函数が最後に返ってくるようにします.a[1]
。
f2() => close[1]
組み込み変数を直接使用します.close
この関数には,close[1]
。
[]
符号は,データシリーズ変数の歴史値への引用操作,close[1]で,現在の閉じる価格の前の一つのBarの閉じる価格データを参照します.私たちのテストコードは,合計4つのデータをグラフに描きます:
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
文字f(close)
返される値は,
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
文字 B を描き,緑色で描き,oneBarInTwo が真であるときのみ描き,描いた位置 (Y 軸上) は:f2()
返される値は,
plot(close[2], title = "close[2]", color = color.red, overlay = true)
線は赤で,Y軸の位置は:close[2]
Bar の前列の2番目 (左に2番目) の Bar の閉じる価格である.
plot(close[1], title = "close[1]", color = color.green, overlay = true)
線は緑色で,Y軸の位置は以下のとおりです.close[1]
Bar の前列の1つ (左に1つ) の Bar の閉じる価格である.
実行するスクリーンショットは,図 A で表示される関数を使用しているものの,図 A で表示されるf(a) => a[1]
図 B に表示される関数f2() => close[1]
グラフ上の"A"と"B"のマーク位置はまったく異なる. "A"のマーク位置は常に赤い線に落下する.plot(close[2], title = "close[2]", color = color.red, overlay = true)
線が描かれると,その線がclose[2]
。
線Barのインデックス,つまり内置変数です.bar_index
"A"と"B"のマークを塗るかどうかを計算する. "A"と"B"のマークは,各K線Barにグラフを描くのではなく,グラフを描くときに関数計算を呼ぶ.f(a) => a[1]
この方法で引用される値は,関数がすべてのBarで呼び出されていない場合,関数と一致します.f2() => close[1]
この方法では,引用値が同じではない (たとえ同じインデックスが使用されている場合でも,例えば[1]).
ある内蔵関数は,その結果を正しく計算するには,各Barで計算する必要があります.
この例は,この国の経済状況について説明します.
res = close > close[1] ? ta.barssince(close < close[1]) : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
この関数には,ta.barssince(close < close[1])
文字列の文字列を書き換えるcondition ? value1 : value2
メディアの報道によると,close > close[1]
时去调用ta.barssince函数。可偏偏ta.barssince
この関数は,この関数からclose < close[1]
作成時にK行の数.ta.barssince関数は close > close を呼び出すとき[1],つまり,現在の収束価格が前回のBarの収束価格よりも大きい.ta.barssince関数は, Close < close [1] を呼び出すとき,条件が成立せず,最近成立した位置も存在しない.
ta.barssince: 呼び出すとき,現在のK行以前にこの条件が満たされていない場合,この関数は na を返します.
フォトグラフ:
変数resが値を持つときのデータしか描かれない.
この問題を解消するために,ta.barssince(close < close[1])
函数呼び出しは,三元操作から取り出して,可能な条件のいずれかの分岐外に書き込む.これは,すべてのK線Barで計算を行うようにする.
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)
タイムシーケンスという概念は,Pine 言語で非常に重要であり,Pine 言語を学ぶときに理解しなければならない概念である.タイムシーケンスとは,種類ではなく,時間とともに保存される変数の連続値の基本的な構造である.Pine スクリプトはグラフに基づいていることを知っている.グラフで示される最も基本的なものは,K 線図である.open
パイン言語の内蔵変数である.その構造は,各K線Barの開盤価格の時間列を保存するものである.open
この時間配列構造は,現在のK文字列の最初のBarから,現在のスクリプトが実行されるこのBarまでのすべてのK文字列の開示値を表します. もし現在のK文字列が5分周期である場合,我々はPine策略コードで引用 (または使用) します.open
time は,策略コードを使用して現在実行されている時にK線Barの開示値である.[]
オペレーター、Pine ポリシーが K 線Bar で実行される時,使用する.open[1]
引用表示open
このK線Barの前のK線Barの開場価格 (つまり,前回のK線周期の開場価格) は,現在のスクリプトが実行している時間列です.
計算に便利です.
この関数は,ta.cum
例えば:
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
テストコード:
v1 = 1
v2 = ta.cum(v1)
plot(v1, title="v1")
plot(v2, title="v2")
plot(bar_index+1, title="bar_index")
似たようなことがたくさんありますta.cum
このような内蔵関数は,時間配列上のデータを直接処理することができます.ta.cum
伝達された変数の値が各K線Barに合致する値を加算します. 次に,理解を助けるグラフを使用します.
戦略の実行プロセス | 変数 bar_index を表示する | v1 | v2 |
---|---|---|---|
戦略は1番目のK線Barで実行されます. | 0 | 1 | 1 |
戦略は2番目のK線Barで実行されます. | 1 | 1 | 2 |
戦略は3番目のK線Barで実行されます. | 2 | 1 | 3 |
… | … | … | … |
戦略はN+1番目のK線Barで実行されます. | N | 1 | N+1 |
v1,v2,そしてbar_indexは,実際には各Barに対応するデータを持つ時間序列構造である.このテストコードは",リアルタイム価格モデル"と"閉値モデル"を区別するだけでなく,チャート上でリアルタイムBarを表示するかどうかによって区別する.回転速度を測るために",閉値モデル"回転テストを使用する.
変数v1は1で,この変数v1は1で,この変数v1は1です.ta.cum(v1)
函数が最初のK線Barで実行されたとき,最初のBarのみがあるため,計算結果は1,変数v2を代入します.
どこにいるのかta.cum(v1)
2番目のK線Barで実行すると,既に2つのK線Barがある (最初の対応する内置変数bar_indexは0で,第2の対応する内置変数bar_indexは1) のため,計算結果は2で,変数v2に代入される.bar_index
この式は,この式を0から始めると,bar_index + 1
線を観察するグラフでも線が見えます.v2
そしてbar_index
コンピュータの使い方についてta.cum
このグラフのすべてのBarの閉じる価格の合計を計算する内蔵関数は,以下のように書くことができます.ta.cum(close)
実行するときに,右端のリアルタイムバーta.cum(close)
計算の結果は,グラフ上のすべてのBarの閉じる価格の和である (右端まで走らないとき,ただ現在のBarに足すだけです).
タイムシーケンス上の変数は,オペレータを使用して処理することもできます.例えばコード:ta.sma(high - low, 14)
変数から変数に変換します.high
低価格で購入したものですlow
(K線Bar 最低価格) 最後の使用ta.sma
平均値を求めます.
呼び出しの結果は,時間列に値の痕跡を残します.
v1 = ta.highest(high, 10)[1]
v2 = ta.highest(high[1], 10)
plot(v1, title="v1", overlay=true)
plot(v2, title="v2", overlay=true)
このテストコードは,リトースター時にテストを実行し,v1
そしてv2
値が同じで,グラフに描かれた線も完全に重複している. 函数呼び出しで計算された結果は,時間列に値の痕跡を残します. 例えば,コードta.highest(high, 10)[1]
その中の一つはta.highest(high, 10)
函数呼び出しで計算された結果は,また,現在のBarの前のBarに対応した値に基づいて,その歴史値を参照するために使用できます.ta.highest(high, 10)
計算の結果はta.highest(high[1], 10)
│ だからta.highest(high[1], 10)
そしてta.highest(high, 10)[1]
完全に等価である.
別の図形関数で情報を入力します.
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)
時間の連続で変数 a と変数 b の値が対応する Bar の上下に表示されているのが見えます. この図形コードは,テストや実験の際に,しばしば観察するためにグラフに情報を出力する必要がある可能性があるため,学習中に保持できます.
このチュートリアルの開始部分では,FMZのPineとTrading ViewのPine言語の使用の違いをまとめました.indicator()
、strategy()
支持していない.library()
もちろん,Pineの初期のバージョンとの互換性のために,策略は以下のように記述されます.//@version=5
,indicator()
,strategy()
策略設定は,このページでご利用いただけます.strategy()
函数内のパラメータ設定を入力します.
<version>
<declaration_statement>
<code>
<version>
バージョン制御情報は省略できます.
パイン語//
単行本として,Pine言語には複数行本がないため,FMZは解説符を拡張した./**/
複数の行の注釈に使われる.
スクリプト内の注釈やコンパイルヤー命令以外の行は,スクリプトのアルゴリズムを実装する文である. 文はそれらのいずれかである.
if
,for
,while
あるいはswitch
等式構造文は様々な方法で並べられます
空格
あるいは制表符
(タブキー) 開始.それらの最初の文字も行の最初の文字でなければならない.行の最初の位置から始まる行は,定義によってスクリプトの全域の一部である.local block
〔ローカルブロックは,表記符または4つの空間に収縮しなければならない (そうでなければ,前行のシリアルコードとして解析される.つまり,前行のコードの連続的な内容であると判断される) 〕各ローカルブロックは異なるローカル範囲を定義する.例えば,三つの局所からなる,一つはカスタム関数宣言で,二つは変数宣言でif構造を使用する,以下のコード:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
長い行は複数の行に分けられる,または"包み込む"ことができる.包み込まれた行は,4の倍数でない限り,任意の数の空間に収縮しなければならない (これらの境界は局所を収縮するために使用される).
a = open + high + low + close
文字列は4の倍数ではなく,各行に縮小されたスペースの数に注意してください.
a = open +
high +
low +
close
長いプロット (plot) の呼び出しは,パッケージ化できます.
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)
ユーザー定義された関数宣言内の文言も包み込むことができる.しかし,局所が文法的に縮小で始まる (四つのスペースまたは一つの表記符) のために,次の行に分割すると,文言の続続は"つ以上の縮小で始まる (四つのスペースの倍数に等しくない) "である.例えば:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
変数を認識する前に,まずは
(A-Z)
字幕を押して(a-z)
文字や下線(_)
標識の最初の文字である.例えば,以下のような名称の識別子:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
多くのプログラミング言語と同様に,Pineには書き込みの提案もあります.通常,識別子の命名には以下のような提案があります.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
オペレーターとは,プログラミング言語で表現を構成するために使用されるいくつかの操作符号であり,表現は,私たちが策略を書いているとき,何らかの計算目的のために設計された計算規則である.
配分演算子,計算演算子,比較演算子,論理演算子,? :
この3つの要素は,[]
歴史引用演算子、
算数の演算子*
たとえば,Trading ViewでPine言語演算子が返した結果を生むタイプの問題から区別して,以下のテストコードがあります:
//@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)
このスクリプトを実行すると,Trading Viewでエラーが表示されます.adjustedLength = lenInput * factor
掛け算は,series int
タイプ ((シリーズ),しかしta.ema
関数の第2パラグラムは,このタイプをサポートしない.しかし,FMZではそのような厳しい制限はありません.上記のコードは正常に動作できます.
異なる演算子の使い方については,以下に一緒に見ていきましょう.
配分演算子は2種類あります.=
、:=
このトークの初めの部分で,いくつかの例を見ました.
=
オペレータは,変数への初期化または宣言時に割り当てられる.=
初期化,宣言赋值後の変数は,その後の各Barでこの値から始まる. これらは有効な変数宣言である:
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)
気を付けてa = close
付与式では,各Barの変数 a は,そのBarの現在の閉じる値である.他の変数である.b
、c
、d
FMZの回測システムでテストできる.結果が図から見える.
:=
既存の変数に値を再割り当てするために使用されます.:=
オペレーターは,既に宣言された,初期化された変数の値を修正するために使用されます.
使用されている場合:=
初期化されていないまたは宣言されていない変数の割り当てに操作がエラーを起こす場合,例えば:
a := 0
メディアは,:=
赋值演算子は,一般的に,既にある変数の再赋值に使用される.例えば:
a = close > open
b = 0
if a
b := b + 1
plot(b)
判断するclose > open
変数 a は true です. if 文のローカルブロック内のコードを実行します.b := b + 1
割り当て操作を使用します.:=
b に対して値を再指定し,1 を加える. そして, plot 関数を使用して,時間列の各BARの値に変数 b を線形に図を描く.
陽線BARが表示され,bが1を継続的に加算すると考えますか? もちろんそうではありません. ここで変数bを宣言します.b=0
このコードの実行結果は,aが真値である場合,bを0にリセットする毎回です. aが真値である場合,aが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,bが真値である場合,close > open
この回実行するときにbは1,plot関数図を描くときにbが1になるが,次の実行時にbが0に再割り当てられる. これはまた,Pine言語初心者にとって容易な穴である.
この2つのキーワードの説明を広げなければなりません.var
、varip
ワール
このキーワードは,以前にも見かけ,使ったことがあるのですが,その頃は詳しく説明されていませんでした.
var は,変数を割り当てたり,一度に初期化したりするキーワードである.通常,キーワード var を含まない変数の赋值文法は,データを更新するたびに変数の値を覆う結果になる.逆に,キーワード var を使った変数を割り当てると,データが更新されたにもかかわらず,それらは状態を保持することができる.
この例では,bの値が bに代入される場合,var
キーワードは♪
a = close > open
var b = 0
if a
b := b + 1
plot(b)
var
キーワードは,b 変数が最初の割り当てのみを実行し,その後,戦略論理を実行するたびに b を 0 に再設定しないようにする.したがって,実行時に描かれた線から,b が現在の K 線 BAR に現れた陽線 BAR の数値を復元することを観察することができる.
var 宣言の変数は,グローバルに書き込むだけでなく,コードブロックに書き込むこともできます.
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")
変数
変数
varip
このキーワードを初めて見たとき,このキーワードの記述を見てみましょう.
varp (varip intrabar persist) は,変数を割り当てたり,一度に初期化したりするキーワードである.これはvarキーワードと似ているが,varip宣言を用いた変数は,リアルタイムでK行更新の間に値を保持する.
簡単な例で説明すれば,分かりやすくなります.
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
このテストコードは"閉じる価格モデル"や"リアルタイム価格モデル"で異なる表現をしています.
リアルタイム価格モデル:
リアルタイムの価格モデルでは,Kラインの歴史の段階では,var
、varip
声明の変数i
、ii
策略コードの実行回ごとに増幅操作が実行される.したがって,回帰結果のK線BARに表示される数字はそれぞれ1ずつ増幅されていることがわかります. 歴史のK線段階が終了し,リアルタイムK線段階が開始されると,var,varip宣言の変数は異なる変化が起こります.i := i + 1
そしてii := ii + 1
i は次の実行回でも変更されますが,次の実行回でも変更されます (前回の"モデル実行"章で説明した回転メカニズムを覚えていますか?),現在のK線BARが更新されるまでiの値が決定されません (つまり,次の実行回でも変更されません).したがって,変数iは依然としてBARごとに1を増加させています.しかし,変数iiはBARごとに数回加算されます.
閉店価格モデル: 収束価格モデルは,BARが1K線で走るたびに実行される戦略論理である.したがって,収束価格モデルでは,歴史的なK線段階とリアルタイムK線段階では,var,varip宣言の変数は上記の例で完全一致し,BARが1K線ごとに増加する.
演算子 | 解説 |
---|---|
+ | ガーファ |
- | 減法 |
* | 掛け算 |
/ | 例外 |
% | 模倣 |
+
、-
オペレーターはバイナリーオペレーターとしても,元オペレーターとしても使用できます.他の算術オペレーターは二進法のみで,元オペレーターとして使用するとエラーを返します.
1,算数演算子の両側には数値型があり,結果として数値型,整数型または浮点数となる.
文字列の操作数がある場合,操作者は+
計算の結果は文字列で,数字は文字列形式に変換され,文字列が拼接されます.他の算数演算子であれば,文字列を数字に変換し,操作します.
3、そのうちの操作数が na である場合,計算結果は空値 na で,FMZで印刷するときに NaN を表示します.
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
FMZのPine言語は,Trading ViewのPine言語と少し違います.
a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A"
plot(a)
plot(b)
plot(c)
FMZでは実行できますが,トレードビューではタイプエラーを表示します. 算数演算子の両側が文字列である場合,システムは文字列を数値に変換して計算します. 非数値文字列が計算できない場合,システム演算結果は空値naです.
比較演算子は二元演算子である.
演算子 | 解説 |
---|---|
< | より小さい |
> | 大きかった |
<= | これは,x+2です. |
>= | これは, |
== | 同じように |
!= | 格差 |
テスト例:
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
比較演算子は簡単です. しかし,この演算子は,私たちが策略を書くときに最も多く使うものです. 数値と内置変数を比較することができます.close
、open
ほら.
操作操作符と同様に,FMZではTrading ViewのPineとは異なり,FMZには特に厳格な要求型がありません.d = "1" >= 2
FMZではエラーが返されない.実行時に文字を数値に変換し,比較操作を行う.
演算子 | コードマーク | 解説 |
---|---|---|
できない | ない | 単元操作符,非操作 |
そして | そして | 双進演算子,と () を操作する |
あるいは | または | バイナリーオペレータ,または演算 |
論理演算子について言えば,真値表について話す必要があります. 高校で習ったように,ただ,ここでテストを行います.
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")
検知システムで常に印刷された情報が観測に影響を及ぼすのを防ぐためにruntime.error("stop")
文句は,一回プリントを実行した後,異常なエラーを投げて復習を停止させ,その後,出力された情報を観察し,印刷された内容と真値表が実際には同じであることを確認することができます.
3つの演算子を使用する? :
操作数と組み合わせた三元式condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
この式は,3つの関数で成り立っています.この式は,3つの関数で成り立っています.
condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
中央部condition
この式は,条件を判断するものです.valueWhenConditionIsTrue
│ もしcondition
この式は,valueWhenConditionIsFalse
。
この例は,実際に使えていないが,簡単に示せる例です.
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)
交差点に遭遇するとどうするかは問題ありません.三元式も嵌入できます.
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)
文字通り,この問題を解くのです.condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
中身valueWhenConditionIsTrue
、valueWhenConditionIsFalse
この式は,他の三元式も使います.
履歴演算子を使用する[]
,引用時間列の歴史値. これらの歴史値は,スクリプトが実行される時に現在のK線BARの前にK線BAR上の変数の値である.[]
変数,式,関数への呼び出しの後には操作符が用いられる.[]
この括弧の数字は,引用する歴史的なデータから現在のK線BARの距離の偏差値です.例えば,前回のK線BARの閉じる価格を引用すると,close[1]
。
この文字は,この文字の表記に似ています.
high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)
[]
この式は,この式で書き換えられる.この式は,この式で書き換えられる.
a = close[1][2] // 错误
操作者は,この操作の実行を表示します.[]
列の構造は,列と数列の構造に似ています.
この例では,Pine言語の行列と配列の違いを説明します.
strategy("test", overlay=true)
a = close
b = close[1]
c = b[1]
plot(a, title="a")
plot(b, title="b")
plot(c, title="c")
言うまでもなくa = close[1][2]
この記事へのトラックバック一覧です.
b = close[1]
c = b[1]
解き放たれた文字は間違えることはありません.b = close[1]
値 b は b よりも大きいです.c = b[1]
b はまだ歴史操作で歴史値への引用ができます. わかるように,Pine のseries の概念は行列ほど単純ではありません. 前のBar の歴史値が,b に代入された close として理解できる. b はまた,時間系列構造であり,その歴史値への引用が続けられます. そこで,描かれた3つの線 a,b,c の間で,b 線は a 線の 1 BAR,c 線は b 線の 1 BAR,c 線は a 線の 2 BARよりも遅い.
グラフを左に引っ張って,最初のK行に b と c の値が空値であることに注意することができます. それは,スクリプトが最初のK行 BAR で実行されるときに,前向きに引用する1つの,または2つの周期の歴史値が存在しないからです. だから,戦略を書くときに,私たちは頻繁に注意する必要があります.na
、nz
この関数は,この関数と関数の両方をnz
、na
空白値について具体的に扱っている例は,例えば:
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
これは,空値 ((na) に参照する可能性がある処理である.
パイン言語の操作符は,様々な組み合わせと操作数の組み合わせによって表記を形成する. 計算する際の優先順位は? 学校で習った4つの式と同じで,掛け算が優先順位で,掛け算が優先順位で,減算が優先順位で. パイン言語の表記も同じです.
優先順位 | 演算子 |
---|---|
9 | [] |
8 | 単元演算子では,+ 、- そしてnot |
7 | * 、/ 、% |
6 | バイナリー演算子では+ 、- |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
優先度が高い表現の部分は最初に処理され,優先度が同じ場合は左から右に処理される. 強制的に一部を最初に処理する場合は使用できます.()
この部分式は,この部分式を最初に処理することを強制する式に包まれています.
変数の名前として変数に名前を付ける. だから,変数は保存値の識別子です. では,変数を宣言するにはどうすればいいですか? 変数を宣言するルールは何ですか?
声明形式:
変数を宣言する際に最初に書くのは"宣言モード"です.変数の宣言モードには3つの種類があります.
1 キーワードを使用するvar
│ │ │
2 キーワードを使用するvarip
│ │
3 何も書いてない.
var
、varip
変数の宣言パターンが何も書いていない場合,例えば文:i = 1
変数と赋值は,すべてのK線BARで実行されます.
タイプ FMZのPine言語は,型要求に厳格ではないが,一般的に省略できる.しかし,Trading Viewのスクリプトポリシーに適合するため,変数を宣言するときに型を持つこともできる.例えば:
int i = 0
float f = 1.1
トレーディングビューのタイプはより厳格で,以下のコードを使用するとエラーが返されます.
baseLine0 = na // compile time error!
アイデンティティ 識別子とは,変数の名前であり,識別子の命名は,前章で述べた通り,振り返ることができます.https://www.fmz.com/bbs-topic/9390#标识符
変数を定義すると,
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
配分演算子を使用します.=
変数を宣言する際に変数に代入する.代入すると,値は文字列,数値,表現,関数呼び出し,if
、 for
、while
あるいはswitch
構造 (この構造のキーワードや文法については,次のレッスンで詳しく説明します. 実際,前回のレッスンでは,簡単なif文の赋值について学びました.
ここで注目しているのは,インプット関数です. この関数は,私たちが策略を設計するときに頻繁に使う関数です.
input 関数: 入力関数:
input函数,参数defval、title、tooltip、inline、group
FMZの入力関数は,Trading Viewの入力関数とは少し異なりますが,この関数は戦略パラメータの指定入力として使用されます.以下は,FMZの入力関数の使用を例で詳細に説明します:
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)
変数を宣言する際に変数赋值に通常使用されるのは,input関数である.FMZ上のinput関数は,FMZのポリシーインターフェイスで,ポリシーパラメータを設定するためのコントロールを自動的に描画する.FMZでサポートされているコントローラは,現在数値入力ボックス,テキスト入力ボックス,ドラッグボックス,ブル値チェックなどがあります.また,ポリシーパラメータを分割,パラメータを設定する提示テキスト情報などの機能を設定することができます.
インタラクティブの関数について説明します
単一の変数宣言,赋值に加えて,Pineには変数集合宣言と赋值の書き方もあります:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
言語の多様性やta.macd
函数が MACD 指標を計算するとき,MACD 指標は多行指標であるため,三つのデータセットを計算します.
[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)
上記のコードを使ってMACDグラフを描くのは簡単です. 組み込み関数で複数の変数を返すだけでなく,書き込みされたカスタム関数で複数のデータを返すこともできます.
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)
ifのような構造を複数の変数に代入する記述は,上記のカスタム関数と類似しており,試してみることも興味があります.
[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)
いくつかの関数は条件ブランチに記述できない本来のコードブロックに含まれています.
バークローラ (barcolor)) 記号 (fill)) 線 (hline)) 指示 (indicator)) 図 (plot)) 図 (candle)) 図表 (plotchar)) 図形 (plotshape))
Trading Viewではエラー報告をまとめます.FMZでは制限がそれほど厳しくありませんが,Trading Viewの記述規範に従うこともお勧めします.例えば,FMZではエラー報告はしませんが,このように書くことはお勧めしません.
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")