目次
概要
『FXで稼ぐ人のテクニックVol.2 スキャルピング デイトレ編』のP54に記載されている手法が有効そうか確認する。
前回の記事では、平均足だけつかったトレードルールを検証した。
→平均足の反転を用いたトレードルールを検証
しかし、結果は思わしくなかった。
今回の記事では、RSIのフィルターをかけるルールを考慮して検証する。
トレードルール
以下は買いのトレードルールです。
(売りのエントリーはこの逆)
・平均足が連続して5回以上陰線になっている
・現在の平均足が陽線である
・直近のRSIの最小値が20を下回っている
・現在のRSI、直近のRSIの最小値より10より大きい
・損切は20Pips、利確は40Pips
ソースコード
※以下のソースコードは、
『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 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
// マイライブラリー #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 BandsPeriod=21; extern int BandsDeviation=2; extern int SignalContinuousBars=5; extern int IsUseExit=false; 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 ReverseRSI = 5; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double heikinAshiOpen_0 = iCustom(NULL, NULL, "HeikinAshi", 0, 0); double heikinAshiClose_0 = iCustom(NULL, NULL, "HeikinAshi", 1, 0); double rsi_0=iRSI(NULL,0,RSIPeriod,applied_price,0); double isHighRSI=GetHighRSI()>HighRSI; double isReverseHighRSI=rsi_0<GetHighRSI()-ReverseRSI; double isLowRSI=GetLowRSI()<LowRSI; double isReverseLowRSI=rsi_0>GetLowRSI()+ReverseRSI; double isContinuousPositiveBars =CountPositiveBars(1)>SignalContinuousBars; double isContinuousNegativeBars =CountNegativeBars(1)>SignalContinuousBars; bool isPositiveBars=heikinAshiClose_0> heikinAshiOpen_0; bool isNegativeBars=heikinAshiClose_0< heikinAshiOpen_0; bool buySignal=isContinuousNegativeBars && isPositiveBars && isLowRSI && isReverseLowRSI; bool sellSignal=isContinuousPositiveBars && isNegativeBars && 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 heikinAshiOpen_1 = iCustom(NULL, NULL, "HeikinAshi", 0, 0); double heikinAshiClose_1 = iCustom(NULL, NULL, "HeikinAshi", 1, 0); bool isPositiveBars=heikinAshiClose_1> heikinAshiOpen_1; bool isNegativeBars=heikinAshiClose_1< heikinAshiOpen_1; bool buyExitSignal=isNegativeBars; bool sellExitSignal=isPositiveBars; 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)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountPositiveBars(int timeshift) { int countPositiveBarsSum=0; for(int i=0; i<Bars; i++) { double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift); double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift); if(heikinAshiClose_i<heikinAshiOpen_i) { break; } countPositiveBarsSum++; } return countPositiveBarsSum; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountNegativeBars(int timeshift) { int countNegativeBarsSum=0; for(int i=0; i<Bars; i++) { double heikinAshiOpen_i = iCustom(NULL, NULL, "HeikinAshi", 0, i+timeshift); double heikinAshiClose_i = iCustom(NULL, NULL, "HeikinAshi", 1, i+timeshift); if(heikinAshiClose_i>heikinAshiOpen_i) { break; } countNegativeBarsSum++; } return countNegativeBarsSum; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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,applied_price,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,applied_price,i); if(rsi_i<minRSI) { minRSI=rsi_i; lastUpdateCount=0; } else { lastUpdateCount++; } if(lastUpdateCount>LimitNotUpdateCount) { break; } } return minRSI; } //+------------------------------------------------------------------+ |
結果
考察
正直、思った以上に成績が悪い。
逆張り手法でなく、押し目・戻りを捉える順張り手法として運用した方がいい気がする。
順張り手法にするなら以下の記事で紹介した手法に寄せた方がいいかも
→『FXチャート実践帳・スキャルピング編』(二階堂重人)をMT4で検証してみる
関連記事
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント