目次
はじめに
以下の記事で『最強のFX 1分足スキャルピング』(ぶせな)の手法を以前検証しました。
『最強のFX 1分足スキャルピング』(ぶせな)の手法が有効か検証する
その後、自分以外にも検証している人がいるだろうと思い検索してみたら、記事が見つけました。
http://abitra.hatenablog.com/entry/2019/05/22/035112
この記事によると、エンベロープの偏差0.10ラインを使用するのではなく、エンベロープの偏差0.15のラインを使用すると結果がよくなったという旨が記載されています。
本記事では、この事実が本当かどうか確認します。
ソースコード
※以下のソースコードは、
『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 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 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094060 #define COMMENT "ぶせな本(簡易版)_反転ロジックを追加_015" // 外部パラメータ extern double Lots=0.1; extern int Slippage=3; extern int SLpips=2; // 損切り値幅(pips) extern int TPpips=2; // 利食い値幅(pips) extern int ShadowPoint=10; // 反転確認用のヒゲの長さ(point) extern ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; extern ENUM_MA_METHOD ma_method=MODE_EMA; extern int ma_period=20; //状態管理(どのラインでエントリーしたか管理する) //エントリーしたかどうか把握する。エントリーをしたらTrueで、平均移動線と交差したら、Falseにする bool _entry_P15=false; bool _entry_M15=false; //偏差0.15%のラインにタッチしたかどうか把握する。ポジションをもっていない状態で偏差0.15%のラインにタッチしたらTrue。エントリしたら、Falseにする bool _signal_P15=false; bool _signal_M15=false; //シグナル発生後の高値・安値を把握する。エントリーしたら初期化する double _latestHighPrice= 0; double _latestLowPrice = 99999; datetime _latestTime=0; //+------------------------------------------------------------------+ int EntrySignal(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double envelope_P15=iEnvelopes(NULL,0,ma_period,ma_method,0,applied_price,0.15,MODE_UPPER,0); double envelope_M15=iEnvelopes(NULL,0,ma_period,ma_method,0,applied_price,0.15,MODE_LOWER,0); //closeがenvelope_P15より高い bool isOverP15=Close[0]>envelope_P15; bool isUnderM15=Close[0]<envelope_M15; if(!_signal_P15 && pos==0 && !_entry_P15) { _signal_P15=isOverP15; } if(!_signal_M15 && pos==0 && !_entry_M15) { _signal_M15=isUnderM15; } bool SellSignal=false; bool BuySignal=false; if(_signal_P15) { if(High[0]>_latestHighPrice) { _latestHighPrice=High[0]; } if(Close[0]<_latestHighPrice-ShadowPoint*Point && !_entry_P15) { SellSignal=true; } } if(_signal_M15) { if(Low[0]<_latestLowPrice) { _latestLowPrice=Low[0]; } if(Close[0]>_latestLowPrice+ShadowPoint*Point && !_entry_M15) { BuySignal=true; } } int ret=0; // 買いシグナル if(pos<=0 && BuySignal) { _entry_M15=true; _signal_M15=false; _latestHighPrice= 0; _latestLowPrice = 99999; ret=1; } // 売りシグナル if(pos>=0 && SellSignal) { _entry_P15=true; _signal_P15=false; _latestHighPrice=0; _latestLowPrice=99999; ret=-1; } return(ret); } // エグジット関数 void ExitPosition(int magic) { // オープンポジションの計算 double pos=MyCurrentOrders(MY_OPENPOS,magic); double ma=iMA(NULL,0,ma_period,0,ma_method,applied_price,0); //平均移動線が交差する bool isOverMa=Close[0]>ma; bool isUnderMa=Close[0]<ma; int ret=0; //if(pos < 0 && 売りポジションの決済シグナル) ret = 1; if(pos<0 && isUnderMa) ret=1; //if(pos > 0 && 買いポジションの決済シグナル) ret = -1; if(pos>0 && isOverMa) ret=-1; // オープンポジションの決済 if(ret!=0) MyOrderClose(Slippage,magic); } // スタート関数 int start() { CheckCrossMa(); // 売買ポジションのエグジット 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)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CheckCrossMa() { double ma_0=iMA(NULL,0,ma_period,0,ma_method,applied_price,0); //平均移動線が交差する bool isOverMa=Open[0]<ma_0 && High[0]>ma_0; bool isUnderMa=Open[0]>ma_0 && Low[0]<ma_0; if(isOverMa || isUnderMa) { _entry_P15=false; _entry_M15=false; _signal_P15=false; _signal_M15=false; _latestHighPrice= 0; _latestLowPrice = 99999; } } //+------------------------------------------------------------------+ |
結果
スプレッドの5Point(0.5Pips)での検証です。
損切は2Pips、利確は2 Pipsの場合。
損切は5Pips、利確は10 Pipsの場合。
エンベロープの偏差0.10ラインで検証した時と比べて、結果は格段によくなっていまず。
最適化
スプレッドの1.0Pipsで最適な結果を探します。
※上の2つの結果と比較して、スプレッドの値を厳しくしています。また期間は1年間に縮めています。
変化させる範囲は以下の通りです。
・損切は1Pips~5Pipsまで1Pips刻みで変化。
・利確は2Pips~10Pipsまで2Pips刻みで変化。
・反転確認(ヒゲの長さ)は5Point(0.5Pips)~20Point(2.0Pips)まで5Point(0.5Pips)刻みで変化。
※あまりきれいにまとまっていませんが、以下のリンクに結果をテキストファイルに保存しています。
busena_最適化結果
この範囲で最適なパターンは、損切は2Pips、利確は10 Pips、反転確認(ヒゲの長さ)は5Point(0.5Pips)でした。
他の結果を見ると、以下のことがわかります。
・損切は2Pips~3Pipsが最適。1Pipsにすると逆に成績が悪くなる
・利確は8Pips~10Pipsが最適。10Pips以上が最適な可能性を今の段階では否定できません。
・反転確認(ヒゲの長さ)は5Point(0.5Pips)前後が最適。
今後
今の段階でも、実際の運用に耐えうるEAだと思います。
以下の作業を行って、もう少し完成度を高めてから、デモ環境でテストを行う予定です。
・パラメータの最適化
・エンベロープの偏差0.20以上のラインの検証
・フィルターの設定
関連記事
- 『最強のFX 1分足スキャルピング』用のエンベロープのインジケーター
- 『最強のFX 1分足スキャルピング』の取引頻度は本当に少ないか?
- 『最強のFX 1分足スキャルピング』(ぶせな)の手法が有効か検証する
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント