銭山田

MQLのコードを黙々と連ねる。

RSIのゴールデンクロス、デッドクロスで売買するEA:レベルスレッショルドを導入。

昨日のスクリプトにレベルスレッショルドなフィルターを追加してみた。 RSI値が70以上でSellエントリ、70未満だとエントリしない、的な。

結果から‥ f:id:zeniyamada:20210119234409p:plain

上(青枠)がレベルスレッショルドON。下(赤枠)がOFF。 ONが惨敗。ここまでひどいのはたぶんイグジットにもレベルスレッショルドが効いてしまっているから‥ではなかろうか?

明日はひとつ前にもどってエントリーとイグジットのシグナルを別にしてみましょ。

[コード]

/*
MMMMMMMMMMMMMMMMM""!(.........?""MMMMMMMMMMMMMMMMM
MMMMMMMMMMMM#"`.gMMMMMMMMMMF7TWMMN.,"HMMMMMMMMMMMM
MMMMMMMMMM".     .MMMMMMMMMb     (MMMa,?MMMMMMMMMM
MMMMMMM#^.M^     ?"WMMMMMMM#    (Mm.?"MMe,WMMMMMMM
MMMMMM^.MMt   .MN.   (MMMMM#    -MMN.  ?MMe,MMMMMM
MMMMF.MMM$   .MMMN.    MMMMN    ,MMMN   .MMN,TMMMM
MMMD.MMMt   .MMMMMN,  .MMMMM    .MMMMNJ.J^?MMe?MMM
MMD.MMM^   (MMMMM"WMMMHH""""`    """"""B`   .TpJMM
MF.MMM'  .MMMMM#`  .WNggggNN[    dNNNNNNNNNggg+c4M
M_MMB`  ._     ......dMMMMMM]    dMMMMMM#?WMMMMN.M
F.MD .+MMM~   ,MMMMMMMMMMMMMF    JMMMMMD    TMMM]J
\d^.dMMMMM    ,MMMB`?MMe.....    ..(J+ggggggNMMMN,
~NMMMMMMMM    .MMD    ?MMMMMN     MMMMMMMMM^TMMMN.
_N........    ..........MMMMM-    MMMMMMMF    -TM.
)d#"MMMMMM    ,MMM!7WMMMMMMMM]    J"""7<-....Jgg#.
b-Mb .TMMM_   ,MMF     .......     MMM#^?WMMMMMM](
N.MM|  ,MM|   .MM%   .MMMMMMMM]    -M=     ?MMM#.M
Mb,Mb   .M]   .M#  .MMMMMMMMMMN.        .(gMM#4%(M
MMpJM.   JF    MF .MMMMMMMMMMMMN      .dMMMMF.t.MM
MMMpJN,..M#    M-JMMMM""=jMMMMM"      ?HMMM^ !.MMM
MMMMm,MMMMM    ?"!   ..MMMMMH=   .,          (MMMM
MMMMMN,          ..gMMMMMM#^   .+MMm.      .MMMMMM
MMMMMMMN,   ..(MMMMMMMMM"   ..MMMMMMMNJ, .dMMMMMMM
MMMMMMMMMNJ,TMMMMMMMM"` ..gMMMMMMMMMM9<.MMMMMMMMMM
MMMMMMMMMMMMNJ,7"M%...NMMMMMMMMMM""(.MMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNgJ..?7""""7>(..gMMMMMMMMMMMMMMMMM

Copyright : zeniyamada
Twitter : https://twitter.com/zeniyamada
*/

//+------------------------------------------------------------------+
//|                                       ZeniEA_RSI_CrossSignal.mq5 |
//|                                                       zeniyamada |
//|                                   https://twitter.com/zeniyamada |
//+------------------------------------------------------------------+
#property copyright "zeniyamada"
#property link      "https://twitter.com/zeniyamada"
#property version   "1.00"

#property strict
#include <LibEA.mqh>  // <>をつかうことで共通ライブラリを MQL5/Include/. 以下におけばOK。(当mqlと共通ライブラリを同じ場所でなくてよい)

sinput double Lots = 0.1; // 売買Lot数
input ENUM_TIMEFRAMES eRSI_timeflame = PERIOD_CURRENT ;     // 適応する時間軸
// sinput はバックテスト時に値を変更できなくなる。https://labo.gogojungle.co.jp/articles/20
input int iRSI_period_fast = 5;       // 短期RSIの移動平均期間
input int iRSI_period_slow = 14;  // 長期RSIの移動平均期間
input ENUM_APPLIED_PRICE eRSI_applied_price_fast = PRICE_CLOSE; // 短期RSIの適用価格
input ENUM_APPLIED_PRICE eRSI_applied_price_slow = PRICE_CLOSE; // 長期RSIの適用価格
input int iRSI_shift_fast = 1;        // 短期RSIの左へのシフト数
input int iRSI_shift_slow = 1;        // 短期RSIの左へのシフト数

