[TOC]
Pine のコードが従う一般的な構造は:
<version>
<declaration_statement>
<code>
FMZのPine言語サポートの注釈符号:単行本注釈//
ブログの記事へのトラックバック (0) 1/* */
この例の注釈の書き方では,
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 计算MACD指标
/*
plot函数在图表上画出指标线
*/
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()
ステートメントは,スクリプトのタイプを決定し,それがどのような内容を許容し,どのように使用され,実行されるかを決定する. スクリプトのキー属性を設定する. 例えば,その名前,グラフに追加されたときにそれがどこに現れるか,それが表示する数値の精度とフォーマット,実行時に動作する特定の数値を管理する. 例えば,グラフに表示される最大数のグラフオブジェクトを管理する. 策略については,属性には,初期資本,佣金,スライドポイントなど,回転を制御するパラメータが含まれます. FMZのPineは,策略コードに含まれなければならないことを要求しません.indicator()
可能性はstrategy()
声明文はこちら.
スクリプト内の注釈やコンパイルヤー命令以外の行は,スクリプトのアルゴリズムを実装する文である. 文はそれらのいずれかである.
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")
タイムシーケンスとは,データ型や形式ではなく,PINE言語における基本的な構造の概念である. 時間の連続変化の値を保存するために使用され,各値は時間点に対応する. タイムシーケンスという概念の構造は,時間の変化を記録する一連のデータを処理するのに適している.
内蔵変数open
例えば,open
初期価格を記録します.open
この線は5分間のK線周期です.open
変数に記録されるのは,K線BAR (コラム) の開通価格です. 実行中にコードに引用されます.open
初期値 (過去値) を参照する. 前の値 (過去値) を参照する.[]
履歴操作は,K線BARで実行するときに,open[1]
前のK線BARの開通価格を参照する.
しかしタイムシーケンス"配列"というようなデータ構造を思い出すのは簡単です.PINE言語には配列タイプもありますが,それらは時間配列とは全く異なる概念です.
PINE言語でこのような時間列を設計することで,策略コードで簡単に収束価格の累積値を計算することができ,forのようなループ構造を使用する必要もなく,PINE言語の内蔵関数を使用するだけです.ta.cum(close)
また例として,最後の14のK行BAR (つまり,コード実行時に現在の時点から最も近い14のK行BAR) の最大値と最小値差の平均を計算する必要があります.ta.sma(high - low, 14)
タイムシーンの上で関数を呼び出す結果もタイムシーンの上で痕跡を残します.[]
歴史演算子は前の値に引用します.例えば,現在のK線BARの閉じる価格が最後の10つのK線BARの最高価格の最大値を超えているかどうかをテストするときに (現在のK線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)
上記のテストコードは,aとbがそれぞれのBARでそれぞれの時間配列の値を出力する.aとbの値は常に等しいので,両表示方法が等価であることが見えます.
PINE ポリシーの内蔵テンプレート"Pine 言語取引庫"のパラメータ設定説明.
定价货币精度
パラメータとこのパラメータは,注文時のスライド価格を決定する.例えば,価格設定の通貨精度が2,つまり小数点の2番目まで正確で,0.01まで正確である.その場合は,スライドポイントは1点ごとに0.01の価格単位を表す.このとき,スライドポイント数は5に設定され,注文時のスライド価格は0.05である. (スライドポイントは,注文時のスライド価格の部分により,注文の取引の溢出額を計上するため)javascript
戦略での呼び出しSetMaxBarLen
この関数は同じです.strategy(title = "open long example", pyramiding = 3) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓
strategy(title = "close long example", pyramiding = 2) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1) // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // 平仓,指定平掉分组标签为long2的仓位的80%持仓
PINE言語の保持機構は,単方向保持に似ている.例として,多頭方向のポジションを保持している場合 ("多頭保持"),販売操作の注文,計画リストなどがある場合 ("保持方向の逆方向) の注文が実行を誘発する場合は,最初に多頭方向のポジションを平らにする (すべての多頭保持を平らにする),その後,平ら化前の保持方向の逆方向の命令を実行する.
下記の命令を使用すると,任意の価格が指定されていない場合,市場価格リストをデフォルトとして設定します. 上記の命令は,市場価格以外の計画命令で注文できます. 計画命令は即座に実行されません. 計画命令は,触発されていないときに存在するプログラムの計画委託列の中に,リアルディスク/再テスト時間状態情報 (つまり,戦略が実行されている時の状態バー) の"予定注文"の表のページ別には見える. 市場がリアルタイム価格条件を満たしているときにこれらの予定注文を起動するまでは,システムが実際に注文する. したがって,これらの注文の取引価格にわずかな偏差があることは正常な状況である.strategy.entry
この関数は,この関数から,limit
、stop
パラメータは.
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)
// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// 如果均线交叉条件满足,则买入或卖出
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 を使った変数の割り当てでは,データが更新されたとしても,状態を保持し,if-expressions の条件を満たす場合にのみ変更することができる.
var variable_name = expression
解説:
variable_name
- パインスクリプトで許可されているユーザ変数の名前 (大文字と小文字のラテン文字,数字,下書きを含むが,数字から始まるわけではない)expression
−任意の算術式は,通常の変数を定義するのと同じである. ー計算式を計算し,変数に一度割り当てます.例
// 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)
// 测试 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
if true
i := i + 1
ii := ii + 1
リアルタイム価格モデル
上記のテストコードは実行時に2つの段階に分かれます: 1, 歴史K線段階; 2, リアルタイムK線段階.var
、varip
宣言された変数 i、ii は,戦略コードの各実行回ごとに増幅操作を実行します.if true
したがって,確実に対応する条件コードブロックを実行する) ー だから,回帰結果のK線BARに表示される数字がそれぞれが1を増加していることがわかります. 歴史のK線段階が終了すると,リアルタイムK線段階を開始します.var
、varip
宣言された変数は異なる変化が始まる. リアルタイム価格モデルであるため,K線BAR内の価格の変化ごとに戦略コードが繰り返される.i := i + 1
そしてii := ii + 1
i は次の実行回でも変更されるが,次の実行回でも変更されるが,現在のK線BARが終了するまで更新しない. (つまり,次の実行回でも変更されない) だから,i 変数は依然としてBAR1 を追加する.しかし,i 変数はBAR に何度か加算される.
閉店価格モデル
閉じる価格モデルは,K線BARが走るたびに1回の戦略論理を実行する.したがって,閉じる価格モデルでは,歴史的なK線段階とリアルタイムK線段階は,var
、varip
宣言された変数は,上記の例で増加して表されるのに完全に一致し,各K線BARは増加して1である.
varp (varip intrabar persist) は,変数を割り当てたり,一度に初期化したりするキーワードである.これはvarキーワードと似ているが,varip宣言を用いた変数は,リアルタイムでK行更新の間に値を保持する.
varip variable_name = expression
解説:
variable_name
- Pine スクリプトで許容されるユーザ変数の名前 (大文字と小文字のラテン文字,数字,下線を含むが,数字から始まるわけではない)expression
−任意の算術式は,通常の変数を定義する時と同じである. 最初のK線では,式が1回だけ計算され,変数に1回割り当てられる.例
// varip
varip int v = -1
v := v + 1
plot(v)
varを使用すると,グラフはbar_indexの値を返します.varipを使用すると,歴史のK行では同じ動作が起こりますが,リアルタイムのK行では,グラフは1つの値を返します.この値は1つのティックごとに増加します.
コメントfloat、int、bool、stringなどのシンプルなタイプと,それらのタイプの配列とのみ使用できます.
この式は,この式で表示されるように,この式で表示されるように,比較あるいは論理演算子で計算できる値である.
コメント参照してください比較演算子と論理演算子の説明は,
また会おう
bool
ブル型変数の値と,比較操作,論理操作の結果を表示する.
コメント参照してください比較演算子と論理演算子の説明は,
また会おう
bool
If文は,表現条件を満たすときに実行しなければならない文塊を定義する. 4版のPine 脚本言語では,
共有コードは:
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
- 条件がtrueである場合,文塊を使用します.then
論理はvar_decl_then0
,var_decl_then1
条件が false ならば,文塊を使用します.else if
可能性はelse
論理はvar_decl_else0
,var_decl_else1
ほらreturn_expression_then , return_expression_else
- モジュール内の最後の式またはブロックelseからの式は,文の最終値を返します. 変数の宣言が最後にある場合,その値は結果値になります.
返される値の種類は,return_expression_then
そしてreturn_expression_else
タイプ、TradingViewで実行すると,そのタイプがマッチしなければならない:elseブロックに文字文字値があるとき,then文塊から整数を返すのは不可能である.FMZで実行すると,以下の例はエラーを返さない.y値が"open"と取られるとき,プロットグラフが描かれるときの値はn/aである.
例
// 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_declaration X 変数に
例
// 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文は,次のように相互に含まれます.
例
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
'for' 構造は,複数の文を繰り返し実行することを許可します.
[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
-カウンタの初期値.............to_num
-カウンタの最終値.カウンタがto_numより大きいとき (from_num > to_numの場合to_numより小さい場合to_num) ループを中断する.step_num
-カウンタの値増加/減少. それはオプションである. デフォルト値は+1または-1である. それはfrom_numまたはto_numの最大値に依存する. 値を使用するときは,カウンタはfrom_numまたはto_numの最大値によって増加/減少する. したがって,step_numの+/-記号はオプションである.statements | continue | break
- 任意の数の文,またはreturn_expression
- ループの返却値は,存在する場合はvar_declarationの変数に割り当てられます. もしループが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
構造は,配列内の各要素に対して複数の文を繰り返し実行することを許可する. これは任意の参数と併用できる: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
- 現在のリターンインデックスに選べる変数を追跡する...............array_element
基本的には,array_element
- ループで処理される各連続配列要素の変数を含む. この変数はループ体内で不変である.array_id
- ループを繰り返す配列ID ーstatements | continue | break
- 任意の数の文,またはreturn_expression
- 回転の返り値が割り当てるvar_declaration
中にある変数,もし存在する場合. もしループがcontinue
- ループ内でのみ使用できるキーワード. それはループの次のアイディアを実行させる.break
キーワードは"退団する"です.
ループ内の配列の要素またはそのサイズを変更することを許可する.
このビデオでは,for...in
単項式で,各K線に何つのK線の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つの式は,この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
文のローカルブロックである. false の場合は,while
文章の後,脚本を実行します.continue
- continue
キーワードは次のイラストへの循環分岐を導きます.break
- break
キーワードがループを停止させる.while
文章の後,再開します.return_expression
- 提供するwhile
文の返される値は選択可能な行である.
例
// 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つのスペースまたは1つの表記符に縮小する必要があります.while
サイクリングwhile
実行する必要があります. 実行するには,次の boolean 式が false になる必要があります.break
。
switch オペレーターは条件と表現の値に応じて,コントロールをいくつかの文のいずれかに移動します.
[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)
返した値実行される本文ブロックの最後の表現の値である.
コメント実行するだけです.local_block
例やdefault_local_block
半島では,default_local_block
単に=>
標識が一緒に引入され,前方のブロックが実行されていない場合にのみ実行されます.switch
文の結果は変数に割り当てられ,指定されていません.default_local_block
実行しない場合local_block
この文は,この文に戻ります.na
│ │switch
変数に代入すると,local_block
この例は,同じタイプの値を返す必要があります.
また会おう
if
?:
series は,データシリーズ型を表すキーワードである.series
キーワードは通常不要です.
変数に代入する用法ですが,変数を宣言するときにのみ ((初めて使用) される).
変数への赋值を左側で示す赋值演算子. 前述した変数の赋值に使用される.
これは,任意の式に適用される式である.
expr1 != expr2
返した値ブル値,またはブル値の集合.
模数 (=整数余数) ーは数式に適用される.
expr1 % expr2
返した値整数,浮点値,または一連の値.
コメントパイン脚本では,整数の余剰分を計算するときに,商人は切断される.すなわち,その四角を最小絶対値に5乗する.得られる値は配当と同じ符号を持つ.
例:-1 % 9 = -1 - 9 *truncate ((-1/9) = -1 - 9 *truncate ((-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の組み合わせを返します.
数字は整数または浮点値,または一連の値を返します.
二進法
コメント数字付きの算術演算子と変数列を使用できます. 数列を使用する場合は,演算子が要素に適用されます.
加法指令は、数値表現や文字列に適用される。
expr1 += expr2
例
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
返した値文字列の場合は,expr1とexpr2の連列を返します.数字の場合は,整数または浮点値,または一連の値を返します.
コメント数字付きの算術演算子と変数列を使用できます. 数列を使用する場合は,演算子が要素に適用されます.
減法または単数負数. 数値式に適用される.
expr1 - expr2
- 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
文章の中で.
函数宣言の文法としては,
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
"つ<local_block>
単語の単語は0個以上あります.<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))
コメントユーザマニュアルの宣言関数と脚本庫ページで,ユーザ定義関数についてもっと学ぶことができます.
大きい. 数値表現に適用する.
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)
返した値もしexpr1がtrueと評価された場合,expr2はtrueと評価され,そうでない場合,expr3はtrueと評価され,0とNaN+,Infinity,-Infinityはfalseと評価され,他の値はtrueと評価される.
コメント
また会おう
na
行列下標詞、expr1行列の前の値へのアクセスを提供、expr2は過去k行の数であり,数値でなければならない。浮遊は下置される。
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型について詳しく見る.
また会おう
var
varip
int
float
color
string
true
false
変数または参数を明示的に宣言する
例
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
コメント変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
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
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
コメント変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
var
varip
int
float
bool
str.tostring
str.format
変数やパラメータを明示的に宣言する"color"タイプキーワードである.
例
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
コメント色文字は次の形式を有する:#RRGGBBまたは#RRGGBBAA.文字は00からFFまでの十六桁の値を表す (十桁の0から255),RR,GG,BBは色の赤,緑,青分数の値である.AAは色透明度 (またはアルファ分数のオプション値である.00は見えない,FFは透明ではない).AAが提供されていない場合,FFを使用する.十六桁の文字は上小文字または上小文字で書ける. 変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
var
varip
int
float
string
color.rgb
color.new
変数またはパラメータを明示的に宣言するarray.new<type>
,array.from
この関数は array object (またはID) を作成します.
例
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
コメント配列オブジェクトは,常に
また会おう
var
array.new
array.from
PINE言語のObjectsオブジェクトは,ユーザ定義型 (UDT) の例であり,方法のないクラスとして理解され,ユーザがポリシーの中でカスタム型を構成し,同一のエンティティに異なる値を組織することができる.
定義型
注文の種類を定義して,注文情報を保存します.
type order
float price
float amount
string symbol
type
キーワード宣言のタイプ.オブジェクトを作成
宣言されたタイプを使用し,呼び出し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) // 输出 {"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)
パインでは,varipキーワードを使用することで,オブジェクトのフィールドが未確認の列に回転せず,スクリプトの実行中に継続して存在することを指示する. Counter 型の声明では,bars フィールドはvarip キーワードを使用していないので,未確認の各列に回転する. ticks フィールドはvarip キーワードを使用しているので,未確認の各列に回転しない. counter オブジェクトはvarキーワードで宣言されているため,スクリプトの実行中に継続します. 各イデレーションでは,bars フィールドとticks フィールドは1つずつ増加します.bars フィールドは未確認の各列に回転し,ticks フィールドは回転しません. 最後に,counter.bars と counter.ticks のフィールドを描き,それらの違いを比較することができます.counter.bars の値は未確認の各列に回転し,counter.ticks の値はスクリプトの実行が終わるまで増加し続けます.
フィールドの値を変更する
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)
if strategy.position_size != 0
runtime.log(order1)
order1.price := 999
order1.amount := 100
runtime.log(order1)
runtime.error("stop")
活用できる:=
対象のフィールドの値を変更する再割り当て演算子.
オブジェクト集合
例は,ユーザが定義したorder型のオブジェクトを保存する空の配列を宣言します:
type order
float price
float amount
string symbol
arrOrder = array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
可能性は
type order
float price
float amount
string symbol
var array<order> arrOrder = na
arrOrder := array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
オブジェクトを複製する
パインでは,オブジェクトは参照によって割り当てられる.既存のオブジェクトが新しい変数に割り当てられたとき,どちらも同じオブジェクトを指す.
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)
下の例では,ピボット1オブジェクトを作成し,そのxフィールドを1000に設定します. 次に,ピボット2は,そのピボット1オブジェクトの参照を含む変数を宣言します.したがって,両者は同じインスタンスを指します.したがって,ピボット2.xを変更すると,ピボット1.xも変更されます.なぜなら,両者は同じオブジェクトのフィールドを引用しているからです.
元のオブジェクトから独立したコピーを作成するには,この場合は内蔵コピー (() 方法を使用できます.この例では,ピボット2はピボット1の複製インスタンスに参照する変数を宣言します.
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)
注目すべきは,TradingViewのコピー方法は浅コピーである.もしオブジェクトが特殊なタイプのフィールド (arrayなど) を持っていれば,そのオブジェクトの浅コピー内のこれらのフィールドは,そのオブジェクトと同一のインスタンスを指します. FMZプラットフォームは,直接ディープコピーを実現し,追加の処理を必要としません.
深複製
//@version=5
indicator("test deepCopy")
type orderInfo
float price
float amount
type labelInfo
orderInfo order
string labelMsg
labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)
labelInfo1.labelMsg := "labelInfo1->2" // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999 // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2
runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")
テスト結果,labelInfo.copy ((labelInfo1) は実行時に深層コピーであり,labelInfo1を修正する任意のフィールドは,labelInfo2に影響を与えない.
パイン言語のメソッドは,特定のインスタンスの内蔵またはユーザー定義型に関連した特殊関数である.ほとんどの点で,それらは通常の関数と基本的には同じですが,より短い,便利な文法を提供します.ユーザーは,Pineオブジェクトのフィールドにアクセスするように,変数上の点符で直接メソッドにアクセスできます.Pineには,群数,矩,マッピング,線,填線などすべての特殊タイプの内蔵メソッドが含まれています.これらのメソッドは,ユーザにスクリプトでこれらのタイプの特殊プログラムを呼び出すより簡潔な方法を提供します.
内蔵方法
文字のコードの例として,以下のようなものです.
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
array.push(sourceArray, sourceInput)
array.shift(sourceArray)
// Update the mean and standard deviaiton values.
sampleMean := array.avg(sourceArray)
sampleDev := array.stdev(sourceArray) * multiplier
// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
この例では,以下のように書ける.
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
ピンインが支援しているのがわかりますMethods
後に,コードarray.avg(sourceArray)
ユーザは,以下のような方法で記述できます.sourceArray.avg()
│ │
FMZはサポートされていません.array.avg
呼び出しはこちらです
ユーザー定義方法
Pineは,ユーザが任意の内蔵またはユーザが定義したタイプのオブジェクトと一緒に使用するカスタムメソッドを定義することを許可する. 定義メソッドは本質的に定義関数と同じですが,二つの重要な違いがあります:
1,methodキーワードは,関数の名前の前に含まれなければならない. 2,メソッドのパラグラム,その最初のパラグラムの型は,メソッドが関連付けられるオブジェクトの型を表すため,明示的に宣言されなければならない.
例えば,以下のようなコードで,ブリン指標を計算するコードをユーザーにカスタマイズされた方法としてパッケージ化します:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
改訂された:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sour
ウウオヤン取引が同時に行われることを望むなら,
軽い雲JSと同じようなトランザクションも行えますか? ありがとうございました.
リサ20231詳細なドキュメントをありがとうございました.
芸術このPineScriptは,Okexのシミュレーションディスクをプラットフォーム上でどのように使っているのでしょうか?
芸術開発者のプラットフォームに直接コピーして利用できます!
発明者 量化 - 微かな夢PINE言語は単種策のみを行うが,多種策は,python,javascript,c++で設計を書くのがベストである.
発明者 量化 - 微かな夢OKXは特殊なもので,彼らの模擬環境とリアルディスク環境は同じアドレスですが,別の場所では区別されます.
軽い雲OKX模擬盤は使えませんでした.
発明者 量化 - 微かな夢この多様なアーキテクチャの問題は,各取引所のインターフェースが異なるため,インターフェースの周波数制限が異なるため,多くの問題が生じる.
発明者 量化 - 微かな夢雲山さん,この提案をありがとうございました.
軽い雲JSと混同した方が良いと感じて,JSは様々な取引方法により適している.
トレンドハンター販売価格は各品種にわたって行われます.
発明者 量化 - 微かな夢嫌なことをする.
軽い雲素晴らしい,ありがとう,夢大さん.
発明者 量化 - 微かな夢PINE言語の戦略は,一時的に単一品種のみです.
発明者 量化 - 微かな夢この記事へのトラックバック一覧です.
発明者 量化 - 微かな夢ほら,もういいから
発明者 量化 - 微かな夢PINE 模範庫のパラメータは,交換取引所のベースアドレスを設定することができます. 文書の開始: PINE 言語取引庫の模範庫のパラメータ.