目次
取引手法の概要
5分足で逆張りを狙う手法を作成しました。
逆張りに使用するインジケータとしてRSIを採用しています。
RSIの値が十分下がって(上がって)から、反転したタイミングでエントリーを狙います。
逆張り手法ですが、上位時間軸のトレンドに逆らったエントリーは避けたいので、トレンドを把握します。
今回の手法は、1時間足と、日足の平均足が陽線か陰線かで上昇トレンドか下降トレンドか判断します。
まとめると、RSIで発生したシグナルを平均足の状態でフィルターにかけた手法になります。
トレードルール
買う場合のトレードルールで説明します。
(売る場合はこの逆になります。)
エントリールール
以下の条件を全て満たした場合にエントリーをします。
・直近のRSIの最低値が20を下回っている
・現在のRSIが、直近のRSIの最低値から5以上大きい
・現在のRSIが、30を下回っている
・現在の1時間足の平均足が陽線
・現在の日足の平均足が陽線
エグジットルール
以下の条件をどれか満たした時に、エクジットします。
・RSIが70以上
・利確は40Pips、損切は20Pips。
ソースコード
※以下のソースコードは、
『FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)』(豊嶋久道)
で紹介されているライブラリーを使用しています。
そのため、コピペだと動きません。
それに加えて、平均足のインジケータが別途必要です。
豊嶋さんの本のp123で紹介されている「HeikinAshi」というインジケータをビルドして、「Indicators」フォルダ以下に配置してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "平均足フィルター+RSI" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips= 20; // 損切り値幅(pips) extern int TPpips= 40; // 利食い値幅(pips) extern int IsUseExit=true; datetime LatestTime; extern ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; extern int RSIPeriod=7; // RSIの期間 extern int HighRSI = 80; extern int LowRSI = 20; extern int HighRSIExit = 70; extern int LowRSIExit = 30; extern int ReverseRSI = 5; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); bool isPositiveBar_H1=IsPositiveBar(PERIOD_H1); bool isPositiveBar_D1=IsPositiveBar(PERIOD_D1); bool isUpState=isPositiveBar_H1 && isPositiveBar_D1; bool isDownState=!isPositiveBar_H1 && !isPositiveBar_D1; double rsi_0=iRSI(NULL,0,RSIPeriod,applied_price,0); double isHighRSI=GetHighRSI()>HighRSI && rsi_0>HighRSIExit; double isReverseHighRSI=rsi_0<GetHighRSI()-ReverseRSI; double isLowRSI=GetLowRSI()<LowRSI && rsi_0<LowRSIExit; double isReverseLowRSI=rsi_0>GetLowRSI()+ReverseRSI; bool buySignal=isUpState && isLowRSI && isReverseLowRSI; bool sellSignal=isDownState && isHighRSI &&isReverseHighRSI; int ret=0; // 買いシグナル if(pos<=0 && buySignal) ret=1; // 売りシグナル if(pos>=0 && sellSignal) ret=-1; return(ret); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double rsi_0=iRSI(NULL,0,RSIPeriod,applied_price,0); double isHighRSIExit=rsi_0>HighRSI; double isLowRSIExit=rsi_0<LowRSI; bool buyExitSignal=isHighRSIExit; bool sellExitSignal=isLowRSIExit; int ret=0; //if(pos < 0 && 売りポジションの決済シグナル) ret = 1; if(pos<0 && sellExitSignal) ret=1; //if(pos > 0 && 買いポジションの決済シグナル) ret = -1; if(pos>0 && buyExitSignal) ret=-1; // オープンポジションの決済 if(ret!=0) MyOrderClose(Slippage,magic); } // スタート関数 int start() { /* if(Time[0] != LatestTime) { LatestTime = Time[0]; } else { return(0); } */ if(IsUseExit) { ExitPosition(MAGIC); } // エントリーシグナル int sig_entry=EntrySignal(MAGIC); // 買い注文 if(sig_entry>0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_BUY,Lots,Ask,Slippage,SLpips,TPpips,COMMENT,MAGIC); } // 売り注文 if(sig_entry<0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_SELL,Lots,Bid,Slippage,SLpips,TPpips,COMMENT,MAGIC); } return(0); } //+------------------------------------------------------------------+ bool MyOrderSendSL(int type,double lots,double price,int slippage,int slpips,int tppips,string comment,int magic) { int mult=1; if(Digits == 3 || Digits == 5) mult=10; slippage *= mult; if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP) mult*=-1; double sl=0,tp=0; if(slpips > 0) sl = price-slpips*Point*mult; if(tppips > 0) tp = price+tppips*Point*mult; return(MyOrderSend(type, lots, price, slippage, sl, tp, comment, magic)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetHighRSI() { int maxRSI=0; int lastUpdateCount=0; int LimitNotUpdateCount=2; for(int i=0; i<Bars; i++) { double rsi_i=iRSI(NULL,0,RSIPeriod,PRICE_HIGH,i); if(rsi_i>maxRSI) { maxRSI=rsi_i; lastUpdateCount=0; } else { lastUpdateCount++; } if(lastUpdateCount>LimitNotUpdateCount) { break; } } return maxRSI; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetLowRSI() { int minRSI=100; int lastUpdateCount=0; int LimitNotUpdateCount=2; for(int i=0; i<Bars; i++) { double rsi_i=iRSI(NULL,0,RSIPeriod,PRICE_LOW,i); if(rsi_i<minRSI) { minRSI=rsi_i; lastUpdateCount=0; } else { lastUpdateCount++; } if(lastUpdateCount>LimitNotUpdateCount) { break; } } return minRSI; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsPositiveBar(ENUM_TIMEFRAMES timeframe) { double heikinAshi_Open = iCustom(NULL, timeframe, "HeikinAshi", 0, 0); double heikinAshi_Close = iCustom(NULL, timeframe, "HeikinAshi", 1, 0); return heikinAshi_Close>heikinAshi_Open; } //+------------------------------------------------------------------+ |
結果
所感
・プロフィットファクタの値は悪くない。
・取引回数は多くない。(週一程度)
改善点
・RSIの反転確認だけは値段の反転が捉えられない場合がある
・上位時間足にトレンドの変化が発生しそうな場合はエントリーを控える
・損切の位置を20Pips下ではなく、直近の最低値におく
検証項目
・逆張りを捉えるインジケータを別のインジケータにする
例えば、ストキャスティクスとか。
・平均足のフィルターとして、1時間足と日足を採用したが、この組み合わせが最適解か?
また、2つの時間足を確認する必要があったか?
1時間足だけのフィルターでも十分仕事をするのでは?
→RSIを使用した逆張り手法にどのフィルターを採用するのが最適か?
関連記事
『FX革命! 短期間で爆発的に儲かるハイレバレッジ投資法』(南緒)で紹介された手法は、平均足をフィルターとして使用しています。
今回紹介した手法はこの書籍から着想を得ています。
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント