【図解シリーズ】PineScript入門 【Index B】
はじめに..
チャートプラットフォームはTradingViewの提供です。
リファレンスマニュアルに記載の内容って時々何言ってるかわかりずらいですよね?
そんな人(自分も含む)に向けて、実際にTradingView上でリファレンスマニュアルに記載のコードを表示してみました。
※わかりやすくするため、コメントの追加や一部スクリプトの内容を修正している場合があります。
変数
bar_index
型 : series int
//@version=6
indicator("V6 bar_index")
//チャートの一番左端から0,1,2...とバーのインデックス()が振られます。
plot(bar_index, color = color.new(color.red, 0))
plot(bar_index > 5000 ? close : 0)
No.1はチャートの最初のローソク足を表示しています。
ローソク足チャート下のサブウィンドウの赤線に注目してください。
縦の点線位置では、「赤線の値 = 0」ですね。
つまりbar_indexはチャートの左端から、0,1,2…と定義されます。
で、何に使えるんや…
思いついたら追記する。
barstate.isconfirmed
型:series bool
ごめん。これは、図解はなし。この変数の性質上の問題で図解で説明がめんど..じゃなくて難しい。
//@version=5
strategy("BarState.isconfirmedを使ったストラテジー", overlay=true)
// 期間設定
fastLength = input.int(10, "速いMAの期間")
slowLength = input.int(30, "遅いMAの期間")
// 移動平均線の計算
fastMA = ta.sma(close, fastLength)
slowMA = ta.sma(close, slowLength)
// クロスオーバーの検出
longSignal = ta.crossover(fastMA, slowMA)
shortSignal = ta.crossunder(fastMA, slowMA)
// バーが確定したときのみエントリーを実行
if barstate.isconfirmed
if (longSignal)
strategy.entry("Long Entry", strategy.long)
if (shortSignal)
strategy.entry("Short Entry", strategy.short)
// 移動平均線をチャートに描画
plot(fastMA, color=color.blue, title="速いMA")
plot(slowMA, color=color.orange, title="遅いMA")
シグナルの信頼性向上:
形成中のバーでの過剰取引防止: リアルタイムの形成中バーでは価格が変動し続けるため、シグナルが一時的に発生しても確定時にはシグナルが消える可能性があります。barstate.isconfirmedを使用することで、バーが確定した後の信頼性の高いシグナルに基づいて取引を行えます。
バックテストとリアルタイムの整合性確保:
過去データとの一貫性: バックテストではすべてのバーが確定していますが、リアルタイムでは形成中のバーがあります。barstate.isconfirmedを使用することで、バックテスト時の結果とリアルタイムでの動作を一致させることができます。
リペイントの防止:
シグナルの変動防止: 形成中のバーでシグナルを発生させると、バーの確定前にシグナルが変化し、チャート上の表示がリペイントされる可能性があります。barstate.isconfirmedを使用することで、この問題を回避できます。
注意点
エントリーの遅延:
タイミングの遅れ: バーの確定を待つため、エントリーが遅れる可能性があります。特に短期取引(スキャルピング)では、この遅延がパフォーマンスに影響する場合があります。
時間足による影響:
長い時間足での遅延: 日足などの長い時間足では、バーの確定を待つことでエントリーが大幅に遅れる可能性があります。取引戦略に適した時間足を選択する必要があります。
形成中のバーを活用する戦略との相性:
リアルタイムシグナルの必要性: 一部の戦略では、形成中のバーでのリアルタイムシグナルが重要な場合があります。その場合、barstate.isconfirmedを使用するとチャンスを逃す可能性があります。
バックテスト結果の過信:
過去のデータバイアス: バックテストではバーがすべて確定しているため、barstate.isconfirmedを使用しないとリアルタイムでの結果と乖離が生じる可能性があります。しかし、barstate.isconfirmedを使っても、バックテスト結果を過信せず、市場の状況に応じて戦略を調整することが重要です。
barstate.isfirst
型:series bool
/@version=6
indicator(title = 'barstate.isfirst Example 3', shorttitle = 'Example 3')
var array<float> priceArray = array.new_float()
if barstate.isfirst
array.push(priceArray, close)
if not barstate.isfirst
array.push(priceArray, close + 1) // 例として終値に1を加えた値を格納
plot(array.get(priceArray, 0), title = 'First Value', color = color.red) // 配列の最初の値をプロット
plot(array.size(priceArray) > 1 ? array.get(priceArray, bar_index) : na, title = 'Second Value', color = color.blue) // 配列の二番目の値をプロット(存在する場合)
このスクリプトでは、最初のバーで空の浮動小数点数配列 priceArray を作成し、最初のバーの終値(194.234)を配列に追加します。
それ以降のバーでは、終値に1を加えた値(195.184)を配列に追加しています。
これにより、最初のバーとそれ以降のバーで異なる処理を行うことができます。
そのような処理が必要な場合があれば、使いたいですね。
barstate.ishistory
使い所
アラートやメッセージの重複を防ぐ
リアルタイムバーのみアラートが鳴る
//@version=5
strategy("Alert Example", overlay=true)
if ta.crossover(close, ta.sma(close, 20)) and not barstate.ishistory
alert("Price crossed above 20 SMA")
リアルタイムとバックテストで異なる動作を実装する
パフォーマンスの最適化
デバッグ情報の表示制御
描画オブジェクトの制御