FMZ PINE スクリプト ドック

作者: リン・ハーン小さな夢作成日:2022-04-28 16:05:05,更新日:2024-02-27 16:56:23 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27 更新日:2021-02-27

[TOC]

img

キーワード,文法,設定の紹介

コードの構造

パインのコードは次のとおりです.

<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他のコンストラクション

申告は様々な方法で整理できます.

  • いくつかの命令は,ほとんどの変数宣言,一つの関数呼び出しのみを含む行,または単行関数宣言など,1行で表現できる.他の命令は,構造のように,常に複数の行を必要とします.
  • スクリプトのグローバル範囲 (つまりローカルブロックの一部でない部分) のステートメントは,spaceまたはtab(タブキー). その最初の文字は,行の最初の文字でなければならない. 行の最初の位置から始まる文字は,定義上,スクリプトのグローバル範囲の一部である.
  • A について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)

新規コード

長い線は複数の線に分けられる.また,巻き (wrapped) とも呼ばれる.この線は4の倍数でない限り,任意の空白でインデントしなければならない (これらの境界はローカルブロックをインデントするために使用される).

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 戦略の組み込みテンプレート Pine Language Trade Class Libraryの引数を設定するための指示.

取引設定

  • 実行モード 閉じる価格モデル: このモデルは,現在の BAR が完了した後で実行され,次の BAR が開始されたときに取引が実行されます. リアルタイム価格モデル: このモデルは価格が動いたたびに実行され,すぐに取引を実行するための信号があります.
  • デフォルトのオープン・ロットサイズ: 取引命令に取引額が指定されていない場合,取引は設定された金額に従って実行されます.
  • 単一の取引のための最大注文量:実際の市場とこの議論の設定に基づいて市場に影響を及ぼすことを避けるために,各注文の最大金額を決定します.
  • スリップポイント: 順序を出すときのスリップポイントをPricing Currency Precisionこの引数とこの引数.例えば,価格設定通貨精度は2に設定され,これは2番目の小数点まで正確で,精度は0.01です.その後,スリップポイントの各点は0.01の価格単位を表します.この時点で,スリップポイントは5に設定され,オーダーを出すときのスリップは0.05です (スリップは,オーダーを出すときに溢れる価格の一部を指します.
  • 変数の最長周期数:チャート内のK線 BARの数に影響を与える.関数を呼び出すことと同じです.SetMaxBarLenについてjavascript srategy.

フューチャーオプション

  • 品種コード: 契約コードは,交換対象が非スポット交換対象である場合にのみ設定する必要があります.
  • 契約の最小サイズ: 契約の最小取引量.

ライブ・トレードオプション

  • 自動回復進捗: 最後の戦略停止前の状態を自動回復する.
  • オーダー再試行時間:オーダーが満たされない場合は,オーダーがキャンセルされ,取引を試みるためにオーダーが再配置されます.この引数は最大再試行数を制限するために使用されます.
  • ネットワーク投票間隔 (ミリ秒): REST プロトコルのみ有効で,ネットワーク要求間隔を制御し,要求が頻繁すぎたり,交換制限を超えることを防ぐ.
  • アカウント同期時間 (秒): アカウントデータを同期するための時間.
  • ポジションを開いた後のポジション同期時間 (ミリ秒):一部の取引所でデータ遅延による繰り返しポジションの場合のみ,より長い同期時間を設定することで,そのような問題を軽減できます.
  • "レバレッジマルチプル"はレバレッジマルチプルを設定する.

スポット取引,その他の設定

  • 取引量 (trade volume): 取引量 (trade volume) の総額.
  • 最低取引量: 最低取引量.
  • 価格設定通貨の精度:価格の精度,すなわち価格の小数点数.
  • 取引品種の正確性:注文量,すなわち注文量における小数点の数.
  • 処理手数料: この設定に従っていくつかのデータを計算します. 0.002は2/1000です.
  • 利益と損失統計の間隔: これは,実際の市場での利益と損失統計を示すためにのみ使用されます.
  • 失敗した再試行 (ms): ネットワーク要求が失敗した際の再試行間隔.
  • プロキシを使用する: REST プロトコルでのみ有効です.
  • ネットワークの一般的なエラーを隠す: ログエリアで一般的なエラーログを隠す.
  • スイッチベースアドレス: REST プロトコルでのみ有効です.
  • プッシュ通知:メールボックスへのプッシュメッセージなど

注文取引

オープンポジション

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条件を最初に満たす価格で発動します.

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

ワール

var は変数の割り当てと一度の初期化に使用されるキーワードです. 一般的に,キーワード var を含まない変数割り当て文法は,データが更新されるたびに変数s の値が書き換えられる. 対照的に,変数がキーワード var を使用して割り当てられた場合,データ更新にもかかわらず状態を維持し,if-expressions の条件を満たす場合にのみ変更することができます.

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

変数 a は,シリーズ内の各バーの最初のバーの閉じる価格を保持します. 変数 bは,シリーズ内の最初の green価格バーの閉値値を保持します. 変数 cは,シリーズ内の第10の 緑色バーの閉値を保持します.

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 + 1i は次のラウンドで戦略論理を実行すると,前の値が復元され,現在の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では,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- もし条件が真なら,命令ブロックの論理は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 値は 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表現の副効果が必要な場合,有用である.例えば戦略取引では:

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)

