FX MT4 システムトレード

ドンチャン自動売買プログラムをMT4で作成してみた

スポンサードリンク

ドンチャン・ブレイクアウトをシグナルに
自動売買するプログラムを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回のトレードですから、
エントリー回数は非常に多く、
外れも多かったということになります。

ドンチャン・ブレイクアウトは、
過去の一定期間の最高値を超えたら買い、
最低値を下回ったら売りというシグナルですので、
これと逆を試してみたら
勝率が上がるかもしれません。

今度そのロジックを試してみたいと思います。

スポンサードリンク

-FX, MT4, システムトレード
-, ,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5