RSIのゴールデンクロス、デッドクロスで売買するEA:レベルスレッショルドを導入。
昨日のスクリプトにレベルスレッショルドなフィルターを追加してみた。 RSI値が70以上でSellエントリ、70未満だとエントリしない、的な。
結果から‥
上(青枠)がレベルスレッショルド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
結果
まぁこんな感じよね‥。
自作へのメモ書き
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; } //+------------------------------------------------------------------+