目次
概要
『マナブ式FX -福耳だけが取り柄の凡人サラリーマンがたった1年で6000万!』(斉藤学) のp56に記載されている手法を検証します。
たたし、この本で紹介されている手法は、トレードルールとしてそのまま使えませんので、少し改良を施しています。
トレードルール
この手法は、W%R(ウィリアムズパーセントレンジ)とストキャスティクスを使用した逆張り手法です。
※設定
W%R→期間14
ストキャスティクスの%K→期間9
買う場合のルール
エントリールール
以下の条件をすべて満たす場合にエントリーする。
・W%Rが-70%以下
・ストキャスティクスの%Kが10%以下
エグジットルール
・利確はW%Rが-20%以上またはストキャスティクスの%Kが70%以上
・損切は-2σラインまでの値幅または20Pipsの内、大きい値を採用する
売る場合のルール
エントリールール
以下の条件をすべて満たす場合にエントリーする。
・W%Rが-30%以上
・ストキャスティクスの%Kが90%以上
エグジットルール
・利確はW%Rが-80%以下またはストキャスティクスの%Kが30%以下
・損切は+2σラインまでの値幅または10Pipsの内、大きい値を採用する
本書と今回検証するルールの違い
p59
ボリンジャーバンドの+2σライン付近にストップロスオーダー
という記載がありますが、エントリーの条件を満たしたタイミングで、2σラインにタッチしている場合があります。
そのため、20Pipsの損切ルールを加えています。
p59
ストキャスティクス%Kが30%、またはW%Rが-80%になる前に利益を確定しましょう。
この文章の中で、「なる前に」という記述が厄介です。
どのタイミングでエグジットすればいいか明言していません。
今回の検証では、「なる前に」にでなく「なった瞬間」としてトレードルールを構築しました。
p60
ボリンジャーバンドの±2σライン近くでしか売買しない
という記述はいったん無視しました。
ソースコード
※以下のソースコードは、
『FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)』(豊嶋久道)
で紹介されているライブラリーを使用しています。
そのため、コピペだと動きません。
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 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "ウィリアムズパーセントレンジ" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips=20; // 損切り値幅(pips) extern int TPpips=0; // 利食い値幅(pips) extern int EntryHighWPR=-30; extern int EntryLowWPR=-70; extern int ExitHighWPR=-20; extern int ExitLowWPR=-80; extern int EntryHighK=90; extern int EntryLowK=10; extern int ExitHighK=70; extern int ExitLowK=30; extern int KPeriod=9; //%Kしかみていないので、DPeriodの変更は無意味 extern int DPeriod=3; //StochasticSlowing:1→ファースト・ストキャスティクス(メイン=%K、シグナル=%D) //StochasticSlowing:2以上→スロー・ストキャスティクス(メイン=%D、シグナル=Slow%D ) extern int StochasticSlowing=1; extern int WPRPeriod=14; extern int BandsPeriod=21; extern int BandsDeviation=2; input bool isUseExit=true; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double K_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,0); double WPR_0=iWPR(NULL,NULL,WPRPeriod,0); bool buySignal=K_Line_0<EntryLowK && WPR_0<EntryLowWPR; bool sellSignal=K_Line_0>EntryHighK && WPR_0>EntryHighWPR; int ret=0; // 買いシグナル if(pos<=0 && buySignal) ret=1; // 売りシグナル if(pos>=0 && sellSignal) ret=-1; return(ret); } // スタート関数 int start() { // 売買ポジションのエグジット if(isUseExit) { ExitPosition(MAGIC); } // エントリーシグナル int sig_entry=EntrySignal(MAGIC); // 買い注文 if(sig_entry>0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_BUY,Lots,Ask,Slippage,GetSLpips(OP_BUY),TPpips,COMMENT,MAGIC); } // 売り注文 if(sig_entry<0) { MyOrderClose(Slippage,MAGIC); MyOrderSendSL(OP_SELL,Lots,Bid,Slippage,GetSLpips(OP_SELL),TPpips,COMMENT,MAGIC); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double K_Line_0=iStochastic(NULL,NULL,KPeriod,DPeriod,StochasticSlowing,MODE_SMA,0,MODE_MAIN,0); double WPR_0=iWPR(NULL,NULL,WPRPeriod,0); bool buyExitSignal=K_Line_0>ExitHighK || WPR_0>ExitHighWPR; bool sellExitSignal=K_Line_0<ExitLowK || WPR_0<ExitLowWPR; 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); } //+------------------------------------------------------------------+ 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 GetSLpips(int type) { int mult=1; if(Digits == 3 || Digits == 5) mult=10; if(type==OP_BUY || type==OP_BUYLIMIT || type==OP_BUYSTOP) { double lowerBB_0=iBands(NULL,0,BandsPeriod,BandsDeviation,0,PRICE_CLOSE,MODE_LOWER,0); double gapLowerBB=(Close[0]-lowerBB_0)/(Point*mult); return MathMax(SLpips, gapLowerBB); } if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP) { double upperBB_0=iBands(NULL,0,BandsPeriod,BandsDeviation,0,PRICE_CLOSE,MODE_UPPER,0); double gapUpperBB=(upperBB_0-Close[0])/(Point*mult); return MathMax(SLpips, gapUpperBB); } return SLpips; } //+------------------------------------------------------------------+ |
結果
考察
プロフィットファクターは1を下回っています。
原因は、トレンドが発生しているタイミングで何度もエントリーしてしまっているのが大きいと思われます。
W%R(ウィリアムズパーセントレンジ)とストキャスティクスという異なるインジケータを使用していますが、似たような性質のインジケータを2つ使う有効性があまり感じられませんでした。
改善点
・トレンドが発生しているタイミングでトレードしない
・何度もエントリーしないようにする。
→一度エントリーに失敗した場合、再度エントリーするには平均移動線をタッチしてからというロジックを追加する。
関連記事
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント