こんにちは~。
MQLをマスターしたくて、トクホのコーラを飲んだから安心してたくさん食べて太るりょうです。
今回は前回作成したEAを改良してみる試みです。
前回RSIを使ったEAを作成しましたが、なんだか味気ないのでもう少し色々つけ足してみようと色々やったことを記事にしてみました。
ストキャスティクスをエントリー条件に追加してみた
早速ですが、今回作成したEAがこちらです↓。
//+------------------------------------------------------------------+
//| RSI_StochaFilter.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
enum SWITCH {
SWITCH_ON = 0,//オン
SWITCH_OFF = 1,//オフ
};
input SWITCH switchonoff = 0; //ストキャスティクスのスイッチ
input double p_buyLot = 0.05; //買い注文の時のロット
input uint p_slippage = 2; //許容スリップページ(pips)
input uint p_stopLoss = 200; //ストップロス
input int p_magicNumber = 5515459; //マジックナンバー 他のEAと当たらない値を使用する
input uint p_RSIPERIOD = 14; //RSIを計算する期間
input uint p_RSIupperlimit = 70; //RSI上限
input uint p_RSIlowerlimit = 30; //RSI下限
input uint p_stochasticPerK = 5; //%K期間 HLバンドを決める期間
input uint p_stochasticPerD = 3; //%D期間 ストキャスティクスの移動平均を取る期間
input uint p_stochasticPerSlow = 26; //ストキャスティクスを求める期間
input uint p_stochasticUpperlimit = 80; //ストキャスティクス上限
input uint p_stochasticLowerlimit = 20; //ストキャスティクス下限
datetime _newBarTime = 0;
bool _entryPermission = false;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
//---
//1本前のRSIの値を取得する
double RSI = iRSI( NULL, 0, p_RSIPERIOD, PRICE_CLOSE, 1 );
//ストキャスティクスの値を取得する
double Stchastic = iStochastic( NULL, 0, p_stochasticPerK, p_stochasticPerD, p_stochasticPerSlow, MODE_SMA, 1, MODE_MAIN, 1 );
//新しいローソク足に切り替わった時だけ実行する処理
if(_newBarTime != Time[0]) {
_newBarTime = Time[0];
//RSIが下限以上になるとエントリー許可を出す
if( RSIOverLowerLimit( RSI ) == true ) {
_entryPermission = true;
}
//決済条件
//エントリー中、RSIが上限を超すと決済する
for( int i = 0; i <= OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) {
if( RSIOverUpperLimit( RSI ) == true ) {
int result = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), p_slippage );
}
}
}
//エントリー条件
//RSIが下限以下(スイッチオン時、ストキャスティクスが下限以下)になるとロングエントリーする
if( _entryPermission == true &&
RSIUnderLowerLimit( RSI ) == true &&
StochasticUnderLowerLimit( Stchastic ) ) {
int result = OrderSend( Symbol(), OP_BUY, p_buyLot, Ask, p_slippage, 0, 0, NULL, clrRed );
//エントリーしたらエントリー許可をfalseにする
_entryPermission = false;
}
}
}
//+------------------------------------------------------------------+
//RSIが下限以下になるとtrue(エントリー条件に使用)
bool RSIUnderLowerLimit(double RSI) {
if( p_RSIlowerlimit >= RSI )return true;
else return false;
}
//+------------------------------------------------------------------+
//RSIが下限以上になるとtrue(エントリー許可フラグに使用)
bool RSIOverLowerLimit(double RSI) {
if( p_RSIlowerlimit <= RSI )return true;
else return false;
}
//+------------------------------------------------------------------+
//RSIが上限以上になるとtrue(決済条件に使用)
bool RSIOverUpperLimit(double RSI) {
if( p_RSIupperlimit <= RSI )return true;
else return false;
}
//+------------------------------------------------------------------+
//ストキャスティクスが下限以下になるとtrue(エントリー条件に使用)
bool StochasticUnderLowerLimit(double Stchastic ) {
if(switchonoff == SWITCH_OFF) return true;
else if( switchonoff == SWITCH_ON && p_stochasticLowerlimit >= Stchastic ) return true;
else return false;
}

エントリー条件にストキャスティクスが追加されているのだ



追加してみました
iStochastic()関数の()内の関数はこのようになっています。


最初2つの『通貨ペア』と『時間軸』と最後の『算出する位置』は以前のRSIの時やMAの時と同じですね。
『%Kの期間』、『%Dの期間』、『スローイング期間』はRSIの時と同じようにパラメータで設定しています。
MQLのストキャスティクスはスローイング期間に『1』を設定するとメインラインが『%K』のラインになり、シグナルラインは『%D』となります。いわゆるファストストキャスティクスです。
スローイング期間に『2以上』を設定するとメインラインが『%D』になり、シグナルラインは『S%D』となります。いわゆるスローストキャスティクスです。



『1』でファスト 『2以上』でスロー



ちゃんと覚えるにゃ
次の『移動平均の種類』についてはシグナルラインの算出方法です。今回のEAでは『MODE_SMA』を選択していますがそのほかにも『MODE_LWMA』、『MODE_SMMA』、『MODE_EMA』から選択できます。
次の『計算に使用する価格データ』は読んで字のごとく、『0』を設定したら高値・安値、『1』を設定したら終値を使って計算をします。
次の『表示させるライン』はメインとシグナルから選択します。ファストストキャスティクスの場合はメインが『%K』、シグナルが『%D』となり、スローストキャスティクスの場合はメインが『%D』、シグナルが『S%D』となります。



ファストかスローかは上に書いてあるようにスローイング期間の数字によって決まるんだよ
オンオフ機能のあるフィルターを設定しよう
今回、工夫してみた部分はこちらです。
enum SWITCH {
SWITCH_ON = 0,//オン
SWITCH_OFF = 1,//オフ
};
input SWITCH switchonoff = 0; //ストキャスティクスのスイッチ
//ストキャスティクスが下限以下になるとtrue(エントリー条件に使用)
bool StochasticUnderLowerLimit(double Stchastic ) {
if(switchonoff == SWITCH_OFF) return true;
else if( switchonoff == SWITCH_ON && p_stochasticLowerlimit >= Stchastic ) return true;
else return false;
}
これで何をしたかという事なのですが、『ストキャスティクスをエントリー条件に適用するかのオンオフ切り替えができる』ようになります。



状況によってエントリーの条件を変えられるのだ!!



これは便利な機能だぞ!



便利にゃ!
なのでこのEAは
スイッチオン・・・RSIとストキャスティクス両方で判定する
スイッチオフ・・・RSIのみで判定する
というEAなのです。
enum SWITCH {
SWITCH_ON = 0,//オン
SWITCH_OFF = 1,//オフ
};
input SWITCH switchonoff = 0; //ストキャスティクスのスイッチ
↑まずはこちらのenum型で『オンは0』『オフは1』という条件を作っておき、パラメーターでオンオフの切り替えができるようにしています。



最初に『input』を付けたらパラメーターで値を入れることができるのだ
その結果がこちらです↓。


パラメータ入力画面でオンオフの選択ができるようになっています!
次に判定条件の関数部分です↓。
//ストキャスティクスが下限以下になるとtrue(エントリー条件に使用)
bool StochasticUnderLowerLimit(double Stchastic ) {
if(switchonoff == SWITCH_OFF) return true;
else if( switchonoff == SWITCH_ON && p_stochasticLowerlimit >= Stchastic ) return true;
else return false;
}
スイッチがオンだった場合にストキャスティクスの判定をするように関数を作っています。
実際にオンオフさせてみた結果がこちらです↓。


↑こちらはストキャスティクスフィルターがオンだった場合です。
1つのエントリーしかしていません。



ふむ 確かに
続いてこちらです↓。


エントリーが2つになっています。



おおー
ストキャスティクスのフィルターがない分判定が広くなったぞ!
ということで状況に応じてオンオフができるフィルターの機能を追加してみました。
うまく活用していけば使い勝手の良いEAになりそうですね。



色んなテクニカルを盛り込んでオンオフできるようにしたら便利そうだね



通貨ペアとか時間足によってテクニカルを組み替えたりできそう



自分だけの最強EAを作るのにゃ