既刊の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は自分で作る

MQL4ユーザーが驚くポイント
・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で動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. サブウィンドウに青(%K)・オレンジ(%D)の2本の線が表示されることを確認する
  5. 入力パネルで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つの関数に全部詰め込む」設計とは対照的です。

関連記事