//---Ver1.01
input bool bRSI_level_threshold = true;       // RSIのレベル適応スイッチ
input double dRSI_level_threshold_slow_value_buy = 30;        // SlowRSI2がこの値以下でクロスするならBuyする
input double dRSI_level_threshold_slow_value_sell = 70;       // SlowRSI2がこの値以上でクロスするならSellする

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---

//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void Tick() {      // MQL5の場合はこちら
//void OnTick() {  // MQL4の場合はこちらを使用
    int sig_entry = EntrySignal(); // 仕掛けシグナルを発動。
//---
    MyOrderSendMarket(sig_entry, sig_entry, Lots); // 共通ライブラリでBuy/Sellを実施。
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|仕掛けシグナル                                                                  |
//+------------------------------------------------------------------+
int EntrySignal() {

// シグナルの初期化
    int ret = 0;

// RSIの値取得
    double FastRSI1 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_fast, eRSI_applied_price_fast, iRSI_shift_fast);
    double FastRSI2 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_fast, eRSI_applied_price_fast, iRSI_shift_fast + 1); // RSI1より1本前

    double SlowRSI1 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_slow, eRSI_applied_price_slow, iRSI_shift_slow);
    double SlowRSI2 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_slow, eRSI_applied_price_slow, iRSI_shift_slow + 1); // RSI2より1本前

// シグナル生成
    if(bRSI_level_threshold == true) {   // レベルスレッショルドがONなら・・
        if (FastRSI2 < SlowRSI2 && SlowRSI1 < FastRSI1 && SlowRSI2 >= dRSI_level_threshold_slow_value_buy) { // SlowRSI2がこの値以下でクロスするならBuyする
            ret = 1;   // 買いシグナルは ret = 1 を返す
        } else if (SlowRSI2 < FastRSI2 &&  FastRSI1 < SlowRSI1 <= dRSI_level_threshold_slow_value_sell) {      // SlowRSI2がこの値以上でクロスするならSellする
            ret = -1;  // 売りシグナルは ret = -1 を返す
        }
    }

    if(bRSI_level_threshold == false) {      // レベルスレッショルドがOFFなら・・
        if (FastRSI2 < SlowRSI2 && SlowRSI1 < FastRSI1) {
            ret = 1;   // 買いシグナルは ret = 1 を返す
        } else if (SlowRSI2 < FastRSI2 &&  FastRSI1 < SlowRSI1) {
            ret = -1;  // 売りシグナルは ret = -1 を返す
        }
    }

    return ret;
}
//+------------------------------------------------------------------+

[謝辞]

スクリプトは‥

で使用されている『共通ライブラリ』を使用しています。

最大のメリットは‥
MT5とMT4をほぼ同じコードで運用できる!!

作者様のブログ&ツイッターはこちら。是非。 toyolab-fx.amebaownd.com twitter.com

Slackもあるので興味のある方はさがすとよろし。

RSIのゴールデンクロス、デッドクロスで売買するEA Ver1.0

スクリプトは‥

で使用されている『共通ライブラリ』を使用しています。

最大のメリットは‥
MT5とMT4をほぼ同じコードで運用できる!!

作者様のブログ&ツイッターはこちら。是非。 toyolab-fx.amebaownd.com twitter.com

Slackもあるので興味のある方はさがすとよろし。

目的

MQLの復習兼ねての習作。

動作

早いRSIと遅いRSIがクロスしたら売り/買い。単純。

パラメータ

バックテスト設定

  • 通貨ペア : EURUSD
  • 期間 : 2020.01.18 - 2021.01.18
  • 資金: JPY 1000000 (100万円)
  • レバレッジ : 500

結果

f:id:zeniyamada:20210119001123p:plain
まぁこんな感じよね‥。

自作へのメモ書き

RSIの値が高ければ売り、低ければ買い、の基準レベルをいれてバックテストがどう変わるか?

Code

