既刊のEA記事群では、datetime型の変数にTime[0]を記録しておき、
前回と値が変わっていれば、
「新しいバーが来た」と判定するIsNewBar()という、
自作パターンを繰り返し使ってきました。
この記事では、
Pine Scriptのbarstate.isconfirmedと、
barstate.islastが同じ「バーの状態」をどう表すのか、
MQL4版との違いを対比しながら解説します。
・既刊IsNewBar自作パターンのおさらい
・isconfirmed/islastのシグネチャと意味
・IsNewBarとisconfirmedの対応関係
・islastだけが持つ、IsNewBarには無い役割
- 既刊IsNewBarパターンとbarstate名前空間のおさらい
- なぜPine Scriptにこの2つの変数が必要なのか
- IsNewBarとbarstate.isconfirmedの対応関係
- barstate.islastの役割(IsNewBarには無い発想)
- MQLとPine Scriptのコード比較
- 実際に動くPine Scriptのサンプルコード
- TradingViewでの貼り付け・実行手順
- よくあるエラーと注意点
- よくある質問
- 【Pine Script入門】barstate.isconfirmed/barstate.islastの使い方をMQLユーザー向けに解説してみた(新しいバー判定IsNewBarとの比較):まとめ
既刊IsNewBarパターンとbarstate名前空間のおさらい
まず、MQL4側とPine Script側、それぞれの前提を振り返ります。
IsNewBar()の実装
datetime lastBarTime = 0;
bool IsNewBar()
{
if(Time[0] != lastBarTime)
{
lastBarTime = Time[0];
return(true);
}
return(false);
}
直近のバーの開始時刻を変数に保存し、次のOnTick()で値が変わっていれば、
新しいバーが来たと判定します。
barstate.isconfirmedのシグネチャ
barstate.isconfirmed → series bool
ヒストリカルバーでは常にtrue、
リアルタイムバーでは確定した最後のティックでのみtrueになります。
barstate.islastのシグネチャ
barstate.islast → series bool
今計算しているバーが、チャート上の最新バーかどうかを示します。
なぜPine Scriptにこの2つの変数が必要なのか
MQL4とPine Scriptでは、コードが実行されるタイミングの前提が違います。
MQL4: OnTick()は値動きのたびに呼ばれる
MQL4のEAは、新しい価格が来るたびにOnTick()が呼ばれます。
IsNewBar()は、その中から「バーが変わった瞬間」だけを自分で抜き出す仕組みです。
Pine Script: スクリプト全体がティックごとに再計算される
Pine Scriptは、リアルタイムバーの間、ティックが来るたびに、
スクリプト全体の計算結果が更新されます。
「確定したバーだけで処理したい」という同じ悩み
・MQL4もPine Scriptも、未確定の価格で判断するのを避けたい
・MQL4はIsNewBar()で「新しいバーの最初の1回」に絞る
・Pine Scriptはisconfirmedで「確定した最後の1回」に絞る
IsNewBarとbarstate.isconfirmedの対応関係
2つの考え方は、タイミングの捉え方が逆向きです。
IsNewBarは「バーが変わった瞬間」を見る
新しいバーが開いた直後の1回だけtrueになります。
isconfirmedは「バーが閉じる瞬間」を見る
・isconfirmedは、バーが開いた瞬間ではなく閉じる瞬間にtrueになる
・新しいバーが開いた直後の最初のティックでは、まだfalseのまま
・結果的に『前のバーが確定した』タイミングを知らせる変数になる
実務上はほぼ同じ目的に使える
新しいバーが来たということは、前のバーが確定したということでもあるため、
「確定したバーの値だけで判断する」という目的には、どちらも使えます。
barstate.islastの役割(IsNewBarには無い発想)
barstate.islastは、isconfirmedとは別の問題を解決します。
ヒストリカルバー全部で処理が走ってしまう問題
Pine Scriptは、チャートの最初のバーから最後のバーまで、
全てのヒストリカルバーに対してスクリプトを1回ずつ実行します。
ラベルやテーブルを1回だけ描きたい場合
価格ラベルやテーブルを毎バー描画すると、
過去のチャート全体に同じ描画が繰り返されてしまいます。
MQL4には存在しない発想
MQL4のインジケーターは最初から全バー分を一括計算するため、
「最新バーかどうか」を自分で気にする必要がほとんどありません。
MQLとPine Scriptのコード比較
「確定したバーでだけ1回処理する」という同じ目的のコードを比較します。
MQL4版: IsNewBarでガードする
void OnTick()
{
if(!IsNewBar())
return;
Print("新しいバーが確定しました: ", TimeToString(Time[1]));
}
Pine Script版: isconfirmedでガードする
if barstate.isconfirmed
label.new(bar_index, high, "確定")
MQL4がreturnで処理を打ち切る形に対し、
Pine Scriptはif文の中に処理を書く形になります。
実際に動くPine Scriptのサンプルコード
確定したバーの終値を記録し、最新バーにだけラベルを表示するサンプルです。
//@version=6
indicator("Barstate Sample", overlay = true)
var float lastConfirmedClose = na
if barstate.isconfirmed
lastConfirmedClose := close
if barstate.islast
label.new(bar_index, high, "直近確定終値: " + str.tostring(lastConfirmedClose),
style = label.style_label_down, color = color.blue)
isconfirmedで値を記録し、islastで「最新バーの時だけ」
ラベルを出す、という2段構えの設計です。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- チャートの右端に、直近確定終値のラベルが1つだけ表示されることを確認する
- チャートをスクロールして過去のバーを見ても、ラベルが増えていないことを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
varを付けずに変数を宣言する
・varを付けない変数は、毎バーの計算開始時に初期値へリセットされる
・『値を持ち越したい変数』には必ずvarを付ける
・IsNewBarのstatic/datetime変数と同じ役割をvarが担っている
isconfirmedとislastを混同する
isconfirmedは「このバーの計算が確定したか」、
islastは「このバーが一番新しいバーか」という、
別の軸の判定です。
strategy()スクリプトでは扱いが変わる
strategyスクリプトは、
デフォルトの発注タイミングがisconfirmedと近い動きをするため、
インジケーターほど明示的にisconfirmedを書く場面は少なくなります。
よくある質問
barstate.isconfirmed/barstate.islastについて、
よく検索される疑問に回答します。
・リペイント(表示が後から変わる)を避けたい処理は、必ずisconfirmedで囲む
・描画系の処理で過去バーに重複表示が増えたら、まずislastの付け忘れを疑う
・既刊IsNewBarの考え方は、isconfirmedに置き換えてほぼそのまま移植できる
barstate.isnewという変数もあると聞きましたが、違いは何ですか?
barstate.isnewは、新しいバーの最初のティックでtrueになる変数です。
タイミングの向きとしては、
isconfirmedよりIsNewBar()に近い動きをします。
ただし、isnewはisconfirmedほど広く使われていないため、
本記事では既刊パターンとの対応がより明確なisconfirmedを中心に解説しました。
isconfirmedがtrueにならないままスクリプトが終わることはありますか?
ヒストリカルバー(過去のバー)の計算では、isconfirmedは常にtrueなので、
この心配はありません。
リアルタイムバーの場合のみ、バーが閉じるまでfalseのままになります。
MQL5にもIsNewBarと同じ自作パターンはありますか?
あります。
MQL5でもTime[0]に相当するiTime()や、
CopyTime()で取得した最新バーの時刻を比較する、
同じ考え方のパターンが使われます。
【Pine Script入門】barstate.isconfirmed/barstate.islastの使い方をMQLユーザー向けに解説してみた(新しいバー判定IsNewBarとの比較):まとめ
Pine Scriptのbarstate.isconfirmedは、
既刊IsNewBar自作パターンと同じ、
「確定した値だけで判断したい」という悩みを、
逆の方向(バーが閉じる瞬間)から解決する変数です。
barstate.islastは、
ヒストリカルバー全体にスクリプトが実行される、
Pine Script特有の事情に対応するIsNewBarには無い発想の変数です。
コメント