Pine Script™ (v5) の覚書 - コラム : timeframeについて考える (1)
Pine Script(v5)の記事は本稿(全2話)が最終回です。Pine Script(v6)の記事を開始しているので、本稿以降はv6の記事を御覧ください。(実を言うと、本稿執筆中にPine Script(v6)がリリースされました。)
本稿では、request.security()の引数に関わる制限についてぼやいていますが、この部分の仕様はv5→v6で変更されました。v5の世界での話ということをご留意ください。
request.security()はわりと厄介
MTFの値を取り扱う際に、現在の時間軸(timeframe.period)に対する上位のtimeframeを指定し、request.security()で値を取得します。
この際、request.security()に渡す引数はstring型(simple string)で、以下のような書式が利用できます。
request.security(syminfo.tickerid,'1',timeframe.period)
//timeframeの選択肢
//'1S'末尾S 課金プランによって利用可
//'1'整数のみ 上限値は1440(分=24時間)
//'D'整数+末尾D 上限値は365(日=1年)
//'W'整数+末尾W 上限値は52(週=1年)
//'M'整数+末尾M 上限値は12(ヶ月=1年)
//na na値 現在のtimeframeの値を取得
timeframeそのものはstring型のため、値には何でも設定できますが、いざ、request.security()に食わせるとランタイムエラーが発生します。
また、timeframe.in_seconds()の引数とする場合、書式は同様ですが、上限値がチェックされません。(series stringかsimple stringかもチェックされません。)
また、自動的に上位のtimeframeを求めるために、例えば以下のような解き方も考えられますが、この方法ではうまくいきません。(myHtfがseries stringとなるため)
var tfList=array.from('1','5','15','60','240','D','W','M','3M','12M')//時間足スケールのH定義
myHtf = for _tf in tfList
index=tfList.indexof(_tf)
if timeframe.in_seconds()<timeframe.in_seconds(_tf)//現在足より大きい配列要素を発見するとループ停止
break
tfList.get(index+1)//indexはbreak前の周のループの値のため+1
このmyHtfをrequest.security()の引数として使うと、コンパイルエラーが発生します。
そこで、別の表現方法として、三項演算子を使った上位のtimeframe取得法として、本稿では以下のような方法を採用しています。
_s=timeframe.in_seconds(tf)
myHtf=timeframe.in_seconds("1")>_s?"1":
timeframe.in_seconds("5")>_s?"5":
timeframe.in_seconds("15")>_s?"15":
timeframe.in_seconds("60")>_s?"60":
timeframe.in_seconds("240")>_s?"240":
timeframe.in_seconds("D")>_s?"D":
timeframe.in_seconds("W")>_s?"W":
timeframe.in_seconds("M")>_s?"M":
timeframe.in_seconds("3M")>_s?"3M":
timeframe.in_seconds("12M")>_s?"12M":na
このmyHtfは、request.security()の引数として使うことが可能です。
まとめると
・timeframeそのものはstring型のため書式を守っている限り様々な値を設定できる。
・request.security()の引数として使う場合(普通この目的だと思います)には、制限(上限値とsimple string)に気を使わないと・・
つづく