ドンチャン・ブレイクアウトをシグナルに
自動売買するプログラムをMT4で作成してみました。
ドンチャン・ブレイクアウトは、
過去の特定の日数の最高値を上に抜けたら買い、
最低値を下に抜けたら売りを入れるというものです。
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 |
//+------------------------------------------------------------------+ //| Donchian.mq4 | //| Copyright (c) 2017, Ichizo FX | //| http://fx.ichizo.biz | //+------------------------------------------------------------------+ #property copyright "Copyright (c) 2017, Ichizo FX" #property link "http://fx.ichizo.biz" // マイライブラリー //#include <MyLib.mqh> // マジックナンバー extern int Magic = 20170124; // 外部パラメータ extern double Lots = 0.01; extern int Slippage = 3; extern string Comments = "Donchian"; extern double Diff = 0.3; extern double Diff_S = 0.3; extern double LossDiff = 0.02; // エントリー関数 extern int DonchianPeriod = 20; // Donchianの期間 extern int BBDev = 2; // 標準偏差の倍率 int Calculated_Slippage = 0; int Ticket = 0; int Adjust_Slippage = 0; datetime Bar_Time = 0; bool Closed = false; datetime Close_Time = 0; double pos = 0; int Order_Type = 0; int LossCut = Diff_S; int AdjustSlippage(string Currency, int Slippage_Pips) { int Symbol_Digits = MarketInfo(Currency, MODE_DIGITS); if (Symbol_Digits == 2 | Symbol_Digits == 4) { Calculated_Slippage = Slippage_Pips; } else if (Symbol_Digits == 3 | Symbol_Digits == 5) { Calculated_Slippage = Slippage_Pips * 10; } return (Calculated_Slippage); } int init() { Adjust_Slippage = AdjustSlippage(Symbol(), Slippage); return(0); } double getHighPrice() { double HighPrice = 0; for(int i = 0; i < DonchianPeriod; i++) { if (HighPrice < High[i]) { HighPrice = High[i]; } } return HighPrice; } double getLowPrice() { double LowPrice = 0; for(int i = 0; i < DonchianPeriod; i++) { if (LowPrice < Low[i]) { LowPrice = Low[i]; } } return LowPrice; } // スタート関数 int start() { if (Bars < DonchianPeriod) { return(0); } if (Bar_Time == Time[0]) { return(0); } else if (Bar_Time != Time[0]) { Bar_Time = Time[0]; } // ポジションを持っているかの判定 if (OrderSelect(Ticket, SELECT_BY_TICKET)) { Close_Time = OrderCloseTime(); // 未決済の場合 if (Close_Time == 0) { // オープンポジションの計算 pos = OrderOpenPrice(); Order_Type = OrderType(); } } // 指定期間内の最高値、最低値を取得 double HighPrice = getHighPrice(); double LowPrice = getLowPrice(); // ロングポジションのクローズ if (Ticket > 0 && Order_Type == OP_BUY && (Bid - Diff > pos || Bid + LossCut < pos)) { Closed = OrderClose(Ticket, Lots, Bid, Adjust_Slippage, Magenta); if (Closed == true) { Ticket = 0; } // ショートポジションのクローズ } else if (Ticket > 0 && Order_Type == OP_SELL && (Ask + Diff > pos || Ask - LossCut < pos)) { Closed = OrderClose(Ticket, Lots, Ask, Adjust_Slippage, Aqua); if (Closed == true) { Ticket = 0; } } // 買いシグナル if(OrdersTotal() == 0 && Ask <= HighPrice) { Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Adjust_Slippage, 0, 0, Comments, Magic, 0, Magenta); LossCut = Diff_S; } // 売りシグナル else if(OrdersTotal() == 0 && Bid >= LowPrice) { Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Adjust_Slippage, 0, 0, Comments, Magic, 0, Aqua); LossCut = Diff_S; } else { //LossCut = LossCut - LossDiff; } return(0); } |
株では日足でドンチャンを使う場合が多いようですが、
今回は5分足でもシグナルとして使えるのか検証してみます。
ドンチャンで使用する期間を20本(5分足×20本 = 100分)として
その間の最大値、最小値をそれぞれ上抜く、もしくは下抜くかした場合に
買い、売りの注文を行います。
約定金額から30pips離れたら利食いします。
バックテストの結果です。
期間は2016/12/01~2017/01/25です。
通貨ペアはUSD/JPYで、5分足チャートでのバックテストです。
初期証拠金 10,000
純益 -91.19
絶対ドローダウン 100.66
総取引数 1911
総利益 566.37
総損失 -657.56
期待利得 -0.05
最大ドローダウン 113.13(1.13%)
相対ドローダウン 1.13%(113.13)
売りポジション(勝率%) 30(53.33%)
買いポジション(勝率%) 1881(10.10%)
勝率(%) 206(10.78%)
負率(%) 1705(89.22%)
最大勝トレード 5.67
最大敗トレード -6.13
平均勝トレード 2.75
平均敗トレード -0.39
最大連勝(金額) 4(13.21)
最大連敗(金額) 59(-8.27)
最大連勝(トレード数) 13.21(4)
最大連敗(トレード数) -18.85(10)
平均連勝 1
平均連敗 10
結果を見ると、非常に勝率が悪いです。
総取引数1911回ありましたが、
買いが1881回に対して売りは30回です。
およそ2カ月弱の間に1911回のトレードですから、
エントリー回数は非常に多く、
外れも多かったということになります。
ドンチャン・ブレイクアウトは、
過去の一定期間の最高値を超えたら買い、
最低値を下回ったら売りというシグナルですので、
これと逆を試してみたら
勝率が上がるかもしれません。
今度そのロジックを試してみたいと思います。