資源の読み込みに... 荷物...

FMZ PINE スクリプトのドキュメント

作者: リン・ハーン発明者 量化 - 微かな夢作成日: 2022-05-06 14:27:06, 更新日: 2024-10-12 15:27:04

[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()声明文はこちら.

コード

スクリプト内の注釈やコンパイルヤー命令以外の行は,スクリプトのアルゴリズムを実装する文である. 文はそれらのいずれかである.

  • 変数宣言
  • 変数の再定義
  • 関数宣言
  • 内蔵関数呼び出し,ユーザー定義関数呼び出し
  • ifforwhileあるいはswitch等式構造

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

  • いくつかの文言は1行で表現できるが,例えばほとんどの変数宣言は1行のみの関数呼び出しを含む文言または1行の関数宣言である.他の文言は,構造のように,常に複数の行を必要とするが,それらは局所的なブロックを必要とする.
  • スクリプトの全域の文 (すなわち,部分に属していない部分) は,空格あるいは制表符(タブキー) 開始.それらの最初の文字も行の最初の文字でなければならない.行の最初の位置から始まる行は,定義によってスクリプトの全域の一部である.
  • 構造や多行関数宣言には常に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 言語取引庫"のパラメータ設定説明.

img

取引設定

  • 実行方法 閉じる価格モデル:現在のBARが終わるまでモデルを実行し,下根BARが始まるときに取引を実行する. リアルタイム価格モデル:価格の変化ごとにモデルを実行し,信号がすぐに取引を実行します.
  • デフォルト開場数:取引指示が取引数を指定していない場合,その設定に従って取引を行う.
  • 最大単一の取引回数:実際の盘口に基づいて,このパラメータ設定と組み合わせ,各次最大の注文回数を決定し,盘面への衝撃を避ける.
  • スライドポイント数:定价货币精度パラメータとこのパラメータは,注文時のスライド価格を決定する.例えば,価格設定の通貨精度が2,つまり小数点の2番目まで正確で,0.01まで正確である.その場合は,スライドポイントは1点ごとに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% です. 口座の通貨数による単価計算です. 例えば: 現行口座に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")

変数aは,一連の各柱線の最初の柱線の閉じる価格を維持する. 変数bは,シリーズ第1のの価格棒の閉店価格を維持した. 変数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線段階.varvarip宣言された変数 i、ii は,戦略コードの各実行回ごとに増幅操作を実行します.if trueしたがって,確実に対応する条件コードブロックを実行する) ー だから,回帰結果のK線BARに表示される数字がそれぞれが1を増加していることがわかります. 歴史のK線段階が終了すると,リアルタイムK線段階を開始します.varvarip宣言された変数は異なる変化が始まる. リアルタイム価格モデルであるため,K線BAR内の価格の変化ごとに戦略コードが繰り返される.i := i + 1そしてii := ii + 1i は次の実行回でも変更されるが,次の実行回でも変更されるが,現在のK線BARが終了するまで更新しない. (つまり,次の実行回でも変更されない) だから,i 変数は依然としてBAR1 を追加する.しかし,i 変数はBAR に何度か加算される.

  • 閉店価格モデル 閉じる価格モデルは,K線BARが走るたびに1回の戦略論理を実行する.したがって,閉じる価格モデルでは,歴史的なK線段階とリアルタイムK線段階は,varvarip宣言された変数は,上記の例で増加して表されるのに完全に一致し,各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 脚本言語では,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からの式は,文の最終値を返します. 変数の宣言が最後にある場合,その値は結果値になります.

返される値の種類は,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 変数に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 ifのブロックは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' 構造は,複数の文を繰り返し実行することを許可します.

[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) ループを中断する.series int/float thresholds/expressionsを使用することは許容されるが,これらはループの第1回転時にのみ評価される.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構造は,配列内の各要素に対して複数の文を繰り返し実行することを許可する. これは任意の参数と併用できる: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- 任意の数の文,または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つの式は,この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 を返します. 単元+は,expr (単元演算子の対称性に対して何も追加しない) を返します.

コメント数字付きの算術演算子と変数列を使用できます. 数列を使用する場合は,演算子が要素に適用されます.

+=

加法指令は、数値表現や文字列に適用される。

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 を返します. 1円-負の式を返します.

コメント数字付きの算術演算子と変数列を使用できます. 数列を使用する場合は,演算子が要素に適用されます.

-=

減法指令は、数値式に適用されます。

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と評価される.

コメントelseの枝としてnaを使用してください. 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 は,ブル式に適用されます.

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型について詳しく見る.

また会おう 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 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キーワード宣言のタイプ.
  • 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キーワードを使用することで,オブジェクトのフィールドが未確認の列に回転せず,スクリプトの実行中に継続して存在することを指示する. 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 言語取引庫の模範庫のパラメータ.