FMZ PINE 文書

作成日:: 2022-05-06 14:27:06, 更新日:: 2025-01-23 10:19:06
comments   18
hits   13761

[TOC]

キーワード,文法,設定の概要

コード構造

Pineのコードは以下のように構成されています.

<version>
<declaration_statement>
<code>

コメント

FMZのPine言語でサポートされている注釈符号:単行注釈//記事の内容はこうです/* */この例の注釈の書き方は,

[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()

宣言文は,スクリプトの種類を決定し,これはまた,スクリプトの何が許容され,どのように使用され,実行されるかを決定します.スクリプトの重要な属性,例えば,その名前,それがグラフに追加されたときにそれがどこに現れるか,それが表示される数値の精度とフォーマット,そして,それが動作するときに特定の行動を管理する数値,例えば,それがグラフで表示される最大画質オブジェクトの数値を設定します. 策略に関しては,属性には,初期資本,手数料,滑り点などの回帰制御のパラメータが含まれます.indicator()またはstrategy()声明の文言

コード

スクリプトの注釈やコンパイラ命令の行は文ではなく,スクリプトのアルゴリズムを実装する文である。文は,これらの内容のいずれかである。

  • 変数の宣言
  • 変数の再割り当て
  • 関数宣言
  • 内置関数呼び出し,ユーザ定義関数呼び出し
  • ifforwhileまたはswitch等構造

文は様々な方法で並べられます

  • 一つの行で表現できる文もあります.例えば,ほとんどの変数宣言は,関数呼び出しの1つの行のみを含む,または単行関数宣言である.他のものは,構造のように,局所的なブロックを必要とするため,常に複数の行が必要です.
  • スクリプトの全局的な文言 (つまり,局部的なブロックに属していない部分) は,空格または制表符(tab鍵) 開始。その最初の文字もその行の最初の文字でなければならない。行の最初の位置で始まる行は,定義によりスクリプトの全域の一部となる。
  • 構造または多行関数宣言には常にlocal block。 ローカルブロックは表記符または4つの空白に縮小されなければなりません。 そうでなければ,前行の連続コードとして解析され,つまり前行のコードの連続内容として判断されます。 各ローカルブロックは異なるローカル範囲を定義します。
  • 多数の単行文は,割り切符としてコマ ((,) を使って一行に並べることができる.
  • 文字列は,文字列に注釈を入れてもいいし,注釈だけでもいい.
  • 列を包み込むこともできます (複数行で続きます)

例えば,以下のコードで if 構造を使用する3つの局所ブロック,すなわち,自定義関数声明で1つ,変数声明で2つを含む.

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)

ユーザ定義の関数声明の文も包装できる。しかし,局部ブロックは文法的に縮小で始めなければならないので,次の行に分割すると,文の継続部分は1つ以上の縮小で始めなければならない (例えば:

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組み込み変数は,K線BARの開盤値を記録します.openこれは,K線周期の5分のデータです.open変数に記録されるのは,K行BAR (コラム) の5分毎の開拓価格です. 戦略プログラムが実行される時に,コードで引用されます.openK 線 BAR の開盤値を引用する. タイムシーケンスの前値 (過去値) を引用するために,[]歴史操作は,K行BARで策略が実行されたときに,open[1]これは,現在の K 線 BAR の前 K 線 BAR の開場価格を引用するということです.

しかし,タイムラインこの”数列”というデータ構造は,PINE言語にも数列型があります。しかし,それらは時間序列とは全く異なる概念です。

PINE言語は,このような時間序列を設計し,策略コードで簡単に閉店価格の累積値を計算できます.forのような循環構造を使用する必要はありません.PINE言語の内置関数のみを使用します.ta.cum(close)また別の例として,最後の14K行BAR (つまりコード実行時点から現在の時点までの14K行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の値が常に等しいことがわかるので,この2つの表現方法は等価である.

歴史データ引用 (history-referencing)

Trading Viewでは,過去データ引用の最大項数制限 (最大5000項) があります.例えば,以下のコード:

//@version=6
indicator("test")

ema = ta.ema(close, 10000)      // 报错:Error on bar 0: The 'ema'->'sum' function references too many historical candles (10000), the limit is 5000.
plot(ema, "ema")

// pre10000 = ema[10000]        // 报错:Invalid number of bars back specified in the history-referencing operator. It accepts a value between 0 and 5000.
// plot(pre10000, "pre10000")

FMZ上でPINE言語策略を使用する”Pine言語取引類別庫”の”取引設定”“,変数の最長周期数”のパラメータは,具体的には参照可能なデータの最大項数を設定する.

FMZ PINE 文書

indicator("test")

ema = ta.ema(close, 1000)  // ema = ta.ema(close, 3000) 则报错:Invalid number 3000 of bars back specified in the history-referencing operator. It accepts a value between 0 and 2000.
plot(ema, "ema")

“変数の最長周期数”のパラメータは,大きすぎないように設定し,適切な策略でデータ引用の範囲を指定できます.

Pine 言語の取引クラスデータベースのモジュールパラメータ

PINE策略の内蔵テンプレート”Pine言語取引クラスライブラリ”のパラメータ設定説明書。

FMZ PINE 文書

取引設定

  • 実行 閉店価格モデル:現在のBARが終了した後にモデルを実行し,下根BARが開始されたときに取引を実行する. リアルタイム価格モデル:価格の変化ごとにモデルを実行し,信号があれば即座に取引を実行する.
  • デフォルトの開設手数:取引指令が取引数を指定しない場合,その設定の量に従って取引を実行する.
  • 最大単一取引下の単数:実際の上場に応じて,このパラメータの設定と組み合わせて,各下場の最大数値を決定し,上場面を衝撃から避ける.
  • 価格変動のポイント:定价货币精度参数とこの参数で,下令時に滑走価格を決定する。例えば,定価通貨精度設定は2,つまり小数点の2位まで正確で,0.01まで正確である。そのとき,滑走価格の各点数は0.01の定価単位を表している。このとき,滑走価格の設定は5で,下令時に滑走価格は0.05である。滑走価格は下令時に,より良いため,開口注文を交付した際の溢れ出た価格の一部を指している。
  • 変数の最長周期数: グラフに影響するK線BARの数,およびjavascript策略内の呼び出しSetMaxBarLen機能は同じである.

先物オプション

  • 品種コード:契約コード,取引所オブジェクトが非現貨取引所オブジェクトである場合に設定する必要があります.
  • 最低契約書数:注文時に契約の最小取引量.

リアルオプション

  • 自動復元進捗:前回の戦略停止前の状態に自動復元する.
  • 下の注文再試行回数:注文が取引されず,注文を取り消し,再注文を試みる取引.このパラメータは,最大再試行回数を制限するために使用される。
  • ネットワークアンケート間隔 ((ミリ秒):REST プロトコルにのみ有効で,ネットワーク要求の間隔を制御し,要求が頻度が高くなり,取引所の制限を超えないようにする.
  • アカウント同期時間 ((秒):同期アカウントデータの時間周期。
  • ポジション開設後のポジション同期時間 ((ミリ秒):一部の取引所のデータ遅延による繰り返し開設に限って,同期時間を大きく設定することで,このような問題を緩和できます。
  • 倍数:倍数を設定する.

現金取引,その他の設定

  • 一手取引量: 既定の一手取引量で,現金でのみ有効.
  • 最小取引量: 最小取引量
  • 価格の精度:価格の精度,つまり価格の小数点.
  • 取引品種の精度:次注文の精度,つまり次注文の小数値.
  • 手数料:この設定に基づいていくつかのデータで計算すると,0.002は千分の2を指します.
  • 損益統計の間隔: 損益統計は実体ディスクのみで表示する.
  • 再試行失敗 ((ミリ秒):ネットワーク要求が失敗した際の再試行間隔.
  • REST プロトコルのみで有効.
  • 常見ネットワークエラーを隠す: 常見エラーをログに隠す.
  • REST プロトコルのみで有効である.
  • フォローアップの通知: メールのフォローアップなど

注文する

ポジション開設

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この関数は,関数で定義されます.limitstopパラメータ

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),当時の市場価格が価格より高い場合にのみ,注文がトリガーされます.

  • 停止命令

注文のストップ損失価格を設定し,注文が買取の場合,現在の市場価格が価格より高い場合にのみ,注文がトリガーされます. 注文が売り物である場合,現在の市場価格が価格より低い場合にのみ,注文がトリガーされます.

  • ストップ・リミット

設定できます.limitstopパラメータは,注文が最初に条件を満たす価格でトリガーされます.

権利の割合

//@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%。 口座の計価通貨数に従って下單の計算。 例えば:現在の口座には10000USDTがあり,1%の下單を設定,つまり100USDT規模の下單の注文を使用する。 (販売時に現在の価格に基づいて計算) ・・・

宣言,論理構造のキーワード

var

varは,分配と一次初期化変数のキーワードである. 通常,キーワード var を含まない変数代入文法により,データ更新ごとに変数の値が覆われる.対照的に,キーワード var を使って変数を代入すると,データ更新にもかかわらず,状態を保持し,if-expressions の条件を満たす場合にのみ変更される.

var variable_name = expression

解説:

  • variable_name- Pine Script で許可されているユーザー変数の名前 ((は,大文字と小文字のラテン文字,数字と下線を含むことができる)_),しかし数字で始められない) 。
  • 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")

変数 ‘a’ は,列内の各柱の第1柱の終値を維持する. 変数 ‘b’ は,シリーズで最初の緑色のの値棒の終値を維持する. 変数 ‘c’ は,シリーズ第10の緑のの終盤価格を維持している.

FMZでは,リアルタイム価格モデルとクローズアップ価格モデルに分けられます.varvarip声明の変数は以下のコードでテストします.

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線段階 ◎ リアルタイム価格モデル,歴史K線段階では,varvarip声明の変数i,iiは,策略コードの実行毎に増加操作を実行します.if trueだから必ず対応する条件コードブロックを実行する) 。 だから,反測結果K線BARに表示される数字はそれぞれ1ずつ増加しているのが見えます。 歴史K線段階が終了すると,リアルタイムK線段階が始まります。varvarip声明の変数は異なる変化を始める. リアルタイム価格モデルであるため,K線BAR内の価格の変化ごとに戦略コードが実行され,i := i + 1そしてii := ii + 1すべては1回実行する。違いは,iiが毎回修正する。iは毎回修正するものの,次の実行回では,策略論理が実行されたときに以前の値が復元され,現在のK行BARが終了するまで,iの値を更新して決定する (すなわち,次の実行回では,策略論理が実行されたときに以前の値が復元されない).したがって,iの変数は,iが1つずつ増加していることがわかります。しかし,iiの変数は,BARごとに数回累積する。

  • 終値モデル 閉じる価格モデルは,K線BARが終了するたびに戦略論理を実行する.したがって,閉じる価格モデルでは,歴史的K線段階とリアルタイムK線段階は,varvarip宣言の変数は,上記の例で増加表現が完全に一致しており,すべては,各 K 行 BAR 増加 1 。

varip

varip ((var 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の値を返します。 varpを使用すると,歴史のK線で同じ動作が起こりますが,リアルタイムのK線で,図は1つの値を返します. この値は,各 tick に対して1を増加します。

注記 float,int,bool,stringなどの単純な型と,これらの型の配列としか使用できません。

true

バール型変数の値を表す,または式で使う比較するまたはロジックオペレーターで計算できる値

注記 参照比較する演算子とロジックオペレーターの説明

続きを見る bool

false

ブル型変数の値を表示し,比較操作,論理操作の結果を表示する.

注記 参照比較する演算子とロジックオペレーターの説明

続きを見る bool

if

if文は,表現条件を満たすときに実行しなければならない文ブロックを定義する.Pineスクリプト言語の第4版では,else if文法を使用することができます.

共有コードは以下の通りです.

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_then0var_decl_then1条件が false ならば,文塊を使用します.else ifまたはelse論理的にvar_decl_else0var_decl_else1(笑) return_expression_then , return_expression_else- モジュール内の最後の式またはブロックelseからの式は,文の最終値を返します。変数の宣言が最後にある場合,その値は結果値になります。

if 文の返される値の種類は,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_declarationX変数にempty値 ((na,falseまたは) を割り当てます):

例として

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

複数のelse ifを使用するか,全く使用しないこともできます.then,else if,elseのブロックは4つの空白に移動されます:

例として

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

無視できるif文の結果値 ((var_declarationX=は省略できます) ⇒ 文の副作用が必要な場合,例えば,戦略取引において有用である可能性があります.

例として

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

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- カウンタの初期値。 series int/float 値/式の使用が許可されている。 to_num- カウンタの最終値。 カウンタがto_numより大きいとき (またはfrom_num > to_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つの空白または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

for...in構造は,配列の各要素に対して複数の文を繰り返し実行することを許可する. これは任意の参数と使用できます:array_element, または 2 つのパラメータと一緒に使用します.[index, array_element]┃ 第二の形式は回路の機能に影響しない。 それは元組の最初の変数における現在の代数のインデックスを追跡する。

[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変数の定義は1つの変数で,return_expression値について index- 現在の代数インデックスの選択変数を追跡する. 索引は0から始まる. 変数は循環体内で不変である. 使用される場合,それは1つに含まれなければならない.array_elementグループで array_element- ループで処理される各連続配列要素の変数を含みます. この変数はループ体では変化しません. array_id- 回転円の代数の配列ID。 statements | continue | break- 任意の数の文,または’continue’または’break’キーワードを4つの空白または1つのタブに縮小します. return_expressionループの返り値は,var_declaration中にある変数,存在する場合. ループが’continue’または’break’キーワードのために退出した場合,ループの返される値は,ループが退出する前の最後の代入された変数である. continue- 回転の次の代数が実行されるため,回転の回転の中でのみ使用できるキーワード break返信するキーワードは “退出する”

ループ内で配列の要素またはその大きさを修正することが許可されます. この例では,for...in単項式は,各K線で,K線のOHLC値が ‘close’ 値のSMAより大きい数値を決定します.

例として

// 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つのパラメータを for…in で表します.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

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実行される必要があります. 実行される必要があります.break

switch

switch オペレーターは,条件と表現の値に応じて,コントロールをいくつかの文の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”という表現で表される:

例として

// 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)

表現のないswitch:

例として

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は,データシリーズのタイプを表すキーワードである. 明確に使用する.seriesキーワードは通常不要です.

オペレーター

=

変数に値を与えるのに用いられるが,変数を宣言するときにのみ用いられる.

:=

代入演算子,左側の変数に代入する. 前述の変数に代入する.

!=

任意の種類の表現に適用される.

expr1 != expr2

返される値 ブール値,またはブール値の連鎖

%

模数 ((整数余数) 。数値表現に適用する。

expr1 % expr2

返される値 整数または浮動点値,または一連の値.

注記 パイン・スクリプトでは,整数の余剰を計算するとき,商は切断される。すなわち,最小絶対値に四辺五入する。得られた価値は,配当と同じ符号を持つ。

例:-1 % 9 = -1 - 9 * truncate ((-19) = -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を返します. 1元+はexpr ((1元演算子の対称性には何も追加しない) を返します.

注記 数値付き算術演算子や変数列を使用できます. 列を使用する場合は,演算子は要素に適用されます.

+=

加法指定。数値表現または文字列に適用。

expr1 += expr2

例として

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

返される値 文字列の場合,expr1とexpr2の並列を返します. 数値の場合,整数または浮点値を返します.

注記 数値付き算術演算子や変数列を使用できます. 列を使用する場合は,演算子は要素に適用されます.

-

減算法または一元負号。数値表現に適用する。

expr1 - expr2
- expr

返される値 整数または浮点値,または一連の値を返します. 二進法’+‘は,expr1 減 express2 を返します. 1 ドル-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>

1つ<local_block>これは,Pineの文の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が,expr3と評価されなければ,expr3である.ゼロ値 ((0とNaN+,Infinity,-Infinity) はfalseと判断され,その他の値はtrueである.

注記 elseの枝としてnaを使ってください. switchのような文を実現するために,2つまたは複数の?: オペレーターを使用して組み合わせることができます (上の例を参照). 数値付き算術演算子や変数列を使用できます. 列を使用する場合は,演算子は要素に適用されます.

続きを見る 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

LOGICAL AND。ブル式に適用される。

expr1 and expr2

返される値 ブール値,またはブール値の連鎖

or

論理OR。はブル式に適用されます。

expr1 or expr2

返される値 ブール値,またはブール値の連鎖

not

論理反転 ((NOT) 〜はブル式に適用されます。

not expr1

返される値 ブール値,またはブール値の連鎖

データ型 キーワード

bool

変数またはパラメータを明示的に宣言する bool ((ブール)) 型のキーワード. “Bool”の変数の値は true, false,または na になります.

例として

// 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 ((整数) タイプのキーワード。

例として

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

注記 変数宣言でタイプを明示的に言及することは,naで初期化されている場合を除き,オプションです. タイプシステムのユーザーハンドルページでPineタイプについての詳細をご覧ください.

続きを見る var varip float bool color string

float

変数またはパラメータを明示的に宣言する float () のキーワード.

例として

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

注記 変数声明で明確にタイプを記述することは,naで初期化されている場合を除き,オプションです.

続きを見る var varip int bool color string

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
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

注記 カラー文字は以下の形式で表示されます:#RRGGBBまたは#RRGGBBAA。文字対は,00からFFまでの16進制値を代表する (((0から255までの10進制),RR,GG,BB対は,色の赤,緑,青の分数の値である。AAは,色の透明度 (((またはalpha分数) のオプション値であり,00は見えず,FFは透明ではない。AA対が提供されない場合,FFを使用する。16進制文字は,大文字または小文字である。 変数宣言でタイプを明示的に言及することは,naで初期化されている場合を除き,オプションです. タイプシステムのユーザーハンドルページでPineタイプについての詳細をご覧ください.

続きを見る var varip int float string color.rgb color.new

array

変数またはパラメータを明示的に宣言する配列の型のキーワード.array.new<type>,array.from関数は,配列オブジェクト ((またはID) を作成する.

例として

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

注記 配列のオブジェクトは常に系列形式である。

続きを見る var array.new array.from

Objects

PINE言語のObjectsオブジェクトは,ユーザ定義型 ((UDT) の例であり,方法のないクラスとして理解され,ユーザがポリシーでカスタム型を作成し,異なる値を一つのエンティティに組織することができます.

タイプを定義する

オーダー情報を保存する order タイプを定義します.

type order
    float price
    float amount
    string symbol
  • 使用typeキーワード宣言のタイプ
  • type キーワードの後に type の名前があります。
  • 最初の行 type は,型名を定義した後, 4 つの空白に縮小して,その型が含まれるフィールドを定義します.
  • 各フィールドは,int,float,string等のデータタイプを指定する必要があります.

作成対象

定義されたタイプを使用し,呼び出し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 キーワード宣言によって宣言されたオブジェクトが,各イデレーションの間にその状態を保持することを意味し,各イデレーションでそのフィールド値を再初期化する必要はありません.

  • firstBar オブジェクトは var キーワードで宣言されているので,そのフィールド ((index,price,vol) は,最初のエントリから最後のエントリまで,各エピデーションでその値を保持します。
  • currentBar オブジェクトは 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キーワードを使用することで,スクリプトの実行全体でオブジェクトのフィールドが継続的に存在することを指示し,未確認の列に回転しないようにします. カウンター型の声明では,bars フィールドはvarip キーワードを使用していないので,未確認の各列で回転す