既刊のiStochastic関数の記事では、%Kと%Dという2本の線を、
1つの関数呼び出しで取得できる書式を解説しました。
この記事では、Pine Scriptのta.stochが同じストキャスティクスを、
どう計算するのか、そして%Dの扱いがMQL4版とどう違うのかを対比しながら解説します。
・ta.stochのシグネチャと戻り値
・既刊iStochasticとの最大の違い(%Dは自分でta.smaする)
・slowing引数に相当する処理をPine Scriptでどう書くか
・Pine Scriptで動くサンプルコード
既刊iStochasticのおさらい
まず、MQL4側の仕様を振り返ります。
iStochasticの引数
double iStochastic( string symbol, int timeframe, int Kperiod, int Dperiod, int slowing, int method, int price_field, int mode, int shift );
既刊記事で解説した通り、
Kperiod・Dperiod・slowing・methodという、
4つの引数を1つの関数呼び出しの中に詰め込んでいる点が特徴です。
%Kと%Dは同じ関数を2回呼んで取り分ける
・mode=0(MODE_MAIN)を指定すると%Kが返る
・mode=1(MODE_SIGNAL)を指定すると%Dが返る
・%Kと%Dを両方使うには、同じ引数でmodeだけ変えて2回呼ぶ
slowingとmethodが担っている役割
slowingは、生の%Kに追加で平滑化をかける期間です。
methodは、平滑化の種類を選ぶ引数です。
SMA・EMA・SMMA・LWMAの4種類から選べます。
つまりiStochasticは、計算と平滑化の両方を1つの関数の中で済ませています。
ta.stochのシグネチャ
次に、Pine Script側の関数を確認します。
引数と戻り値
ta.stoch(source, high, low, length) → series float
sourceには、%Kの基準にしたい価格シリーズ(通常はclose)を渡します。
戻り値は「生の%K」だけ
戻り値の計算式は、以下の通りです。
%K = 100 × (source − lowest(low, length)) ÷ (highest(high, length) − lowest(low, length))
iStochasticのslowing・methodに相当する平滑化は、
一切含まれていません。
名前空間ta.を忘れない
ta.highest/ta.lowestと同様、
ta.stochも必ずta.という名前空間付きで呼び出します。
最大の違い: %Dとslowingは自分で作る
・ta.stochは%Dを返さない、必要なら自分でta.smaを呼ぶ
・slowingに相当する平滑化も、別のta.sma呼び出しで追加する
・1つの関数で完結させず、小さな関数を組み合わせる設計になっている
%Dはta.smaで自分で計算する
k = ta.stoch(close, high, low, 14) d = ta.sma(k, 3)
生の%Kをkに入れ、そのkをta.smaに渡すことで%Dを作ります。
slowingに相当する処理も同じ考え方
rawK = ta.stoch(close, high, low, 14) slowK = ta.sma(rawK, 3) slowD = ta.sma(slowK, 3)
iStochasticのslowing=3・method=SMAに近い動きは、
このように2段のta.smaで再現します。
なぜ関数を分けたのか
Pine Scriptは、1つの大きな関数に全部詰め込むのではなく、
小さな関数を組み合わせて書くという設計思想を、言語の各所で採用しています。
ta.stoch+ta.smaの組み合わせも、その一例です。
MQLとPine Scriptのコード比較
同じ「14期間・スロー3・SMA」のストキャスティクスを、実際のコードで比較します。
MQL4版: 1回の呼び出しで%K・%Dを得る
double k = iStochastic(_Symbol, 0, 14, 3, 3, MODE_SMA, 0, MODE_MAIN, 0); double d = iStochastic(_Symbol, 0, 14, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0);
引数は同じまま、modeだけを切り替えて2回呼び出します。
Pine Script版: 3行で組み立てる
rawK = ta.stoch(close, high, low, 14) slowK = ta.sma(rawK, 3) slowD = ta.sma(slowK, 3)
MQL4が1回の呼び出しで済ませていた処理を、
Pine Scriptでは3行に分けて組み立てます。
実際に動くPine Scriptのサンプルコード
%Kと%Dを表示し、買われすぎ・売られすぎのラインも引くサンプルです。
//@version=6
indicator("Stochastic Sample", overlay = false)
kPeriod = input.int(14, title = "%K期間")
slowing = input.int(3, title = "スロー期間")
dPeriod = input.int(3, title = "%D期間")
rawK = ta.stoch(close, high, low, kPeriod)
slowK = ta.sma(rawK, slowing)
slowD = ta.sma(slowK, dPeriod)
plot(slowK, title = "%K", color = color.blue)
plot(slowD, title = "%D", color = color.orange)
hline(80, title = "買われすぎ", color = color.red)
hline(20, title = "売られすぎ", color = color.green)
既刊iStochasticのKperiod/Dperiod/
slowing/methodという、
4引数をinput.intで同じ意味のパラメーターとして再現しています。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- サブウィンドウに青(%K)・オレンジ(%D)の2本の線が表示されることを確認する
- 入力パネルでkPeriod・slowing・dPeriodの値を変え、線の動きがどう変わるか確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
lengthにseries int型の変数を渡す
・ta.highest/ta.lowestと同様
・lengthはsimple int/input int/const intのみ受け付ける
・バーごとに変わるseries int型の変数は渡せない
・計算の途中で動的に変える値はlengthに使えない
sourceを省略できない
ta.highest/ta.lowestはsourceを省略できましたが、
ta.stochのsourceは必須の引数で、省略はできません。
slowing=1の意味を忘れる
ta.sma(rawK, 1)のように平滑化期間を1にすると、
平滑化はほぼかからず、生の%Kに近い値のままになります。
iStochasticのslowing=1(平滑化なし)と同じ考え方です。
よくある質問
ta.stochについて、よく検索される疑問に回答します。
・%Dだけ欲しい場合でも、必ず先にrawK(生の%K)を変数に入れておく
・既刊の%K/%Dクロス判定の考え方(クロスした瞬間だけを見る)もそのまま応用できる
・平滑化のMA種別を変えたい場合はta.smaを別の関数に置き換えるだけでよい
既刊iStochasticのprice_field引数に相当する指定はできますか?
できます。
price_field=1(Close/Close basis)に相当する処理は、
ta.stochのsourceにcloseを渡すことで再現できます。
price_field=0(Low/High basis、デフォルト)に相当する処理は、
sourceにhlc3や別の価格シリーズを渡すことで近づけられますが、
内部の計算範囲(high/lowシリーズ自体)は変わらないため、
完全に同じ値にはなりません。
既刊methodのSMA以外(EMA・SMMA・LWMA)に相当する指定はできますか?
できます。
ta.smaをta.ema・ta.rma・ta.wmaに置き換えるだけです。
MQL4のSMMA(平滑移動平均)は、
Pine ScriptのRMA(ta.rma)にほぼ相当します。
MQL5版のiStochasticはありますか?
関数名自体はMQL5にも存在しますが、取得方法が異なります。
既刊copybuffer.md・irsi-mql5.mdで解説した通り、
MQL5はIndicatorCreateでハンドルを作り、
CopyBufferで値を取り出す方式になります。
【Pine Script入門】ta.stochの使い方をMQLユーザー向けに解説してみた(iStochasticとの比較):まとめ
Pine Scriptのta.stochは、既刊iStochasticとは違い、
生の%Kだけを1回の呼び出しで返します。
%Dやslowingに相当する平滑化は、
ta.smaなどの別関数を組み合わせて自分で作る必要があり、
MQL4の「1つの関数に全部詰め込む」設計とは対照的です。
コメント