について

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- カウンターの開始値. int/float の値/表現が許容されます.to_num- カウンターの最終値. カウンターが to_num よりも大きいときループが断たれる (to_num > to_num の場合では to_num よりも小さい場合). series int/float 値/表現は許容されますが,ループの最初の繰り返しにのみ評価されます.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...inconstruct は,配列内の各要素に対して複数のステートメントを繰り返すことができます.array_element2つの引数で[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値が 値の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つの引数で,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)

コメント初期コードの後にネイティブコードブロックwhile4つのスペースまたはタブで引入する必要があります.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 を返します. Unary + は expr を返します (unary オペレーター対称性には何も追加されません).

コメント数学演算子は,数値と数列変数の両方で使用できます.数列で使用する場合,演算子は要素ごとに適用されます.

+=

付加割り当てる 数字式や文字列に適用される

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 を返します 単数-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 とみなされる.

コメントelse支店の代わりに na を使ってください. 2つ以上の?: オペレーターを組み合わせて スイッチのような文の相当値を得ることができます (上記の例を参照). 数値と数列変数の両方で算術演算子を用いることができる.数列で使う場合,演算子は要素ごとに適用される.

ほかにも参照 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変数は true, false または na の値を持つことができます.

// 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 (整数) 型を明示的に宣言するために使用されるキーワード.

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

コメント変数宣言でタイプを明示的に言及することは,na で初期化される場合を除き,オプションです.Pine Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.

ほかにも参照 var varip float bool color string

浮遊機

変数または引数の 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 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
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 Script タイプについて,タイプシステムに関するユーザーマニュアルページで詳しく見てください.

ほかにも参照 var varip int float string color.rgb color.new

配列

変数または引数のarray型を明示的に宣言するために使用されるキーワード. 配列オブジェクト (またはID) は,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

内蔵機能

函数を呼び出すとき,引数を渡すことができます. 値を代入するために引数の名前を代入できます. 対応する引数の位置に直接変数を渡すことができます. 混合使用もサポートされています. 例えば:

plot(close, title="test plot")     // Pass the argument close directly; specify the argument title and assign the string "test plot"

引数名割り当てを指定した後は,変数を直接引数として渡すことはできなくなり,次の引数は引数名割り当ての形式で記述する必要があります.

// plot(close, title="test", color.red)    // Although the third argument of plot is the color value, but this will report an error
plot(close, title="test", color=color.red) // Correct writing
plot(close, "test", color.red)             // Correct writing

時間枠

タイムフレーム.in_sec

経過した時間をtimeframe2秒で議論する.

timeframe.in_seconds(timeframe)

// Get chart timeframe:
i_tf = input.timeframe("1D")

// Convert timeframe to the int value (number of seconds in 1 Day):
tf = timeframe.in_seconds(i_tf)

plot(tf)

リターン1つのバーで秒の数を表す inttimeframe.

議論

  • timeframe(シンプルな文字列) タイムフレーム オプション デフォルトはタイムフレーム 期間

コメントについてtimeframe>= 1M関数は,月の30.4167 (365/12) 日に基づいて秒数を計算します.

ほかにも参照 input.timeframe timeframe.period

ティッカー

