1. MQL5の iStochastic とは何か
1.1 ストキャスティクス(Stochastic)の基本
ストキャスティクス(Stochastic)は、価格の位置関係をもとに相場の過熱状態を判断するテクニカル指標です。
主に「買われすぎ(Overbought)」や「売られすぎ(Oversold)」を判定するオシレーター系インジケーターとして知られています。
オシレーターとは、一定の範囲内で数値が上下するタイプの指標のことです。
ストキャスティクスの場合、値は通常 0〜100の範囲で変動します。
一般的に次のように解釈されます。
- 80以上 → 買われすぎ(上昇の勢いが強すぎる可能性)
- 20以下 → 売られすぎ(下落の勢いが強すぎる可能性)
ストキャスティクスは以下の 2本のラインで構成されています。
| ライン | 意味 |
|---|---|
| %K | 現在価格の位置を示すメインライン |
| %D | %Kの移動平均(シグナルライン) |
この2本のラインの関係から、次のようなシグナルを判断します。
- ゴールデンクロス
%Kが%Dを下から上へ抜ける → 買いシグナル - デッドクロス
%Kが%Dを上から下へ抜ける → 売りシグナル
ストキャスティクスは特に次のような相場でよく使われます。
- レンジ相場(価格が横ばいで動く相場)
- 短期トレード
- 逆張り戦略
ただし注意点として、強いトレンド相場では長時間80以上・20以下に張り付くことがあります。
そのため、ストキャスティクス単体で売買判断をするとダマシ(誤シグナル)が増える場合があります。
初心者がつまずきやすいポイントとして、次の2点があります。
よくある誤解
- 「80を超えたら必ず下がる」と思ってしまう
- 「20を割ったら必ず上がる」と思ってしまう
実際には、ストキャスティクスは 価格の勢い(モメンタム)を示す指標であり、
必ずしも反転を保証するものではありません。
そのため実務では、以下のような使い方が多くなります。
- トレンドフィルターと組み合わせる
- クロスシグナルを利用する
- 他インジケーターと併用する
1.2 MQL5の iStochastic の役割
iStochastic は、MetaTrader 5 のプログラム言語 MQL5 において、
ストキャスティクスインジケーターをプログラムから利用するための関数です。
MetaTraderでは、インジケーターは通常チャートに表示して使用しますが、
EA(Expert Advisor:自動売買プログラム)では、インジケーターの計算結果をプログラムから取得する必要があります。
そのために使われるのが iStochastic です。
役割を整理すると次の通りです。
| 役割 | 説明 |
|---|---|
| インジケーター生成 | ストキャスティクスを計算するインジケーターを作る |
| ハンドル取得 | インジケーターハンドル(識別番号)を取得 |
| 値取得の準備 | CopyBufferでデータ取得できるようにする |
ここで重要なのは、iStochasticは値を直接返す関数ではないという点です。
MQL5ではインジケーター値を取得する手順が次のようになっています。
- iStochasticでインジケーターハンドルを作成
- CopyBufferでデータを取得
- 配列から値を読み取る
この仕組みは MQL4と大きく異なる点であり、初心者が最も混乱するポイントの1つです。
初心者がよくつまずく点
- iStochasticが値を返すと思ってしまう
- CopyBufferを使わず値を取得しようとする
MQL5では、インジケーターは内部的にバッファ(データ配列)として管理されており、
プログラムからはそのバッファを読み取る形になります。
1.3 EA開発でよく使われる用途
EA開発では、ストキャスティクスは主に エントリータイミングの判断に使われます。
代表的な使用パターンは次の通りです。
① 過熱状態の判定
例
- %Kが 20以下 → 売られすぎ
- %Kが 80以上 → 買われすぎ
EAでは次のような条件で使われることがあります。
売られすぎ → 買い
買われすぎ → 売り
ただし、この方法はレンジ相場で有効になりやすいという特徴があります。
② クロスシグナル
ストキャスティクスでは %Kと%Dのクロスが重要なシグナルになります。
例
- %Kが%Dを上抜け → 買いシグナル
- %Kが%Dを下抜け → 売りシグナル
EAでは次のようなロジックになります。
if (%K crosses above %D)
Buy
③ トレンドフィルター
ストキャスティクスは単体ではダマシが出やすいため、
次のようなインジケーターと組み合わせることが多いです。
例
- Moving Average(移動平均)
- RSI
- ATR
例えば次のような条件です。
上昇トレンド(MA) + Stochastic売られすぎ → 買い
このようにすることで、無駄なエントリーを減らすことができます。
よくある失敗
EA初心者に多いのが次のようなケースです。
- ストキャスティクス単体で売買する
- 80 / 20だけで判断する
- クロス判定を正しく実装できていない
特にクロス判定では、現在バーと1本前の値を比較する必要があります。
この処理を誤ると、意図しないエントリーが発生することがあります。
2. MQL5 iStochastic の構文とパラメータ
2.1 iStochastic の基本構文
MQL5でストキャスティクスを使用する場合、iStochastic関数を使ってインジケーターハンドル(識別番号)を取得します。
基本構文は次の通りです。
int iStochastic(
string symbol,
ENUM_TIMEFRAMES period,
int Kperiod,
int Dperiod,
int slowing,
ENUM_MA_METHOD method,
ENUM_STO_PRICE price_field
);
この関数はストキャスティクスインジケーターのハンドル(handle)を返します。
ハンドルとは、MetaTrader内部でインジケーターを識別するための番号です。
重要な点として、iStochasticはインジケーター値を直接返すわけではありません。
返されるハンドルを使って、後から CopyBuffer関数で値を取得します。
処理の流れは次のようになります。
- iStochasticでハンドルを作成
- CopyBufferでデータ取得
- 配列から値を取り出す
この流れを理解していないと、次のようなエラーが起こりやすくなります。
よくある失敗
- iStochasticを直接double型で受け取る
- CopyBufferを使わず値を取得しようとする
- OnTickごとにハンドルを作成してしまう
特に3つ目はパフォーマンス低下の原因になります。
インジケーターハンドルは通常、OnInit()で1回だけ作成します。
2.2 各パラメータの意味
iStochasticのパラメータは7つあります。
それぞれの役割を理解しておくと、EA開発で柔軟に設定できるようになります。
| パラメータ | 説明 |
|---|---|
| symbol | 対象銘柄(例:”EURUSD”) |
| period | 時間足(例:PERIOD_H1) |
| Kperiod | %Kラインの期間 |
| Dperiod | %Dラインの期間 |
| slowing | スローイング(%Kの平滑化) |
| method | 移動平均の種類 |
| price_field | 計算に使用する価格 |
以下で重要なパラメータを説明します。
Kperiod
ストキャスティクスのメインライン(%K)を計算する期間です。
例
Kperiod = 5
この場合、過去5本の高値と安値の範囲の中で現在価格がどこに位置するかを計算します。
値を小さくすると
- 反応が速くなる
- ノイズが増える
値を大きくすると
- 反応が遅くなる
- シグナルが安定する
Dperiod
%Dライン(シグナルライン)の期間です。
%Dは%Kの移動平均として計算されます。
例
Dperiod = 3
これは多くのトレード手法で使われる標準設定です。
slowing
%Kラインを平滑化するパラメータです。
ノイズを減らす目的で使われます。
例
slowing = 3
初心者がよく混乱するポイントとして、Kperiodとslowingの違いがあります。
| 項目 | 意味 |
|---|---|
| Kperiod | 計算の基本期間 |
| slowing | 平滑化 |
つまり
Kperiod → 元データ
slowing → ノイズ除去
の役割になります。
method
%D計算に使う移動平均の種類です。
主な値
| 値 | 意味 |
|---|---|
| MODE_SMA | 単純移動平均 |
| MODE_EMA | 指数移動平均 |
| MODE_SMMA | 平滑移動平均 |
| MODE_LWMA | 加重移動平均 |
一般的には MODE_SMA が使われます。
price_field
ストキャスティクス計算に使う価格タイプです。
主な値
| 値 | 意味 |
|---|---|
| STO_LOWHIGH | 高値と安値を使用 |
| STO_CLOSECLOSE | 終値を使用 |
通常は STO_LOWHIGH が使われます。
これは標準的なストキャスティクスの計算方法です。
2.3 初心者に多い設定ミス
ストキャスティクスの設定では、次のミスが非常に多く見られます。
ミス① パラメータの順序を間違える
iStochasticはパラメータが多いため、順序ミスが起こりやすいです。
例
Kperiod
Dperiod
slowing
この順番を間違えると、全く違うインジケーターになります。
ミス② symbolとtimeframeを間違える
例
NULL
0
これは
現在の銘柄
現在の時間足
を意味します。
初心者はこの意味を知らず、異なる時間足のデータを取得できないことがあります。
ミス③ ストキャスティクス設定を変えすぎる
多くのEAでは次の設定が使われます。
5,3,3
これは最も一般的な設定です。
初心者が最初に行うべきなのは
- パラメータ調整ではなく
- ロジック設計
です。
パラメータを頻繁に変えると、過剰最適化(オーバーフィッティング)になる可能性があります。
3. CopyBufferでストキャスティクスの値を取得する方法
3.1 MQL5でインジケーター値を取得する基本手順
MQL5では、インジケーターの値は直接取得できません。
iStochasticでハンドルを作成し、CopyBufferで値を配列へコピーするという仕組みになっています。
処理の流れは次の通りです。
- iStochasticでインジケーターハンドルを作成
- CopyBufferでデータを取得
- 配列から値を読み取る
この構造は、MQL4のように
double value = iStochastic(...);
のような書き方ができない点が大きな違いです。
MQL5では、インジケーターの値は内部バッファ(データ配列)に保存されているため、そのバッファをCopyBufferで取得します。
3.2 ストキャスティクスのハンドル作成
まず、EAの初期化処理(通常は OnInit())でインジケーターハンドルを作成します。
例:
int stochasticHandle;
int OnInit()
{
stochasticHandle = iStochastic(
_Symbol,
_Period,
5,
3,
3,
MODE_SMA,
STO_LOWHIGH
);
return(INIT_SUCCEEDED);
}
ここで使われている値は、一般的なストキャスティクス設定です。
Kperiod = 5
Dperiod = 3
slowing = 3
重要なポイントとして、ハンドルは毎Tick作成しないことが挙げられます。
よくある間違い:
void OnTick()
{
int handle = iStochastic(...); // NG
}
これは毎Tickインジケーターを作成する処理になり、パフォーマンス低下の原因になります。
正しい方法は次の通りです。
OnInit → ハンドル作成
OnTick → 値取得
3.3 CopyBufferの使い方
ストキャスティクスの値を取得するには CopyBuffer関数を使用します。
基本構文:
CopyBuffer(
handle,
buffer_index,
start_pos,
count,
target_array
);
パラメータの意味は次の通りです。
| パラメータ | 意味 |
|---|---|
| handle | インジケーターハンドル |
| buffer_index | 取得するバッファ |
| start_pos | 取得開始位置 |
| count | 取得する数 |
| target_array | コピー先配列 |
3.4 ストキャスティクスのバッファ番号
ストキャスティクスには 2つのバッファがあります。
| バッファ番号 | 内容 |
|---|---|
| 0 | %Kライン |
| 1 | %Dライン |
つまり
buffer 0 → %K
buffer 1 → %D
になります。
3.5 %Kと%Dの取得コード例
実際のコード例です。
double kBuffer[];
double dBuffer[];
void OnTick()
{
CopyBuffer(stochasticHandle,0,0,3,kBuffer);
CopyBuffer(stochasticHandle,1,0,3,dBuffer);
double currentK = kBuffer[0];
double currentD = dBuffer[0];
}
このコードでは
kBuffer[0] → 現在バー
kBuffer[1] → 1本前
kBuffer[2] → 2本前
のデータを取得しています。
EAでは通常、現在値と1本前の値を比較してシグナルを判定します。
3.6 クロス判定の基本ロジック
ストキャスティクスのクロス判定では、現在バーと1本前のバーを比較します。
例:ゴールデンクロス
if(kBuffer[1] < dBuffer[1] && kBuffer[0] > dBuffer[0])
{
// Buy signal
}
例:デッドクロス
if(kBuffer[1] > dBuffer[1] && kBuffer[0] < dBuffer[0])
{
// Sell signal
}
このロジックは、EAで最もよく使われるストキャスティクスの利用方法です。
3.7 CopyBuffer使用時の注意点
CopyBufferを使う際には、初心者がつまずきやすいポイントがいくつかあります。
① データ取得に失敗する
CopyBufferは、データがまだ計算されていない場合 0を返すことがあります。
安全な書き方は次の通りです。
if(CopyBuffer(stochasticHandle,0,0,3,kBuffer) <= 0)
return;
これを入れないと、配列アクセスエラーが発生する場合があります。
② 配列サイズ不足
取得数より配列が小さいとエラーになります。
例
CopyBuffer(... , 3 , buffer);
なら
buffer[3]
以上のサイズが必要です。
③ ArraySetAsSeriesを忘れる
MQL5では配列を
ArraySetAsSeries(array,true);
に設定することで、最新バーが index 0になります。
これを設定しないと
index 0 → 最古データ
になり、EAのロジックが逆になることがあります。
3.8 よくある実装ミス
EA初心者に多いミスは次の通りです。
ミス1
kBuffer[0] と dBuffer[0] だけでクロス判定
→ クロス判定は 現在 + 1本前 が必要
ミス2
CopyBufferを毎Tick大量に呼ぶ
→ パフォーマンス低下
ミス3
インジケーターハンドル未作成
→ INVALID_HANDLEエラー
ストキャスティクスEAでは、値取得の正確さが売買ロジックの精度に直結します。
そのため、CopyBuffer処理は慎重に実装する必要があります。
4. EAで使われるストキャスティクスの実践ロジック
4.1 ストキャスティクスを使った基本エントリー
EAでストキャスティクスを利用する場合、最も一般的なのは %Kと%Dのクロスを利用したエントリーです。
ストキャスティクスは「相場の勢い(モメンタム)」を測る指標のため、
ラインの交差(クロス)によって相場の方向転換を検出することができます。
基本的なルールは次の通りです。
| シグナル | 条件 |
|---|---|
| 買い(Buy) | %Kが%Dを下から上へ抜ける |
| 売り(Sell) | %Kが%Dを上から下へ抜ける |
EAのロジックとしては次のようになります。
if(kBuffer[1] < dBuffer[1] && kBuffer[0] > dBuffer[0])
{
// Buy
}
if(kBuffer[1] > dBuffer[1] && kBuffer[0] < dBuffer[0])
{
// Sell
}
ここで重要なのは、現在バーと1本前のバーを比較することです。
初心者がよくやってしまうミスは次のようなものです。
よくある失敗
if(kBuffer[0] > dBuffer[0])
このような判定ではクロスが検出できません。
単に「今Kが上にある」という状態を判定しているだけになります。
クロスを正しく検出するには必ず
前バー
現在バー
の2点比較が必要です。
4.2 買われすぎ・売られすぎフィルター
ストキャスティクスは 0〜100の範囲で動くため、
特定の値を使ってエントリーをフィルターすることができます。
一般的な基準は次の通りです。
| 状態 | 値 |
|---|---|
| 買われすぎ | 80以上 |
| 売られすぎ | 20以下 |
EAでは次のような条件を追加することがあります。
買いエントリー
if(kBuffer[1] < dBuffer[1] &&
kBuffer[0] > dBuffer[0] &&
kBuffer[0] < 20)
{
// Buy
}
売りエントリー
if(kBuffer[1] > dBuffer[1] &&
kBuffer[0] < dBuffer[0] &&
kBuffer[0] > 80)
{
// Sell
}
この方法は、レンジ相場で特に有効です。
ただし注意点があります。
強いトレンドが発生すると、ストキャスティクスは
80以上に張り付く
20以下に張り付く
ことがあります。
この状態で逆張りを行うと、連続損失が発生する可能性があります。
4.3 トレンドフィルターとの併用
ストキャスティクス単体のEAは、実務ではあまり安定しません。
そのため、多くのEAでは トレンドフィルターを追加します。
代表的なのは 移動平均(Moving Average)です。
例:
上昇トレンド → 買いのみ
下降トレンド → 売りのみ
EAロジックの例:
if(kBuffer[1] < dBuffer[1] &&
kBuffer[0] > dBuffer[0] &&
Close[0] > ma)
{
// Buy
}
このようにすることで
- トレンド方向と逆のエントリー
- 不要な逆張り
を減らすことができます。
4.4 ダマシを減らすテクニック
ストキャスティクスの弱点は ダマシが多いことです。
そのため、実務では次のような工夫をすることがあります。
① クロス位置を制限する
例:
20以下のクロスだけ買う
80以上のクロスだけ売る
② 複数バー確認
1本だけではなく、2〜3本のバーで確認します。
例
2本連続で%K > %D
③ 上位足フィルター
例
H1トレンド
+
M5エントリー
この方法はEAで非常によく使われます。
4.5 EA開発での典型的なミス
ストキャスティクスEAでは、次のようなミスが非常に多く見られます。
ミス① 現在バーで判断する
現在バー(index 0)は まだ確定していないため、
シグナルが変わることがあります。
安全な方法は次の通りです。
index 1
index 2
確定バーで判定します。
ミス② 過剰最適化
ストキャスティクスのパラメータを細かく調整すると、
バックテストの結果が良くなることがあります。
しかしこれは
オーバーフィッティング
(過剰最適化)になる可能性があります。
一般的には次の設定が使われます。
5,3,3
まずはこの設定でロジックを検証するのが安全です。
ミス③ トレンド相場で逆張り
ストキャスティクスはレンジ相場向きの指標です。
トレンド相場で逆張りをすると
損失連続
になることがあります。
ストキャスティクスをEAで使う場合は、
クロス+フィルター+トレンド判定を組み合わせるのが基本になります。
5. iStochasticを使ったMQL5サンプルEAコード
5.1 サンプルEAの基本構造
ここでは、ストキャスティクスのクロスシグナルを使ったシンプルなEAの例を紹介します。
目的は、iStochastic → CopyBuffer → 売買判定という基本的な処理の流れを理解することです。
実装の流れは次の通りです。
- OnInitでインジケーターハンドル作成
- OnTickでCopyBufferにより値取得
- クロス判定
- 売買実行
この構造を理解すると、他のインジケーター(RSIやMACDなど)にも応用できます。
5.2 インジケーターハンドルの作成
まず、EAの初期化処理でストキャスティクスを作成します。
int stochasticHandle;
int OnInit()
{
stochasticHandle = iStochastic(
_Symbol,
_Period,
5,
3,
3,
MODE_SMA,
STO_LOWHIGH
);
if(stochasticHandle == INVALID_HANDLE)
{
Print("iStochastic作成失敗");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
ここでは、よく使われる設定を使用しています。
Kperiod = 5
Dperiod = 3
slowing = 3
初心者がよくやるミスとして、OnTick内でiStochasticを作成してしまうケースがあります。
例(誤り)
void OnTick()
{
int handle = iStochastic(...);
}
これは毎Tickインジケーターを作るため、処理負荷が増えます。
必ず OnInitで1回だけ作成してください。
5.3 ストキャスティクスの値を取得
次に、CopyBufferを使ってストキャスティクスの値を取得します。
double kBuffer[];
double dBuffer[];
void OnTick()
{
ArraySetAsSeries(kBuffer,true);
ArraySetAsSeries(dBuffer,true);
if(CopyBuffer(stochasticHandle,0,0,3,kBuffer) <= 0)
return;
if(CopyBuffer(stochasticHandle,1,0,3,dBuffer) <= 0)
return;
}
ストキャスティクスには次の2つのバッファがあります。
| バッファ | 内容 |
|---|---|
| 0 | %Kライン |
| 1 | %Dライン |
つまり
kBuffer → %K
dBuffer → %D
になります。
配列のインデックスは次の意味です。
| index | 意味 |
|---|---|
| 0 | 現在バー |
| 1 | 1本前 |
| 2 | 2本前 |
5.4 クロスシグナル判定
ストキャスティクスEAでは、%Kと%Dのクロスを利用するのが基本です。
買いシグナル
if(kBuffer[1] < dBuffer[1] && kBuffer[0] > dBuffer[0])
{
Print("Buy signal");
}
売りシグナル
if(kBuffer[1] > dBuffer[1] && kBuffer[0] < dBuffer[0])
{
Print("Sell signal");
}
このロジックでは
1本前
現在
の関係を比較しています。
初心者がやりがちなミスは次のようなものです。
誤り
kBuffer[0] > dBuffer[0]
これはクロス判定ではなく、単なる位置判定になります。
5.5 売買ロジックの実装例
次に、実際のエントリー条件の例です。
if(kBuffer[1] < dBuffer[1] &&
kBuffer[0] > dBuffer[0] &&
kBuffer[0] < 20)
{
// Buy
}
これは次の条件を意味します。
売られすぎゾーン
+
ゴールデンクロス
売り条件
if(kBuffer[1] > dBuffer[1] &&
kBuffer[0] < dBuffer[0] &&
kBuffer[0] > 80)
{
// Sell
}
これは
買われすぎ
+
デッドクロス
になります。
このような条件は、レンジ相場で特に有効です。
5.6 EA開発での注意点
ストキャスティクスをEAで使う際には、いくつか重要な注意点があります。
① 未確定バーの問題
現在バー(index 0)は、まだ確定していない価格です。
そのため
クロス → 消える
という現象が起こることがあります。
安全な方法は
index 1
index 2
の確定バーで判定することです。
② データ不足エラー
チャート読み込み直後などでは、
CopyBufferが十分なデータを返さない場合があります。
そのため
if(CopyBuffer(...) <= 0)
return;
というチェックは必ず入れておきます。
③ 過剰エントリー
ストキャスティクスだけでEAを作ると
ダマシ
連続エントリー
が発生しやすくなります。
対策としては
- 移動平均
- RSI
- ATR
などのフィルターを追加することが一般的です。
このように iStochastic → CopyBuffer → クロス判定の流れを理解すれば、
ストキャスティクスを使ったEAは比較的簡単に実装できます。
6. iStochasticでよくあるエラーとトラブルシューティング
6.1 INVALID_HANDLE エラー
iStochasticを使用する際に、最も多いエラーの1つが INVALID_HANDLE です。
これは、インジケーターハンドルの作成に失敗している状態を意味します。
例:
int handle = iStochastic(...);
if(handle == INVALID_HANDLE)
{
Print("Indicator error");
}
このエラーが発生する主な原因は次の通りです。
| 原因 | 説明 |
|---|---|
| パラメータ設定ミス | 関数引数が正しくない |
| チャート未初期化 | 価格データがまだ読み込まれていない |
| シンボル指定ミス | 存在しない銘柄を指定している |
特に初心者に多いのが symbol指定ミスです。
例:
iStochastic("EURUSD",PERIOD_H1,...)
この場合、ブローカーによっては
EURUSDm
EURUSD.pro
などのシンボル名になっていることがあります。
安全な方法は次の通りです。
iStochastic(_Symbol,_Period,...)
これなら現在チャートの銘柄と時間足を自動的に使用します。
6.2 CopyBufferが0を返す
CopyBufferは、データ取得に失敗すると 0または負数を返します。
例:
CopyBuffer(handle,0,0,3,buffer)
戻り値
3 → 成功
0 → 取得失敗
-1 → エラー
この問題が起きる主な原因は次の通りです。
| 原因 | 説明 |
|---|---|
| データ未ロード | チャート履歴が不足 |
| インジケーター未計算 | 初期化直後 |
| バッファ番号ミス | 存在しないバッファ |
そのため、EAでは必ず次のチェックを行います。
if(CopyBuffer(handle,0,0,3,kBuffer) <= 0)
return;
このチェックを入れないと、次のエラーが発生することがあります。
array out of range
6.3 Array Out Of Range エラー
MQL5初心者がよく遭遇するのが
array out of range
エラーです。
これは 配列サイズより大きなインデックスを参照した場合に発生します。
例:
double buffer[];
CopyBuffer(handle,0,0,3,buffer);
double value = buffer[5]; // エラー
取得数が3なら
buffer[0]
buffer[1]
buffer[2]
までしか存在しません。
対策は次の通りです。
ArrayResize(buffer,3);
または
double buffer[3];
のようにサイズを確保します。
6.4 配列インデックスの逆転問題
MQL5では配列を設定しない場合、インデックスの意味が次のようになります。
| index | 意味 |
|---|---|
| 0 | 最古データ |
| 最後 | 最新データ |
しかしEAでは通常
index0 → 最新バー
の方が扱いやすいです。
そのため、次の設定を行います。
ArraySetAsSeries(buffer,true);
この設定を忘れると
- クロス判定
- インジケーター判定
が逆になる可能性があります。
6.5 クロス判定が正しく動かない
ストキャスティクスEAでは、クロス検出のミスがよく発生します。
誤った例
if(kBuffer[0] > dBuffer[0])
これは
現在Kが上
という状態を判定しているだけです。
クロス判定には必ず
現在
+
1本前
が必要です。
正しい例
if(kBuffer[1] < dBuffer[1] &&
kBuffer[0] > dBuffer[0])
この2点比較がクロス検出の基本です。
6.6 ストキャスティクスEAの誤解
初心者がよく持つ誤解があります。
誤解1
80 → 必ず下落
誤解2
20 → 必ず上昇
実際にはストキャスティクスは
モメンタム指標
であり、反転保証ではありません。
特にトレンド相場では
80以上張り付き
20以下張り付き
が発生します。
そのため、実務では
- 移動平均
- RSI
- ATR
などを組み合わせて使うことが多くなります。
6.7 実運用でのチェックポイント
ストキャスティクスEAを作成する場合、次の項目を確認しておくとトラブルを減らせます。
チェックリスト
- iStochasticハンドル作成はOnInit
- CopyBufferの戻り値チェック
- ArraySetAsSeries設定
- クロス判定ロジック確認
- バッファ番号確認
この5点を守るだけでも、多くのエラーを防ぐことができます。
7. MQL5 iStochasticに関するFAQ
7.1 iStochasticは値を直接取得できないのですか?
できません。
MQL5では、インジケーターの値は次の手順で取得します。
1. iStochastic → インジケーターハンドル作成
2. CopyBuffer → データ取得
3. 配列 → 値参照
これはMQL4と大きく異なる仕様です。
MQL4では
double value = iStochastic(...);
のように直接取得できましたが、MQL5ではハンドル方式になっています。
7.2 ストキャスティクスの%Kと%Dはどのバッファですか?
ストキャスティクスには2つのバッファがあります。
| バッファ番号 | 内容 |
|---|---|
| 0 | %Kライン |
| 1 | %Dライン |
例:
CopyBuffer(handle,0,0,3,kBuffer); // %K
CopyBuffer(handle,1,0,3,dBuffer); // %D
この番号を間違えると、EAのロジックが正常に動作しません。
7.3 ストキャスティクスの標準パラメータは何ですか?
多くのトレード手法では、次の設定が使用されています。
Kperiod = 5
Dperiod = 3
slowing = 3
つまり
5,3,3
です。
ただし、最適な設定は
- 銘柄
- 時間足
- トレード戦略
によって変わるため、バックテストで確認することが重要です。
7.4 ストキャスティクスはどの相場で有効ですか?
ストキャスティクスは主に
レンジ相場
で効果を発揮します。
理由は、ストキャスティクスが
価格の位置(モメンタム)
を測る指標だからです。
一方で
強いトレンド相場
では次の状態が発生します。
80以上に張り付く
20以下に張り付く
このため、トレンド相場では逆張りが機能しない場合があります。
7.5 クロス判定はどのバーを使うべきですか?
安全な方法は
確定バー
を使うことです。
つまり
index1
index2
を使います。
例:
if(kBuffer[2] < dBuffer[2] &&
kBuffer[1] > dBuffer[1])
{
// Buy
}
現在バー(index0)は未確定のため、途中でシグナルが消えることがあります。
7.6 CopyBufferが0を返すのはなぜですか?
主な原因は次の通りです。
| 原因 | 説明 |
|---|---|
| 履歴不足 | チャートの価格データ不足 |
| インジケーター未計算 | 初期化直後 |
| ハンドルエラー | INVALID_HANDLE |
そのため、次のようなチェックを入れることが重要です。
if(CopyBuffer(handle,0,0,3,kBuffer) <= 0)
return;
7.7 ストキャスティクスだけでEAを作れますか?
技術的には可能ですが、実運用では安定しにくいことが多いです。
理由は次の通りです。
- ダマシが多い
- トレンド相場で弱い
- 逆張り依存になりやすい
そのため、実務では次のインジケーターと組み合わせることが多くなります。
移動平均(MA)
RSI
ATR
ボリンジャーバンド
ストキャスティクスは、エントリータイミングの補助指標として使うのが一般的です。