目次
ダブルボトム・ダブルトップとは
ダブルボトムとは、ファベットの「W」のような形のチャートで、底が2つあるパターンです。
2つの底で形成される支持線を抜くことが難しいと判断され、上昇トレンドの兆候となることがあります。
ダブルトップとは、ファベットの「M」のような形のチャートで、天井が2つあるパターンです。
2つの天井で形成される支持線を抜くことが難しいと判断され、下降トレンドの兆候となることがあります。
トレードルール
買うパターンで考えます。
頂点(高値・安値)の探知はZigZagインジケータを使用しています。
・「W」字が形成されている
→直近の安値と一つ前の安値を比較して、値段の差が一定の範囲に収まっている。
※今回の場合は、3Pips(30Point)で設定している。
・現在の足が、高値と安値の中間程度の場合、または、高値を抜いた場合
※高値と安値の中間程度→「W」字の形成を待たずに、早期でエントリーするパターン
※高値を抜いた場合→「W」字の形成を待って、遅めにエントリーするパターン
・損切は、「W」字の底の値段
・利確は、「W」字の高値+「W」字の縦幅(高値-安値に相当)
ソースコード
※以下のソースコードは、
『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 |
// マイライブラリー #include <MyLib.mqh> // マジックナンバー #define MAGIC 20094021 #define COMMENT "ダブルボトム・ダブルトップ" // 外部パラメータ extern double Lots = 0.1; extern int Slippage = 3; // エントリー関数 extern int RSIPeriod = 14; // RSIの期間 //状態管理 enum ZigzagPos { Top = 0, Bottom = 1, Unknown = 2, }; ZigzagPos LatestZigzag = Unknown; double Zigzag_Top_0 = 0; double Zigzag_Top_1 = 0; double Zigzag_Bottom_0 = 0; double Zigzag_Bottom_1 = 0; double ZigzagMaxTop = 0; double ZigzagMinBottom = 0; double Width_M=0; double Width_W=0; datetime LatestTime; input int ZigzagDepth = 12; input int ZigzagDeviation = 5; input int ZigzagBackstep = 3; input int AllowableErrorPoint = 30; // Maximum distance between the twin tops/bottoms int EntrySignal(int magic) { // オープンポジションの計算 double pos = MyCurrentOrders(MY_OPENPOS, magic); bool sellSignal=false; bool buySignal=false; if(LatestZigzag == Top) { //ダブルトップが形成されているか確認する if(Zigzag_Top_0<Zigzag_Top_1+AllowableErrorPoint*Point &&Zigzag_Top_0>Zigzag_Top_1-AllowableErrorPoint*Point &&ZigzagMaxTop!=0 && Width_M!=0) { double nowPos=100*(ZigzagMaxTop-Close[0])/Width_M; if((nowPos>50&&nowPos<55)||(nowPos>101&&nowPos<105)) { sellSignal=true; } } } if(LatestZigzag == Bottom) { //ダブルボトムが形成されているか確認する if(Zigzag_Bottom_0<Zigzag_Bottom_1+AllowableErrorPoint*Point &&Zigzag_Bottom_0>Zigzag_Bottom_1-AllowableErrorPoint*Point &&ZigzagMinBottom!=0 && Width_W!=0) { nowPos=100*(Close[0]-ZigzagMinBottom)/Width_W; if((nowPos>50&&nowPos<55)||(nowPos>101&&nowPos<105)) { buySignal=true; } } } int ret = 0; // 買いシグナル if(pos <= 0 && buySignal) ret = 1; // 売りシグナル if(pos >= 0 && sellSignal) ret = -1; return(ret); } double UpdateZigZag() { double zigzagValue[4]; int zigzagValueCount=0; for(int i=1; i<iBars(Symbol(),0); i++) { double Zigzag=iCustom(Symbol(),0,"ZigZag",ZigzagDepth,ZigzagDeviation,ZigzagBackstep,0,i); if(Zigzag!=0) { zigzagValue[zigzagValueCount]=NormalizeDouble(Zigzag,Digits); zigzagValueCount++; } if(zigzagValueCount==4) { if(zigzagValue[0]>zigzagValue[1]) { LatestZigzag = Top; Zigzag_Top_0 = zigzagValue[0]; Zigzag_Bottom_0 = zigzagValue[1]; Zigzag_Top_1 = zigzagValue[2]; Zigzag_Bottom_1 = zigzagValue[3]; } else { LatestZigzag = Bottom; Zigzag_Bottom_0= zigzagValue[0]; Zigzag_Top_0= zigzagValue[1]; Zigzag_Bottom_1= zigzagValue[2]; Zigzag_Top_1= zigzagValue[3]; } ZigzagMinBottom=Zigzag_Bottom_0<Zigzag_Bottom_1? Zigzag_Bottom_0:Zigzag_Bottom_1; //現在の足のパーセンテージ Width_W=Zigzag_Top_0-ZigzagMinBottom; ZigzagMaxTop=Zigzag_Top_0>Zigzag_Top_1? Zigzag_Top_0:Zigzag_Top_1; //現在の足のパーセンテージ Width_M=ZigzagMaxTop-Zigzag_Bottom_0; break; } } } // スタート関数 int start() { if(Time[0] != LatestTime) { UpdateZigZag(); LatestTime = Time[0]; } // エントリーシグナル int sig_entry = EntrySignal(MAGIC); // 買い注文 if(sig_entry > 0) { MyOrderClose(Slippage, MAGIC); MyOrderSend(OP_BUY, Lots, Ask, Slippage, ZigzagMinBottom, ZigzagMinBottom+2*Width_W, COMMENT, MAGIC); } // 売り注文 if(sig_entry < 0) { MyOrderClose(Slippage, MAGIC); MyOrderSend(OP_SELL, Lots, Bid, Slippage, ZigzagMaxTop, ZigzagMaxTop-2*Width_M, COMMENT, MAGIC); } return(0); } |
結果
考察
スプレッドが0.5Pipsの設定で、プロフィットファクタは1.00でした。
実践に投入できるレベルの成績ではありません。
ZigZagインジケータは、リペイントするタイプのインジケータです。
そのため、後でビジュアルモードの結果を確認した際に、なんでこのタイミングでエントリーしたのだろうかと思ってしまう箇所があります。
改善点
・W(M)字の縦幅があまりにも狭い場合はエントリーを控える。
・損切値を段階的に上がる
以下設定例
現在の足のnowPosが50%→損切0%
現在の足のnowPosが 90%→損切50%
現在の足のnowPos が120%→損切90%
(100%超えたら、ブレイクしたと考えて、100%付近に損切をもっていってよい)
現在の足のnowPosが150%→損切110%(常に40%下の値でトレイリングストップ)
現在の足のnowPos が200%→利確または(常に20%下の値でトレイリングストップ)
・早期でエントリーするパターンをしぼる
一度もnowPosが50%を超えたことがない場合
→50%を超えたタイミングでエントリーする
nowPosが一度は50%を超えたことが現在は50%以下の場合
→再度50%を超えたタイミングでエントリーする。
ただし、一度目のタイミングで75%を超えていたらエントリーは100%越えを待つ。
・早期でエントリーするパターンを撤廃する
・ダブルトップとダブルボトムの両方のパターンが同時に形成されている時に、無駄なエントリーを行ったり、エントリーに入り損ねている場合がある
関連記事
~FXを始めてみませんか?~
XMは、口座を開設するだけで、3000円のボーナスが無料でもらえます。
資金はないけど、FXを試しに挑戦してみたい方でも大丈夫です。
(サイト主もXMを使用しています)
コメント