ticker.heikinashi

スムーズされた平均 int 表示値を要求するための ticker 識別子を作成します.

ticker.heikinashi(symbol)

heikinashi_close = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)

heikinashi_aapl_60_close = request.security(ticker.heikinashi(syminfo.tickerid), "60", close)
plot(heikinashi_close)
plot(heikinashi_aapl_60_close)

リターンrequest.security関数に提供できるストックコードの文字列値.

議論

  • symbol商品コード識別子 (シンプル・ストリング)

ほかにも参照 syminfo.tickerid syminfo.ticker request.security

要求

request.data

外部データ要求

request.data(url, attribute)

/*backtest
start: 2022-01-26 09:00:00
end: 2024-02-01 15:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/

// Chart address https://www.datadata.cn/queries/a10ea45c-1674-48ef-b414-cc17a7e4a548
var chart_data = "https://www.datadata.cn/api/v1/query/a10ea45c-1674-48ef-b414-cc17a7e4a548/data"
add_investor = request.data(chart_data, "$.add_investor")
idx_price = request.data(chart_data, "$.close_price")

plot(add_investor, "new population in the stock market")
plot(idx_price, "stock market index prices")
// Index reversal trading
avg_investor = ta.ema(add_investor[1], 30)
if strategy.position_size == 0
    if add_investor > avg_investor*1.1
        runtime.log("new population:", add_investor, "average of last 30 days:", avg_investor, "#ff0000")
        strategy.entry("Enter Short", strategy.short)
    else if add_investor < avg_investor*0.9
        runtime.log("new population:", add_investor, "average of last 30 days:", avg_investor, "#ff0000")
        strategy.entry("Enter Long", strategy.long)

リターン引数で指定されたデータシリーズattribute.

議論

  • url(単純な文字列) 要求されたデータソースのURL,データソース応答のデータフォーマットは適合する必要があります (少なくとも時間,データ属性を含みます):{"data": [], "schema": ["time", "data"]}データの形式を参照してください:
    {
        "data": [
            [1430438400000, "April 2015", "{\"add_investor\" : 497.53, \"close_price\" : 4441.655}"],
            [1433116800000, "May 2015", "{\"add_investor\" : 415.87, \"close_price\" : 4611.744}"]
            // ...
        ],
        "schema": ["time", "date", "data"]
    }  
    
  • attribute(simple string) は,属性の名前を指定し,必要なデータを返します.例えば:"$.add_investor", を使って$.前置詞として,属性の名前は,データソースの要求に対する回答のデータフィールドの属性と一致します.

request.security

別の色/解像度を求めます.

request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency) 

s = request.security(syminfo.tickerid, "D", close) // 1 Day
plot(s)

expr = ta.sma(close, 10)
s1 = request.security(syminfo.tickerid, "240", expr) // 240 Minutes
plot(s1)

// To avoid difference in calculation on history/realtime you can request not latest values and use merge strategy flags as follows:
s2 = request.security(syminfo.tickerid, "D", close[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(s2)
f() => [open, high]
[o, h] = request.security(syminfo.tickerid, "D", f())
[l, c] = request.security(syminfo.tickerid, "D", [low, close])
plot((o + h + l + c) / 4)

リターン要求されたシリーズ

議論

  • symbolシンボルだ
  • timeframe(単純な文字列) タイム・ピリオド.空の文字列は,チャートの現在の解像度として解釈されます.
  • expression(series int/float/bool/color) 式は request.security コールから計算され返される. 式は,シリーズにキャストできる要素を含むシリーズまたはタプルである.
  • gaps(barmerge_gaps) 要求されたデータのための合併戦略 (要求されたデータは主シリーズOHLCデータと自動的に合併します). 可能な値: barmerge.gaps_on, barmerge.gaps_off. barmerge.gaps_on - 要求されたデータは可能なギャップ (na value) と合併されます. barmerge.gaps_off - 要求されたデータはギャップなしで連続的に合併され,すべてのギャップは以前の最も近い既存の値で満たされます. デフォルト値

もっと

乞食なぜ戦略広場複製のパイン戦略が実用化できないのか

小さな夢じゃあ調べてみよう.

乞食張超大の最適化されたトレンドトレーカー

小さな夢こんにちは,具体的にはどんな戦略ですか?