前回の記事で、なかなか良い感じの結果が出たパーフェクトオーダーの押し目買い、戻り売りEAに関してさらに最適化してみました。
前回の記事はこちらをご覧ください。
- 移動平均線の期間を変えてみる
- 損切、利確を設定してみる
- トレールさせてみる
以上の3点を検証してみようと思います。
GBPJPY パーフェクトオーダーの押し目買い・戻り売り戦略
- FXDD 1分足データ使用(2005-2019年)
- 15分足
- スプレッドは3pips
- 始値のみ
- 初期証拠金:10000ドル
① 短期25日 中期75日 長期200日 フラクタルの次の足でエントリー
- PF : 1.13
- 純益 : 9992.54ドル
- 最大ドローダウン:26.03%
- 取引回数:1396回(1年あたり100回くらい)
- 勝率:32.16%
- 勝ちトレード平均:198.24pips
- 負けトレード平均:-83.44pips
全体的には右肩上がりですが、ドローダウンが大きいです。勝率が小さいですが、勝ちトレードで平均200、負けトレードが80pipsくらいなので、損小利大で運用出来た結果、総利益は右肩上がりになっているのでしょう。
もう少しアレンジしてみます。
② フラクタルエントリーを3本の動きだけに変更してみる
フラクタルとは、5本のローソク足が
- 上がる ⇒ 上がる ⇒ 上がる ⇒ 下がる ⇒ 下がる
- 下がる ⇒ 下がる ⇒ 下がる ⇒ 上がる ⇒ 上がる
のように、3つ動いて2つ戻るの形を作ることを言います。
パーフェクトオーダーの中の押し目や、戻りを確認するために使用していましたが、エントリー数を増やすために、3本の足でエントリー判定するように変更します。
- 上がる ⇒ 上がる ⇒ 下がる
- 下がる ⇒ 下がる ⇒ 上がる
EAの中身はこんな感じになります。
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 |
void OnTick() { // 5hon no MA narabu double MA_25 = iMA(Symbol(),0,25,0,MODE_EMA,PRICE_CLOSE,1); double MA_75 = iMA(Symbol(),0,75,0,MODE_EMA,PRICE_CLOSE,1); double MA_200 = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,1); // Position ga 0 if(OrdersTotal()==0) { if(MA_200<MA_75 && MA_75<MA_25 && Close[4]>Close[3] && Close[3]>Close[2] && Close[2]<Close[1]) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); } if(MA_200>MA_75 && MA_75>MA_25 && Close[4]<Close[3] && Close[3]<Close[2] && Close[2]>Close[1]) { OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); } } // Position ga aru if(OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { if(MA_200<MA_75 && MA_75<MA_25 && Close[4]>Close[3] && Close[3]>Close[2] && Close[2]<Close[1]) { OrderClose(OrderTicket(),0.1,Ask,3); OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); } } if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { if(MA_200>MA_75 && MA_75>MA_25 && Close[4]<Close[3] && Close[3]<Close[2] && Close[2]>Close[1]) { OrderClose(OrderTicket(),0.1,Bid,3); OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); } } } } |
- PF : 1.09
- 純益 : 7310.55ドル
- 最大ドローダウン:37.08%
- 取引回数:1596回(1年あたり100回くらい)
- 勝率:30.20%
- 勝ちトレード平均:190.14pips
- 負けトレード平均:-75.71pips
取引回数は増えましたが、純益・PFともに悪化しました。
やはりしっかりとフラクタルで反転を確認してからエントリーした方が良いようです。
では、①の場合で移動平均線の期間を最適化した結果はどうなるでしょうか?
③ 短期 中期 長期移動平均線の期間を最適化し フラクタルの次の足でエントリー
まずは、①のEAのコードを次のように書き変えます。
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 |
extern int sbw = 25; extern int mbw = 75; extern int lbw = 200; void OnTick() { //--- // 5hon no MA narabu double MA_25 = iMA(Symbol(),0,sbw,0,MODE_EMA,PRICE_CLOSE,1); double MA_75 = iMA(Symbol(),0,mbw,0,MODE_EMA,PRICE_CLOSE,1); double MA_200 = iMA(Symbol(),0,lbw,0,MODE_EMA,PRICE_CLOSE,1); // Position ga 0 if(OrdersTotal()==0) { if(MA_200<MA_75 && MA_75<MA_25 && Close[4]>Close[3] && Close[3]>Close[2] && Close[2]<Close[1]) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); } if(MA_200>MA_75 && MA_75>MA_25 && Close[4]<Close[3] && Close[3]<Close[2] && Close[2]>Close[1]) { OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); } } // Position ga aru if(OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { if(MA_200<MA_75 && MA_75<MA_25 && Close[4]>Close[3] && Close[3]>Close[2] && Close[2]<Close[1]) { OrderClose(OrderTicket(),0.1,Ask,3); OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); } } if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { if(MA_200>MA_75 && MA_75>MA_25 && Close[4]<Close[3] && Close[3]<Close[2] && Close[2]>Close[1]) { OrderClose(OrderTicket(),0.1,Bid,3); OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); } } } } |
ここで、externって文字列が出てきました。これは、外部入力で変更可能な変数を設定するための文字列なのですが、深く考えずコピペしてください。コードをいじった後は、必ずコンパイルボタンをクリックです。
次にMT4に戻り、エキスパート設定ボタンをクリック。
この画面が出てきたら成功です。
- 変数sbw:短期移動平均線の期間
- 変数mbw:中期移動平均線の期間
- 変数lbw:長期移動平均線の期間
とりあえず適当にこんな感じでパラメータを入力してみました。
次に、テスト設定のタブに移動して、遺伝的アルゴリズムにチェックを入れておきます。全数計算させてもよいのですが、ざっくりとした結果が分かればよいだけなら、遺伝的アルゴリズムをチェックしておいた方が計算が早いです。
OKボタンを押したら、エキスパート編集横の『最適化』にチェックを入れてスタートボタンを押します。
結果はこんな感じでした。
上位5つのパラメータ
- 短期45日、中期50日、長期100日 ・・・ 損益14950
- 短期45日、中期75日、長期100日 ・・・ 損益14019
- 短期40日、中期75日、長期100日 ・・・ 損益13938
- 短期25日、中期75日、長期100日 ・・・ 損益13927
- 短期35日、中期75日、長期100日 ・・・ 損益13751
下位5つのパラメータ (期間が逆転しているものは除いた)
- 短期35日、中期175日、長期300日 ・・・ 損益7027
- 短期30日、中期175日、長期300日 ・・・ 損益7088
- 短期35日、中期150日、長期300日 ・・・ 損益7192
- 短期30日、中期150日、長期300日 ・・・ 損益7247
- 短期40日、中期150日、長期300日 ・・・ 損益7277
長期足の期間より中期足の期間が長いなどの期間が逆転しているものは除きました。
結果として、ポンド円のパーフェクトオーダー押し目買い、戻り売り作戦は長期的に十分利益を上げられる戦力であり、特に長期を100日、中期を50日に設定した時に最もパフォーマンスが良いようです。
④ 損切・利確設定し最適化したら? フラクタルの次の足でエントリー
①のEAは、逆のフラクタルが生じた時点で反対売買を行う仕様になっています。しかし、これでは利益を最大化することが出来ません。そこで、損切と利確を設定し、さらに最適な値を検証してみました。
- 短期 25日
- 中期 75日
- 長期 200日
のパラメータで検証しました。
まずは、損切80pips・利確200pipsで計算してみました。EAのコードはこんな感じ。
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 |
extern double SL = 0.8; extern double TP = 2.0; void OnTick() { //--- // 5hon no MA narabu double MA_25 = iMA(Symbol(),0,25,0,MODE_EMA,PRICE_CLOSE,1); double MA_75 = iMA(Symbol(),0,75,0,MODE_EMA,PRICE_CLOSE,1); double MA_200 = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,1); // Position ga 0 if(OrdersTotal()==0) { if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-SL,Ask+TP); } if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+SL,Bid-TP); } } // Position ga aru if(OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderClose(OrderTicket(),0.1,Ask,3); OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-SL,Ask+TP); } } if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderClose(OrderTicket(),0.1,Bid,3); OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+SL,Bid-TP); } } } } |
あとの最適化計算で必要になるので、外部変数として損切幅のSL、利確幅のTPを設定しました。
OrderSend関数の6個目のパラメータは損切の値、7個目のパラメータは利確の値なので、それぞれBidとAskから計算した値を代入しています。
結果はこんな感じでした。
- PF : 1.05
- 純益 : 6859.48ドル
- 最大ドローダウン:30.13%
- 取引回数:2962回(1年あたり200回くらい)
- 勝率:30.62%
- 勝ちトレード平均:156.83pips
- 負けトレード平均:-65.88pips
取引回数は倍になりましたが、純益が伴っていません。最適化してみましょう。
結果です。(最初はストップ3で検証しましたが、その後ストップ10で再検証しました。結果はストップ10のものです。)
上位5つのパラメータ
- 損切980pips、利確1000pips ・・・ 損益13238
- 損切160pips、利確660pips ・・・ 損益13205
- 損切100pips、利確980pips ・・・ 損益13146
- 損切660pips、利確1000pips ・・・ 損益12932
- 損切180pips、利確1000pips ・・・ 損益12913
下位5つのパラメータ (期間が逆転しているものは除いた)
- 損切20pips、利確380pips ・・・ 損益 -9357
- 損切340pips、利確40pips ・・・ 損益 -9356
- 損切20pips、利確40pips ・・・ 損益 -9356
- 損切20pips、利確180pips ・・・ 損益 -9355
- 損切20pips、利確360pips ・・・ 損益 -9354
損切や利確は設定しない方が良さげ。。。
⑤ トレーリングさせてみる
次に損切のポジションを切り上げていくトレーリング注文を導入してみました。EAのコードは以下の通りです。
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 |
extern double Trail = 0.5; void OnTick() { //--- // 5hon no MA narabu double MA_25 = iMA(Symbol(),0,25,0,MODE_EMA,PRICE_CLOSE,1); double MA_75 = iMA(Symbol(),0,75,0,MODE_EMA,PRICE_CLOSE,1); double MA_200 = iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,1); // Position ga 0 if(OrdersTotal()==0) { if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Trail,0); } if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Trail,0); } } // Position ga aru if(OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { if(OrderStopLoss()>Bid+Trail) OrderModify(OrderTicket(),OrderOpenPrice(),Bid+Trail,0,OrderExpiration()); if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderClose(OrderTicket(),0.1,Ask,3); OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Trail,0); } } if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { if(OrderStopLoss()<Ask-Trail) OrderModify(OrderTicket(),OrderOpenPrice(),Ask-Trail,0,OrderExpiration()); if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderClose(OrderTicket(),0.1,Bid,3); OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Trail,0); } } } } |
外部入力変数として、変数Trailを作成し、損切価格が上昇した場合にOrderModifyにて損切価格を切り上げ、あるいは切り下げしています。コピペ可能です。
Trailを0.5から10まで最適化検証した結果です。
上位5つのパラメータ
- Trail幅 3.5 ・・・ 損益15207
- Trail幅 4 ・・・ 損益14804
- Trail幅 2.5 ・・・ 損益14115
- Trail幅 7 ・・・ 損益13199
- Trail幅 4.5 ・・・ 損益13185
下位5つのパラメータ (期間が逆転しているものは除いた)
- Trail幅 0.5 ・・・ 損益 -9348
- Trail幅 1.5 ・・・ 損益 8286
- Trail幅 5 ・・・ 損益 11465
- Trail幅 1 ・・・ 損益 11685
- Trail幅 8.5 ・・・ 損益 11812
Trail幅は0.5でなければ、とりあえずプラスの損益にはなるようです。以下はTrail幅 3.5の時のグラフ結果です。
- PF : 1.19
- 純益 : 15207.29ドル
- 最大ドローダウン:22.09%
- 取引回数:1451回(1年あたり100回くらい)
- 勝率:32.80%
- 勝ちトレード平均:201.89pips
- 負けトレード平均:-82.97pips
ドローダウンがだいぶん抑えられました。
⑥ トレーリング + 移動平均線の最適化
②で検討した移動平均線の期間を最適化するコードと、トレーリングのコードを合わせて検証します。
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 |
extern int sbw = 25; extern int mbw = 75; extern int lbw = 200; extern double Trail = 0.5; void OnTick() { //--- // 5hon no MA narabu double MA_25 = iMA(Symbol(),0,sbw,0,MODE_EMA,PRICE_CLOSE,1); double MA_75 = iMA(Symbol(),0,mbw,0,MODE_EMA,PRICE_CLOSE,1); double MA_200 = iMA(Symbol(),0,lbw,0,MODE_EMA,PRICE_CLOSE,1); // Position ga 0 if(OrdersTotal()==0) { if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Trail,0); } if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Trail,0); } } // Position ga aru if(OrdersTotal()>0) { if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { if(OrderStopLoss()>Bid+Trail) OrderModify(OrderTicket(),OrderOpenPrice(),Bid+Trail,0,OrderExpiration()); if(MA_200<MA_75 && MA_75<MA_25 && Close[5]>Close[4] && Close[4]>Close[3] && Close[3]<Close[2] && Close[2]<Close[1]) { OrderClose(OrderTicket(),0.1,Ask,3); OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Trail,0); } } if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { if(OrderStopLoss()<Ask-Trail) OrderModify(OrderTicket(),OrderOpenPrice(),Ask-Trail,0,OrderExpiration()); if(MA_200>MA_75 && MA_75>MA_25 && Close[5]<Close[4] && Close[4]<Close[3] && Close[3]>Close[2] && Close[2]>Close[1]) { OrderClose(OrderTicket(),0.1,Bid,3); OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Trail,0); } } } } |
上位5つのパラメータ
- 短期45日、中期50日、長期100日、Trail7 ・・・ 損益15867
- 短期45日、中期50日、長期100日、Trail6.5 ・・・ 損益15674
- 短期45日、中期50日、長期100日、Trail6 ・・・ 損益15670
- 短期45日、中期50日、長期100日、Trail4 ・・・ 損益15597
- 短期25日、中期50日、長期100日、Trail7 ・・・ 損益15365
下位5つのパラメータ (Trail0.5は全滅なので除いた)
- 短期10日、中期50日、長期200日、Trail2.5 ・・・ 損益7719
- 短期30日、中期75日、長期200日、Trail1.5 ・・・ 損益7743
- 短期45日、中期50日、長期200日、Trail1 ・・・ 損益8093
- 短期40日、中期75日、長期200日、Trail1.5 ・・・ 損益8233
- 短期40日、中期50日、長期200日、Trail10 ・・・ 損益8287
Trail0.5以上であれば、基本的にプラス損益。Trailは5以上で効果大。
短期45日、中期50日、長期100日、Trail7の場合の結果は以下の通りです。
- PF : 1.16
- 純益 : 15869.07ドル
- 最大ドローダウン:14.36%
- 取引回数:2237回(1年あたり150回くらい)
- 勝率:33.97%
- 勝ちトレード平均:149.23pips
- 負けトレード平均:-66.04pips
過去の大きく動いた相場で稼げたようですが、最近は横ばいな印象が強いです。
先ほどの25,75、200.トレール3.5の方が右肩上がりで良かった感じですね。
1時間足なら・・・
同じ条件で、時間足を15分から1時間に変更してみました。
上位5つのパラメータ
- 短期5日、中期25日、長期100日、Trail1.5 ・・・ 損益13429
- 短期5日、中期25日、長期200日、Trail1.5 ・・・ 損益13120
- 短期5日、中期25日、長期100日、Trail3 ・・・ 損益12920
- 短期5日、中期25日、長期100日、Trail1 ・・・ 損益12180
- 短期5日、中期25日、長期100日、Trail3.5 ・・・ 損益12138
下位5つのパラメータ (Trail0.5は全滅なので除いた)
- 短期5日、中期50日、長期100日、Trail8.5 ・・・ 損益745
- 短期10日、中期100日、長期300日、Trail5.5 ・・・ 損益880
- 短期5日、中期50日、長期100日、Trail9.5 ・・・ 損益935
- 短期25日、中期50日、長期100日、Trail9.5 ・・・ 損益1240
- 短期5日、中期100日、長期300日、Trail8 ・・・ 損益1292
1時間足の場合、Trail幅が3.5以下の方が損益もPFも良い感じの結果が得られました。
- PF : 1.22
- 純益 : 13428.42ドル
- 最大ドローダウン:17.08%
- 取引回数:1134回(1年あたり80回くらい)
- 勝率:37.74%
- 勝ちトレード平均:171.15pips
- 負けトレード平均:-84.73pips
この右肩上がり、相当いい感じではないでしょうか?
まとめ
GBPJPYの15分足は、パーフェクトオーダーにおける押し目買い・戻り売り戦略が効果的です。
そこで、各種パラメータを最適化してみた結果、以下のような結論が得られました。
- 損切、利確は指定しない方が良い
- 移動平均の期間は何でもプラス損益になる
- 15分足なら25日、75日、200日でトレール幅3.5が良い感じ
- 1時間足なら5日、25日、100日でトレール幅1.5が良い感じ
今回の検証で最も良いパフォーマンスを示した、1時間足のEAに関しては、さらに改良を加えて実弾トレードし、結果を報告していこうと思います。