/*
MMMMMMMMMMMMMMMMM""!(.........?""MMMMMMMMMMMMMMMMM
MMMMMMMMMMMM#"`.gMMMMMMMMMMF7TWMMN.,"HMMMMMMMMMMMM
MMMMMMMMMM".     .MMMMMMMMMb     (MMMa,?MMMMMMMMMM
MMMMMMM#^.M^     ?"WMMMMMMM#    (Mm.?"MMe,WMMMMMMM
MMMMMM^.MMt   .MN.   (MMMMM#    -MMN.  ?MMe,MMMMMM
MMMMF.MMM$   .MMMN.    MMMMN    ,MMMN   .MMN,TMMMM
MMMD.MMMt   .MMMMMN,  .MMMMM    .MMMMNJ.J^?MMe?MMM
MMD.MMM^   (MMMMM"WMMMHH""""`    """"""B`   .TpJMM
MF.MMM'  .MMMMM#`  .WNggggNN[    dNNNNNNNNNggg+c4M
M_MMB`  ._     ......dMMMMMM]    dMMMMMM#?WMMMMN.M
F.MD .+MMM~   ,MMMMMMMMMMMMMF    JMMMMMD    TMMM]J
\d^.dMMMMM    ,MMMB`?MMe.....    ..(J+ggggggNMMMN,
~NMMMMMMMM    .MMD    ?MMMMMN     MMMMMMMMM^TMMMN.
_N........    ..........MMMMM-    MMMMMMMF    -TM.
)d#"MMMMMM    ,MMM!7WMMMMMMMM]    J"""7<-....Jgg#.
b-Mb .TMMM_   ,MMF     .......     MMM#^?WMMMMMM](
N.MM|  ,MM|   .MM%   .MMMMMMMM]    -M=     ?MMM#.M
Mb,Mb   .M]   .M#  .MMMMMMMMMMN.        .(gMM#4%(M
MMpJM.   JF    MF .MMMMMMMMMMMMN      .dMMMMF.t.MM
MMMpJN,..M#    M-JMMMM""=jMMMMM"      ?HMMM^ !.MMM
MMMMm,MMMMM    ?"!   ..MMMMMH=   .,          (MMMM
MMMMMN,          ..gMMMMMM#^   .+MMm.      .MMMMMM
MMMMMMMN,   ..(MMMMMMMMM"   ..MMMMMMMNJ, .dMMMMMMM
MMMMMMMMMNJ,TMMMMMMMM"` ..gMMMMMMMMMM9<.MMMMMMMMMM
MMMMMMMMMMMMNJ,7"M%...NMMMMMMMMMM""(.MMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNgJ..?7""""7>(..gMMMMMMMMMMMMMMMMM

Copyright : zeniyamada
Twitter : https://twitter.com/zeniyamada
*/

//+------------------------------------------------------------------+
//|                                       ZeniEA_RSI_CrossSignal.mq5 |
//|                                                       zeniyamada |
//|                                   https://twitter.com/zeniyamada |
//+------------------------------------------------------------------+
#property copyright "zeniyamada"
#property link      "https://twitter.com/zeniyamada"
#property version   "1.00"

#property strict
#include <LibEA.mqh>  // <>をつかうことで共通ライブラリを MQL5/Include/. 以下におけばOK。(当mqlと共通ライブラリを同じ場所でなくてよい)

sinput double Lots = 0.1; // 売買Lot数
input ENUM_TIMEFRAMES eRSI_timeflame = PERIOD_CURRENT ;     // 適応する時間軸
// sinput はバックテスト時に値を変更できなくなる。https://labo.gogojungle.co.jp/articles/20
input int iRSI_period_fast = 5;       // 短期RSIの移動平均期間
input int iRSI_period_slow = 14;  // 長期RSIの移動平均期間
input ENUM_APPLIED_PRICE eRSI_applied_price_fast = PRICE_CLOSE; // 短期RSIの適用価格
input ENUM_APPLIED_PRICE eRSI_applied_price_slow = PRICE_CLOSE; // 長期RSIの適用価格
input int iRSI_shift_fast = 1;        // 短期RSIの左へのシフト数
input int iRSI_shift_slow = 1;        // 短期RSIの左へのシフト数


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---

//---
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void Tick() {      // MQL5の場合はこちら
//void OnTick() {  // MQL4の場合はこちらを使用
    int sig_entry = EntrySignal(); // 仕掛けシグナルを発動。
//---
    MyOrderSendMarket(sig_entry, sig_entry, Lots); // 共通ライブラリでBuy/Sellを実施。
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|仕掛けシグナル                                                                  |
//+------------------------------------------------------------------+
int EntrySignal() {

// シグナルの初期化
    int ret = 0;

    double FastRSI1 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_fast, eRSI_applied_price_fast, iRSI_shift_fast);
    double FastRSI2 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_fast, eRSI_applied_price_fast, iRSI_shift_fast + 1); // RSI1より1本前

    double SlowRSI1 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_slow, eRSI_applied_price_slow, iRSI_shift_slow);
    double SlowRSI2 = iRSI(_Symbol, eRSI_timeflame, iRSI_period_slow, eRSI_applied_price_slow, iRSI_shift_slow + 1); // RSI2より1本前

// 買いシグナル

    if (FastRSI2 < SlowRSI2 && SlowRSI1 < FastRSI1) {
        ret = 1;   // 買いシグナルは ret = 1 を返す
    } else if (SlowRSI2 < FastRSI2 &&  FastRSI1 < SlowRSI1) {
        ret = -1;  // 売りシグナルは ret = -1 を返す
    }
    return ret;
}
//+------------------------------------------------------------------+