ストキャスティックスは、一定期間の最安値を0、最高値を100としたときに、終値がどのあたりに位置するかを示す指標です。
20以下で売られすぎ、80以上で買われすぎと判断すると、逆張りの仕掛けシグナルの目安となります。
ただし、ストキャスティックスでは、移動平均をとって平滑化したシグナルラインも表示されるので、ストキャスティックスとシグナルラインのゴールデンクロスで買いシグナル、デッドクロスで売りシグナルを出すことにします。
<aside> 💡 買いシグナル:1本前のストキャスティックスが20以下で、2本前から1本前にかけてストキャスティックスがシグナルラインを下から上に交差したとき 売りシグナル:1本前のストキャスティックスが80以上で、2本前から1本前にかけてストキャスティックスがシグナルラインを上から下に交差したとき
</aside>
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry, Lots);
}
input int KPeriod = 8; //ストキャスティクスの期間
input int DPeriod = 3; //移動平均の期間
input int SignalPeriod = 3; //シグナル用移動平均の期間
//仕掛けシグナル関数
int EntrySignal()
{
//1本前のストキャスティクス
double Stoch1 = iStochastic(_Symbol, 0, KPeriod, DPeriod, SignalPeriod, MODE_SMA, STO_LOWHIGH, MODE_MAIN, 1);
double Signal1 = iStochastic(_Symbol, 0, KPeriod, DPeriod, SignalPeriod, MODE_SMA, STO_LOWHIGH, MODE_SIGNAL, 1);
//2本前のストキャスティクス
double Stoch2 = iStochastic(_Symbol, 0, KPeriod, DPeriod, SignalPeriod, MODE_SMA, STO_LOWHIGH, MODE_MAIN, 2);
double Signal2 = iStochastic(_Symbol, 0, KPeriod, DPeriod, SignalPeriod, MODE_SMA, STO_LOWHIGH, MODE_SIGNAL, 2);
int ret = 0; //シグナルの初期化
//買いシグナル
if(Stoch2 <= Signal2 && Stoch1 > Signal1 && Stoch1 <= 20) ret = 1;
//売りシグナル
if(Stoch2 >= Signal2 && Stoch1 < Signal1 && Stoch1 >= 80) ret = -1;
return ret; //シグナルの出力
}
ストキャスティックスは、iStochastic()
というテクニカル指標関数で求められます。
%K期間、%D期間、および%Kスローイング期間として、別途宣言したKPeriod
、DPeriod
、SignalPeriod
をそれぞれ引数Kperiod
、Dperiod
、slowing
に代入します。
シグナルラインの算出に使う移動平均ma_method
は、MODE_SMA
(単純移動平均)、最高値・最安値を算出する価格の種類price_field
は、STO_LOWHIGH
(高値・安値)とします。
mode
の引数には、ストキャスティックスを求める場合、MODE_MAIN
を、シグナルラインを求める場合、MODE_SIGNAL
をそれぞれ代入します。
2本前のストキャスティックスStoch2
とシグナルラインSignal2
の大小関係、1本前のストキャスティックスStoch1
とシグナルラインSignal1
の大小関係により、シグナルを判定します。