[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) // 调用一个内置函数输出日志 (全局范围)
長い行は複数の行に分けられる,または,
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 の条件を満たす場合にのみ変更することができる.
说明:
- ```variable_name``` - Pine Script中允许的用户变量的任何名称(可以包含大写和小写的拉丁字符,数字和下划线(_),但不能以数字开头)。
- ```expression``` - 任何算术表达式,就像定义常规变量一样。 将计算表达式并将其分配给变量一次。
**例子**
```pine
// 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行更新の間に値を保持する.
说明:
- ```variable_name``` - Pine脚本中允许的用户变量的任何名称(可以包含大写和小写拉丁字符、数字和下划线(_),但不能以数字开头)。
- ```expression``` - 任何算术表达式,就像定义常规变量时一样。在第一根K线上,表达式仅计算一次并将其分配给变量一次。
**例子**
```pine
// varip
varip int v = -1
v := v + 1
plot(v)
varを使用すると,グラフはbar_indexの値を返します.varipを使用すると,歴史のK行では同じ動作が起こりますが,リアルタイムのK行では,グラフは1つの値を返します.この値は1つのティックごとに増加します.
コメントfloat、int、bool、stringなどのシンプルなタイプと,それらのタイプの配列とのみ使用できます.
この式は,この式で表示されるように,この式で表示されるように,比較あるいは論理演算子で計算できる値である.
コメント参照してください比較演算子と論理演算子の説明は,
また会おう
### false
表示一个布尔类型变量的值,以及比较操作、逻辑操作的结果。
**备注**
请参阅**比较**运算符和**逻辑**运算符的描述。
**另见**
```bool```
### if
If语句定义了在满足表达式条件时必须执行的语句块。第4版的Pine脚本语言允许您使用“else if”语法。
通用编码来自:
var_declarationX = if 条件 var_decl_then0 var_decl_then1 について ... ほら var_decl_thenN について return_expression_then について [選択可能なブロック] 変数値 var_decl_else1 について ... ほら var_decl_elseN について return_expression_else について その他 変数値 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的表达式将返回语句的最终值。 如果变量的声明在最后,它的值将是结果值。
if语句的返回值的类型取决于```return_expression_then```和```return_expression_else```类型。TradingView上运行时,它们的类型必须匹配:当你在else块中有一个字符串值时,不可能从then语句块返回一个整数值。在FMZ上运行时,以下例子不会报错,当y值取值"open"时,plot画图时的数值为n/a。
**例子**
```pine
// 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)
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
```counter``` - 保存回圈计数器值的变数,在回圈的每次迭代中递增/递减 1 或 step_num 值。
```from_num``` - 计数器的起始值。允许使用“series int/float”值/表达式。
```to_num``` - 计数器的最终值。当计数器大于to_num(或小于to_num在from_num > to_num的情况下)时,循环中断。允许使用“series int/float”值/表达式,但它们仅在循环的第一次迭代时进行评估。
```step_num``` - 计数器的递增/递减值。它是可选的。默认值为+1或-1,具体取决于from_num或to_num中最大的一个。使用值时,计数器也会根据from_num或to_num中最大的那个而递增/递减,因此step_num的+/-符号是可选的。
```statements | continue | break``` - 任意数量的语句,或'continue'或'break'关键字,缩进4个空格或一次 tab。
```return_expression``` - 循环的返回值,如果存在,则分配给var_declaration中的变量。 如果循环由于“continue”或“break”关键字而退出,则循环的返回值是在循环退出之前分配值的最后一个变量的返回值。
```continue``` - 只能在回圈中使用的关键字。它导致回圈的下一次迭代被执行。
```break``` - 退出回圈的关键字。
**例子**
```pine
// 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
`for...in` 结构允许为数组中的每个元素重复执行多个语句。它可以与任一参数一起使用:`array_element`,或与两个参数一起使用:`[index, array_element]`。 第二种形式不影响循环的功能。它在元组的第一个变量中跟踪当前迭代的索引。
[var_declaration =] array_id の array_element に対して 断ち切る return_expression を表示する
[var_declaration =] array_id の [インデックス,配列_要素] に対して 断ち切る return_expression を表示する
```var_declaration``` - 一个可选的变量声明,将被赋予循环的 `return_expression` 的值。
```index``` - 跟踪当前迭代索引的可选变量。索引从 0 开始。变量在循环体中是不可变的。使用时,它必须包含在一个也包含 `array_element` 的元组中。
```array_element``` - 包含要在循环中处理的每个连续阵列元素的变量。该变量在循环体中是不可变的。
```array_id``` - 回圈迭代的阵列ID。
```statements | continue | break``` - 任意数量的语句,或'continue'或'break'关键字,缩进4个空格或一次 tab。
```return_expression``` - 循环的返回值分配给 `var_declaration` 中的变量,如果存在的话。 如果循环由于'continue'或'break'关键字而退出,则循环的返回值是循环退出前最后一个赋值的变量。
```continue``` - 只能在回圈中使用的关键字。它导致回圈的下一次迭代被执行。
```break``` - 退出回圈的关键字。
允许在循环内修改阵列的元素或其大小。
在这里,我们使用 `for...in` 的单参数形式来确定在每个K线上,有多少K线的OHLC值大于'close'值的SMA:
**例子**
```pine
// 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))
また会おう
### while
`while`语句允许本地代码块的条件迭代。
変数_宣言 = while ブーリアン_表現 ... ほら 続けて ... ほら 休憩 ... ほら return_expression を表示する
说明:
```variable_declaration``` - 可选的变量声明。`return expression`可以为这个变量提供初始化值。
```boolean_expression``` - 如果为true,则执行`while`语句的本地块。如果为false,则在`while`语句之后继续执行脚本。
```continue``` - `continue` 关键字导致循环分支到下一次迭代。
```break``` - `break` 关键字导致循环终止。脚本的执行在 `while` 语句之后恢复。
```return_expression``` - 提供 `while` 语句返回值的可选行。
**例子**
```pine
// 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
この例は,同じタイプの値を返す必要があります.
また会おう
### series
series是一个关键字,表示数据系列类型。显式使用 `series` 关键字通常是不必要的。
## 运算符
### =
用于给变量赋值,但仅在声明变量时(第一次使用)。
### :=
赋值运算符,给左侧变量赋值。用于为先前声明的变量赋值。
### !=
不等于。适用于任何类型的表达式。
expr1!= expr2 について
**返回值**
布尔值,或一系列布尔值。
### %
模数(整数余数)。 适用于数值表达式。
expr1 % expr2
**返回值**
整数或浮点值,或一系列值。
**备注**
在Pine脚本中,当计算整数的余数时,商将被截断。 即,将其四舍五入到最小绝对值。 所得值将具有与股息相同的符号。
示例:-1 % 9 = -1 - 9 * truncate(-1/9) = -1 - 9 * truncate(-0.111) = -1 - 9 * 0 = -1。
### %=
模数指派。适用于数值表达式。
expr1 %= expr2
**例子**
```pine
// 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個以上あります.
**例子**
```pine
// 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と評価される.
コメント
また会おう
### []
系列下标。 提供对expr1系列的以前值的访问。 expr2是过去k线的数目,必须是数值。 浮动将被向下舍入。
expr1[expr2]
**例子**
```pine
// [] 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)
返した値文字列は,数値の列である.
また会おう
### and
逻辑 AND。适用于布尔表达式。
expr1 と expr2
**返回值**
布尔值,或一系列布尔值。
### or
逻辑 OR。适用于布尔表达式。
expr1 または expr2
**返回值**
布尔值,或一系列布尔值。
### not
逻辑求反(NOT)。 适用于布尔表达式。
表現されない
**返回值**
布尔值,或一系列布尔值。
## 数据类型关键字
### bool
用于显式声明变量或参数的“bool”(布尔)类型的关键字。"Bool"变量的值可以是true、false或na。
**例子**
```pine
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
コメント変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
### int
用于显式声明变量或参数的“int”(整数)类型的关键字。
**例子**
```pine
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
コメント変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
### float
用于显式声明变量或参数的“float”(浮点)类型的关键字。
**例子**
```pine
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
コメント変数宣言に明示的に種類を言及することは,naで初期化されていない限り選択可能である.
また会おう
### string
用于显式声明变量或参数的"string"类型的关键字。
**例子**
```pine
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
コメント変数宣言に明示的に種類を言及することは,na で初期化されていない限り選択可能である. タイプシステムのユーザーマニュアルページでPine型について詳しく見る.
また会おう
### color
用于显式声明变量或参数的"color"类型的关键字。
**例子**
```pine
// 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型について詳しく見る.
また会おう
### array
用于显式声明变量或参数的“阵列”类型的关键字。可以使用```array.new<type>```,```array.from```函数创建阵列对象(或ID)。
**例子**
```pine
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
コメント配列オブジェクトは,常に
また会おう
### Objects
PINE语言的Objects对象是用户定义类型(UDT)的实例,可以理解为无方法类,允许用户在策略中创建自定义类型在一个实体中组织不同的值。
**定义类型**
让我们定义一个order类型来保存订单信息:
```pine
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)
改訂された:
float sourceInput = input.source ((close,
var 配列酸
ウウオヤン取引が同時に行われることを望むなら,
軽い雲JSと同じようなトランザクションも行えますか? ありがとうございました.
リサ20231詳細なドキュメントをありがとうございました.
芸術このPineScriptは,Okexのシミュレーションディスクをプラットフォーム上でどのように使っているのでしょうか?
芸術開発者のプラットフォームに直接コピーして利用できます!
発明者 量化 - 微かな夢PINE言語は単種策のみを行うが,多種策は,python,javascript,c++で設計を書くのがベストである.
発明者 量化 - 微かな夢OKXは特殊なもので,彼らの模擬環境とリアルディスク環境は同じアドレスですが,別の場所では区別されます.
軽い雲OKX模擬盤は使えませんでした.
発明者 量化 - 微かな夢この多様なアーキテクチャの問題は,各取引所のインターフェースが異なるため,インターフェースの周波数制限が異なるため,多くの問題が生じる.
発明者 量化 - 微かな夢雲山さん,この提案をありがとうございました.
軽い雲JSと混同した方が良いと感じて,JSは様々な取引方法により適している.
トレンドハンター販売価格は各品種にわたって行われます.
発明者 量化 - 微かな夢嫌なことをする.
軽い雲素晴らしい,ありがとう,夢大さん.
発明者 量化 - 微かな夢PINE言語の戦略は,一時的に単一品種のみです.
発明者 量化 - 微かな夢この記事へのトラックバック一覧です.
発明者 量化 - 微かな夢ほら,もういいから
発明者 量化 - 微かな夢PINE 模範庫のパラメータは,交換取引所のベースアドレスを設定することができます. 文書の開始: PINE 言語取引庫の模範庫のパラメータ.