ドンチャン・ブレイクアウトをシグナルに
自動売買するプログラムをMT4で作成してみました。
ドンチャン・ブレイクアウトは、
過去の特定の日数の最高値を上に抜けたら買い、
最低値を下に抜けたら売りを入れるというものです。
//+------------------------------------------------------------------+ //| 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回のトレードですから、
エントリー回数は非常に多く、
外れも多かったということになります。
ドンチャン・ブレイクアウトは、
過去の一定期間の最高値を超えたら買い、
最低値を下回ったら売りというシグナルですので、
これと逆を試してみたら
勝率が上がるかもしれません。
今度そのロジックを試してみたいと思います。