[TOC]
パインのコードは次のとおりです.
<version>
<declaration_statement>
<code>
注記 FMZのパイヌ語がサポートする記号:単行メモ//
複数行メモ/* */
,次の例のノート方法のように:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // calculate the MACD indicator
/*
The plot function draws the indicator line on the chart
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
次の形式のコンパイラ指示は,スクリプトが書かれたPineのバージョンをコンパイラに伝えている.
//@version=5
V5バージョンは,コードから省略することができます.//@version=5
.
indicator()
strategy()
宣言文はスクリプトの種類を決定し,スクリプトは,その中で何が許容され,どのように使用され,実行されるかを決定する.スクリプトのキープロパティを設定する.例えば,その名前,チャートに追加されたときに表示される場所,その表示する数値の精度とフォーマット,実行時の動作を制御する特定の数値,例えば,チャートに表示される最大数の描画オブジェクトなど.戦略では,属性には,初期資本,手数料,滑りなど,バックテストを制御する引数が含まれます.indicator()
またはstrategy()
申告はFMZのパインの戦略コードに含まれなければならない.
コメントやコンパイラ命令ではないスクリプトの行,スクリプトのアルゴリズムを実装するステートメントです.ステートメントはこれらのコンテンツの1つかもしれません.
if
, for
, while
またはswitch
他のコンストラクション申告は様々な方法で整理できます.
space
またはtab
(タブキー). その最初の文字は,行の最初の文字でなければならない. 行の最初の位置から始まる文字は,定義上,スクリプトのグローバル範囲の一部である.local block
構造または多行関数宣言には常に必要である.ローカルブロックは1つのタブまたは4つの空白で引入されなければならない (そうでなければ,それは前のコード行の連続的な内容であると決定される前の行の連鎖コードとして解析される) そして各ローカルブロックは異なるローカル範囲を定義する.例えば,if 構造を用いて,カスタム関数宣言に1つ,変数宣言に2つ,ローカルブロックを3つ,以下のように追加します.
indicator("", "", true) // Declaration statement (global scope), can be omitted
barIsUp() => // Function declaration (global scope)
close > open // Local block (local scope)
plotColor = if barIsUp() // Variable declaration (global scope)
color.green // Local block (local scope)
else
color.red // Local block (local scope)
runtime.log("color", color = plotColor) // Call a built-in function to output the log (global scope)
長い線は複数の線に分けられる.また,
a = open + high + low + close
包装できる (一行ごとに引入されたスペースの数が4の倍数ではないことに注意してください):
a = open +
high +
low +
close
長いプロット ((() 呼び出しは,次のように包み込むことができます:
close1 = request.security(syminfo.tickerid, "D", close) // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close) // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100), // Line-long plot() calls can be wrapped
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
ユーザー定義関数宣言のステートメントも包み込むことができます.しかし,ローカルブロックは文法的に引数 (4スペースまたは1タブ) で開始されなければならないため,次の行に分割すると,ステートメントの継続は1引数以上 (4つのスペース倍数に等しくない) で開始する必要があります.例えば:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
タイムシリーズとはデータ型または形式ではなく,PINE言語における基本的な構造の概念である. 時間の経過とともに変化する値を保存するために使用され,各値は時間の特定の時点に対応する. タイムシリーズという概念の構造は,時間の経過とともに変化する一連のデータを処理し記録するのに適している.
組み込み変数をopen
例えば,open
この変数で表示される場合,この変数で表示される値は,open
この数字は 5 分間の int 表現周期データです.open
戦略プログラムが実行されているとき,この変数は,すべての5分間のint表現 BAR (bar) の開示価格を記録します.open
前の値 (過去値) を参照するために,時間列で,我々は[]
特定のint表現 BAR で実行される場合,open[1]
この意味は,現在のint表現BARの前のint表現BARの開示価格を参照することです.
しかし...時間列PINE言語にも配列タイプがあります. しかし,それと時間列は全く異なる概念です.
戦略コードの閉じる価格の累積値を簡単に計算することができます. ループ構造を使用する必要はありません. 機能のみは, 鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵の鍵ta.cum(close)
別の例では,最後の 14 int 表現 BAR の最高価格と最低価格の差の平均値を計算する必要があります (つまり,コードが実行される現在の瞬間に最も近い 14 int 表現 BAR).ta.sma(high - low, 14)
また,この関数も,時間系列に痕跡を残します.[]
過去の値を参照する履歴演算子.例えば,現在のint表現 BARの閉値が,最後の10のint表現 BAR (現在のint表現 BARを除く) の最高価格の最大値を超えているかどうかをテストするとき.breach = close > ta.highest(close, 10)[1]
書き換えることもできます.breach = close > ta.highest(close[1], 10)
それで...ta.highest(close, 10)[1]
そしてta.highest(close[1], 10)
相当する.
これは次のコードで確認できます.
strategy("test pine", "test", true)
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)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)
上記のテストコードは,対応する時間系列の各 BAR の a と b の値を出力します. a と b の値は常に等しいので,この2つの表現方法が等価であることがわかります.
PINE 戦略の組み込みテンプレート
Pricing Currency Precision
この引数とこの引数.例えば,価格設定通貨精度は2に設定され,これは2番目の小数点まで正確で,精度は0.01です.その後,スリップポイントの各点は0.01の価格単位を表します.この時点で,スリップポイントは5に設定され,オーダーを出すときのスリップは0.05です (スリップは,オーダーを出すときに溢れる価格の一部を指します.SetMaxBarLen
についてjavascript
srategy.strategy(title = "open long example", pyramiding = 3) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price
strategy(title = "close long example", pyramiding = 2) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // To close a position, specify to close 80% of the positions whose group label is long2
PINE言語のポジションメカニズムは,一方向ポジションに似ている.例えば,ロングポジション (ロングポジション) でポジションを保持する際に,セール・オペレーション,計画されたオーダーなど (ポジションの反対方向) が存在する場合,実行が起動し,ロングポジションは最初に閉鎖される. (すべてのロングポジションを閉じ),その後トリガーされたオーダー (閉じる前のポジションに比べて反対方向) を実行する.
注文の配置コマンドを使用して注文を出すとき,価格が指定されていない場合,デフォルトはマーケットオーダーです. 市場オーダーに加えて,注文を出すために直ちに動作しない計画オーダーを通じて注文することもできます. 計画オーダーは,起動していないときにプログラムの計画オーダーキューに存在し, 状態情報 (つまり,戦略が実行されているときのステータスバー) の"計画オーダー"テーブルタブで見ることができます.リアルオーダー/バックテスト. システムは,リアルタイム市場価格がこれらの計画された注文を誘発するための条件を満たす場合にのみ注文をします. したがって,これらの注文が取引価格にわずかな偏差を持つことは正常です.strategy.entry
指定することができます. この関数で,limit
, stop
arguments.
var isTrade = false
if not barstate.ishistory and not isTrade
isTrade := true
strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order") // stop
strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order") // limit
strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order") // stop-limit
制限順序
注文の制限価格を設定します.direction
議論はstrategy.long
価格がこの価格を下回る場合にのみ実行されます.
注文が販売命令である場合 (つまり,direction
議論はstrategy.short
) の場合,現在の市場価格がこの価格より高くなる場合にのみ,オーダーが発動されます.
停止命令
注文のストップ・ロスの価格を設定します.注文が買い注文の場合,現在の市場価格がこの価格より高い場合にのみ注文が起動されます. オーダーが売却オーダーである場合,現在の市場価格がその価格を下回る場合にのみ,オーダーが起動されます.
停止制限命令
についてlimit
そしてstop
条件を最初に満たす価格で発動します.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// If the moving average crossover condition is met, buy or sell
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
指定した後にdefault_qty_type=strategy.percent_of_equity
セットdefault_qty_value
%の金額 (0~100), 1 は 1% を意味します. 注文量は,口座にある通貨の金額に応じて計算されます. たとえば: 経理口座に1万USDTがある場合,1%の注文を設定することは,100USDTのスケール (販売時の現在の価格に基づいて計算される) で注文を表示することを意味します.
var は変数の割り当てと一度の初期化に使用されるキーワードです.
一般的に,キーワード var を含まない変数割り当て文法は,データが更新されるたびに変数
var variable_name = expression
解説:
variable_name
- パインスクリプトで許容されるユーザ変数の名前 (大文字や小文字のラテン文字,数字,下記文字 (_) を含むが,数字から始まることはできない)expression
正常変数を定義するのと同じです. 変数に1回だけ割り当てられます.例
// Var keyword example
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")
変数
FMZでは,リアルタイム価格モデルと閉値モデルに分かれています.var
そしてvarip
.
strategy("test pine", "test 1", true)
// Test var varip
var i = 0
varip ii = 0
// Print the i and ii changed in each round of the strategy logic on the graph
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)
// Each round of logic execution increments i and ii by 1
if true
i := i + 1
ii := ii + 1
リアルタイム価格モデル
上記のテストコードは2つの段階で実行されます. 1. 過去のint表示段階. 2. リアルタイムのint表示段階. リアルタイムの価格モデルでは, 過去のint表示段階では,var
, varip
戦略コード実行の各ラウンドで段階的に実行されます (なぜならif true
テスト結果の int 表現 BAR に表示される数字が 1 ずつ増やされていることが見られます. 過去の int 表現段階が終了すると,リアルタイム int 表現段階が始まります.var
, varip
リアルタイム価格モデルであるため,戦略コードは int 表現 BAR の各価格変化に対して一度実行されます.i := i + 1
そしてii := ii + 1
i は次のラウンドで戦略論理を実行すると,前の値が復元され,現在のint表現 BAR が完了するまで i の値が更新されない (つまり,戦略論理が次のラウンドで実行される時,以前の値が復元されない).したがって,変数 i は,毎回 BAR に対して 1 倍増加していることが見られます.しかし変数 ii は毎回 BAR に対して数回累積されます.
閉じる価格モデル
終了価格モデルでは,戦略ロジックは int 表現 BAR に 1 回だけ実行されます.var
そしてvarip
上記の例では,過去Int表示の段階とリアルタイムInt表示の段階の両方で,閉じる価格モデルでは,インクリメント的にまったく同じ振る舞いをしており,Int表示BARごとに1増します.
varp (var intrabar persist) は,変数の割り当ておよび一度の初期化に使用されるキーワードである.varキーワードに似ているが,varpで宣言された変数は,ライブキャンドルスタック更新の間にはその値を保持する.
varip variable_name = expression
解説:
variable_name
- パイン文字で許容されるユーザ変数の名前 (大文字と小文字のラテン文字,数字,下記文字 (_) を含むが,数字から始まることはできない).expression
規則変数を定義する時間のような算術表現です.最初のK線バーでは,この式が評価され,変数に1回だけ割り当てられます.例
// varip
varip int v = -1
v := v + 1
plot(v)
var を使用すると,プロットは bar_index の値を返します. varip では,歴史的なバーでも同じ動作が起こりますが,ライブバーでは,チャートは各ティックで1個増加する値を返します.
コメントfloat,int, bool,string,これらのタイプの配列などのシンプルなタイプでのみ使用できます.
式が bool 変数を使用すると計算できる値です比較または論理的だ operator.
コメント詳細については,比較事業者及び論理的だ Operators.
ほかにも参照
bool
ボール変数の値と比較演算と論理演算の結果を表します.
コメント詳細については,比較事業者及び論理的だ Operators.
ほかにも参照
bool
If文は,表現の条件が満たされたときに実行されなければならない文のブロックを定義する.Pine スクリプト言語のバージョン4では,
ユニバーサルコード:
var_declarationX = if condition
var_decl_then0
var_decl_then1
...
var_decl_thenN
return_expression_then
else if [optional block]
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
else
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
コメント
var_declarationX
- この変数は if 文の値を得るcondition
- もし条件が真なら,命令ブロックの論理はthen
使用されている (var_decl_then0
, var_decl_then1
条件が false ならば,命令ブロックの論理はelse if
またはelse
使用されている (var_decl_else0
, var_decl_else1
,など).return_expression_then
そしてreturn_expression_else
- モジュール内の最後の式または else ブロックの式は,命令の最終値を返します.変数が最後に宣言された場合,その値は結果値になります.
if 文の返した値の種類は,return_expression_then
そしてreturn_expression_else
. TradingView で実行するときは,それらのタイプが一致する必要があります: else ブロックに文字列値がある場合,そのブロックから整数値を返すことはできません. FMZ で実行する場合は,以下の例でエラーが報告されません. y 値は
例
// This code compiles
x = if close > open
close
else
open
// This code doesn't compile by trading view
// y = if close > open
// close
// else
// "open"
plot(x)
についてelse
この場合,条件が false である場合,var_declarationX 変数には
例
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
複数の
例
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
測定した結果の値if
表現の副効果が必要な場合,有用である.例えば戦略取引では:
例
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
文列が互いに含まれている場合:
例
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- ループの return_expression の値として割り当てられるオプション変数宣言.counter
- ループカウンター値を保持する変数で,ループの各イテレーションで 1 を増やし/減量したり step_num の値を保持しますfrom_num
- カウンターの開始値. int/float の値/表現が許容されます.to_num
- カウンターの最終値. カウンターが to_num よりも大きいときループが断たれる (to_num > to_num の場合では to_num よりも小さい場合). step_num
- カウンターのインクリメント/デクリメント値.オプションです.デフォルトは from_num または to_num の最大値に応じて +1 または -1 です.値を使用すると,カウンターは from_num または to_num の最大値に応じてインクリメント/デクリメントされます.したがって,step_num の +/- 記号はオプションです.statements | continue | break
- 4つのスペースまたは1つのタブで引入された任意の数の文言,または"継続"または"休止"キーワードreturn_expression
- ループの返却値は,存在する場合, var_declaration の変数に割り当てられます.ループがキーワード"continue"または"break"で終了した場合,ループの返却値は,ループの終了前に値が割り当てられた最後の変数の返却値です.continue
- ループでしか使えないキーワードですbreak
- ループから抜け出すためのキーワードだ
例
// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
int result = 0
for i = 1 to lookback
if close[i] > close
result += 1
result
plot(qtyOfHigherCloses(14))
ほかにも参照
for...in
while
についてfor...in
construct は,配列内の各要素に対して複数のステートメントを繰り返すことができます.array_element
2つの引数で[index, array_element]
. 2番目の形式はループの機能に影響しません. ループの最初の変数における現在の繰り返しのインデックスを追跡します.
[var_declaration =] for array_element in array_id
statements | continue | break
return_expression
[var_declaration =] for [index, array_element] in array_id
statements | continue | break
return_expression
var_declaration
- ループの値が割り当てられるオプション変数宣言return_expression
.
index
- 現在の繰り返しのインデックスを追跡するオプション変数.インデックスは0から始まる.変数はループボディ内で不変である.使用すると,また含まれるタプルに含まれなければならない.array_element
.
array_element
- ループ内で処理される各連続の配列要素を含む変数.この変数はループ体内で不変です.array_id
- ループの配列IDですstatements | continue | break
- 4つのスペースまたは1つのタブで引入された任意の数の文言,または"継続"または"休止"キーワードreturn_expression
- ループの返信値は,var_declaration
ループが終了する場合は,ループの返却値は,ループ終了前に最後に割り当てられた変数です.continue
- ループでしか使えないキーワードですbreak
- ループから抜け出すためのキーワードだ
ループ内の配列の要素やそのサイズを変更できます.
この式では,for...in
各バーに対して,OHLC値が
例
// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[ ] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
int result = 0
for currentElement in array
if currentElement > value
result += 1
result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))
値を設定します. この式は,この式の2つの引数で,isPos
配列からtrue
基準値が一致する場合は,valuesArray
配列は正数です
例
// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)
for [index, value] in valuesArray
if value > 0
array.set(isPos, index, true)
if barstate.islastconfirmedhistory
runtime.log(str.tostring(isPos))
ほかにも参照
for
while
array.sum
array.min
array.max
についてwhile
この文はネイティブコードブロックを条件付きで繰り返すことができます.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
解説:variable_declaration
- 変数申告はオプションですreturn expression
この変数の初期化値を指定できます.boolean_expression
- もし本当なら,ローカルブロックを実行while
スクリプト実行が続きます.while
statement.
continue
- その通りcontinue
キーワードがループを次のイテレーションに 支部させるのですbreak
- その通りbreak
スクリプトの実行が終了後再開されます.while
statement.
return_expression
- 任意の行で返金値が表示されます.while
statement.
例
// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter = i_n
int factorial = 1
while counter > 0
factorial := factorial * counter
counter := counter - 1
plot(factorial)
コメント初期コードの後にネイティブコードブロックwhile
4つのスペースまたはタブで引入する必要があります.while
ループ,次のブール式while
最終的には偽になるか,break
執行しなければならない.
スイッチオペレーターは,条件と表現の値に基づいて,制御をいくつかの命令の1つに転送します.
[variable_declaration = ] switch expression
value1 => local_block
value2 => local_block
...
=> default_local_block
[variable_declaration = ] switch
boolean_expression1 => local_block
boolean_expression2 => local_block
...
=> default_local_block
式で切り替える:
例
// Switch using an expression
string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])
float ma = switch i_maType
"EMA" => ta.ema(close, 10)
"SMA" => ta.sma(close, 10)
"RMA" => ta.rma(close, 10)
// Default used when the three first cases do not match.
=> ta.wma(close, 10)
plot(ma)
表現なしの切り替え:
例
strategy("Switch without an expression", overlay = true)
bool longCondition = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
switch
longCondition => strategy.entry("Long ID", strategy.long)
shortCondition => strategy.entry("Short ID", strategy.short)
リターン実行されたローカルコマンドブロックの最後の式の値.
コメント1つだけlocal_block
ケースやdefault_local_block
実行できるのですdefault_local_block
導入される.=>
前のブロックが実行されない場合にのみ実行されます.switch
変数に割り当てられ,default_local_block
指定されていない場合,文は返します.na
もしlocal_block
実行されません. 結果を割り当てるときswitch
変数への記述,すべてlocal_block
同じタイプの値を返します.
ほかにも参照
if
?:
文字列は,データシリーズ型を示すキーワードです.series
keyword.
変数に値を代入するために使用されますが,変数が宣言されたときにのみ (最初に使用されます).
割り当て演算子は左側の変数に値を割り当てます.以前に宣言された変数に値を割り当てるために使用されます.
任意の式に適用できます.
expr1 != expr2
リターンブル値またはブル値の連続です
モジュール (整数残数) 数値表現に適用できる.
expr1 % expr2
リターン整数または浮遊値,または値の連続.
コメントパインスクリプトでは,整数の残りを計算すると,分数は切断され,すなわち最低絶対値に向かって丸められます. 結果となる値は配当と同じ記号を持つでしょう.
例: -1 % 9 = -1 - 9 * トランカート(-1/9) = -1 - 9 * トランカート(-0.111) = -1 - 9 * 0 = -1.
モジュール割り当て 数字式に適用できます
expr1 %= expr2
例
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
リターン整数または浮遊値,または値の連続.
掛け算の割り当て 数字式に適用できる
expr1 * expr2
リターン整数または浮遊値,または値の連続.
掛け算の割り当て 数字式に適用できる
expr1 *= expr2
例
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
リターン整数または浮遊値,または値の連続.
数字式や文字列に適用できる.
expr1 + expr2
+ expr
リターンバイナリー+
expr1 と expr2 の組み合わせを返します.
Number は整数または浮動点数値,または値の連続を返します.
バイナリ
コメント数学演算子は,数値と数列変数の両方で使用できます.数列で使用する場合,演算子は要素ごとに適用されます.
付加割り当てる 数字式や文字列に適用される
expr1 += expr2
例
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
リターン文字列の場合,expr1 と expr2 の連鎖を返します.数の場合,整数または浮遊値,または値の連続を返します.
コメント数学演算子は,数値と数列変数の両方で使用できます.数列で使用する場合,演算子は要素ごとに適用されます.
微分または単数マイナス 数字式に適用できます
expr1 - expr2
- expr
リターン整数または浮動点数値,または値の連続を返します:
バイナリ -
expr の否定を返します.
コメント数学演算子は,数値と連続変数の両方で使用できます. 連続で使用する場合,演算子は要素ごとに適用されます.
減算の割り当て 数字式に適用できます
expr1 -= expr2
例
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
リターン整数または浮遊値,または値の連続.
分割の割り当て 数字式に適用できる
expr1 / expr2
リターン整数または浮遊値,または値の連続.
分割の割り当て 数字式に適用できる
expr1 /= expr2
例
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
リターン整数または浮遊値,または値の連続.
数値表現に適用できる.
expr1 < expr2
リターンブル値,またはブル値の連続です
数値表現に適用できる.
expr1 <= expr2
リターンブル値,またはブル値の連続です
任意の式に適用できる.
expr1 == expr2
リターンブル値,またはブル値の連続です
switch
statements.
函数宣言の文法とは:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
A について<local_block>
0以上のPine Script文が表示されています<function_result>
変数,表現,またはタプルです.
例
// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) =>
sum = x + y
sumChange = ta.change(sum, 10)
// Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))
補足するユーザー・マニュアルの Declaring functions and Script libraries のページで,ユーザー定義関数について詳しく見ることができます.
数値表現に適用できる.
expr1 > expr2
リターンブル値,またはブル値の連続です
数値表現に適用できる.
expr1 >= expr2
リターンブル値,またはブル値の連続です
条件付き演算子
expr1 ? expr2 : expr3
例
// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)
// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)
リターンexpr2 は,expr1 が true と評価される場合,expr3 はそうでない場合.ゼロ値 (0 と NaN, +Infinity, -Infinity) は false とみなされ,他の値は true とみなされる.
コメント
ほかにも参照
na
シリーズサブスクリプト. シリーズの前の値へのアクセスを提供します. expr1. expr2は過去の数であり,数値でなければなりません.浮遊物は丸められます.
expr1[expr2]
例
// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
a := low
plot(a)
リターン価値観の連続です
ほかにも参照
math.floor
論理 AND はブール式に適用できます
expr1 and expr2
リターンブル値,またはブル値の連続です
論理 OR はブール式式に適用できます
expr1 or expr2
リターンブル値,またはブル値の連続です
論理否定 (NOT) ブル式に適用できる.
not expr1
リターンブル値,またはブル値の連続です
変数または引数の
例
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
コメント変数宣言でタイプを明示的に言及することは,na で初期化される場合を除き,オプションです.Pine Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.
ほかにも参照
var
varip
int
float
color
string
true
false
変数または引数の
例
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
コメント変数宣言でタイプを明示的に言及することは,na で初期化される場合を除き,オプションです.Pine Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.
ほかにも参照
var
varip
float
bool
color
string
変数または引数の
例
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
コメント変数宣言でタイプを明示的に言及することは, na で初期化される場合を除いて,オプションです.
ほかにも参照
var
varip
int
bool
color
string
変数または引数の
例
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
コメント変数宣言でタイプを明示的に言及することは,na で初期化される場合を除き,オプションです.Pine Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.
ほかにも参照
var
varip
int
float
bool
str.tostring
str.format
変数または引数の
例
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
コメントカラーリテラルには次のフォーマットがあります: #RRGGBBまたは #RRGGBBAA.文字対は00からFFの十六進数値 (0から255の十進数値) を表し,RR,GG,BBの色
変数宣言でタイプを明示的に言及することは,na で初期化される場合を除き,オプションです.Pine Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.
ほかにも参照
var
varip
int
float
string
color.rgb
color.new
変数または引数のarray.new<type>
, array.from
function.
例
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
コメント配列オブジェクトは常に"シリーズ"形式です.
ほかにも参照
var
array.new
array.from
PINE言語のオブジェクトは,ユーザ定義型 (UDT) のインスタンスを用いており,ユーザがエンティティ内の異なる値を整理する戦略でカスタム型を作成できるようにする方法のないクラスとして理解することができます.
種類を定義する
オーダー情報を保存するオーダータイプを定義します.
type order
float price
float amount
string symbol
type
keyword.オブジェクトを作成
指定されたタイプを使用して,呼び出しnew()
オブジェクトを作成する関数:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
空のオブジェクトも作成できます.
order order1 = na
実践的な例をご覧ください
type order
float price
float amount
string symbol
if strategy.position_size == 0 and open > close
strategy.entry("long", strategy.long, 1)
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1) // Output {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}
この例では:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
これは,以下のように書ける.
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
キーワード var の利用のためのオブジェクトタイプ
//@version=5
indicator("Objects using `var` demo")
//@type A custom type to hold index, price, and volume information.
type BarInfo
int index = bar_index
float price = close
float vol = volume
//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()
// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")
ユーザが定義したタイプのオブジェクトに割り当てられた変数を宣言するためにvarキーワードを使用すると,キーワードは自動的にオブジェクトのすべてのフィールドに適用されます.これは,varキーワードを使用して宣言されたオブジェクトが,各イテレーションでフィールド値を再初期化する必要なく,各イテレーションの間にその状態を維持することを意味します.
2つのオブジェクトのインデックスフィールドをプロットすることで,それらの間の違いを比較することができます. firstBar.indexは,毎回の繰り返しに以前に設定された値を保持し,currentBar.indexは,毎回の繰り返しに,現在のエントリのbar_index値に再起動されます.
varipキーワードの利用のためのオブジェクトタイプ
//@version=5
indicator("Objects using `varip` fields demo")
//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
int bars = 0
varip int ticks = 0
//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()
// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars += 1
counter.ticks += 1
// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)
パインでは,object
乞食なぜ戦略広場複製のパイン戦略が実用化できないのか
発明者 量化 - 微かな夢じゃあ調べてみよう.
乞食張超大
発明者 量化 - 微かな夢こんにちは,具体的にはどんな戦略ですか?