FX MT4 システムトレード

ボリンジャーバンドをシグナルにしたMT4自動売買プログラムをコーディングしてみた

スポンサードリンク

5分足の終値が、ボリンジャーバンドの+2σに達すると売りシグナル、
逆に-2σに達すると買いシグナルとして
トレードを行うMT4の自動売買プログラム(EA)をコーディングしてみました。

ボリンジャーバンドは5分足が25本の移動平均で線を引き、
注文時の価格から5分足の終値が30pipsれると手仕舞いするというロジックです。

損切りも利確も買ったときの値段からどちらに30pips動いたとしても
手仕舞うようにしました。

MQLのプログラムソースです。

//+------------------------------------------------------------------+
//|                                                           BB.mq4 |
//|                                    Copyright (c) 2017, Ichizo FX |
//|                                             http://fx.ichizo.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2017, Ichizo FX"
#property link      "http://fx.ichizo.biz"

// マジックナンバー
extern int Magic  = 20170124;

// 外部パラメータ
extern double Lots = 0.01;
extern int Slippage = 3;
extern string Comments = "BB";
extern double Diff = 0.3;
extern double Diff_S = 0.3;

// エントリー関数
extern int BBPeriod = 25;  // ボリンジャーバンドの期間
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 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);
}

// スタート関数
int start()
{
   if (Bars < BBPeriod) {
      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 bbH1 = iBands(NULL, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_UPPER, 0);
   double bbL1 = iBands(NULL, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_LOWER, 0);

   // ロングポジションのクローズ
   if (Ticket > 0 && Order_Type == OP_BUY && (Close[0] - Diff > pos || Close[0] + Diff_S < pos)) {
      Closed = OrderClose(Ticket, Lots, Bid, Adjust_Slippage, Magenta);
      if (Closed == true) {
         Ticket = 0;
      }
   // ロングポジションのクローズ
   } else if (Ticket > 0 && Order_Type == OP_SELL && (Close[0] + Diff > pos || Close[0] - Diff_S < pos)) {
      Closed = OrderClose(Ticket, Lots, Ask, Adjust_Slippage, Aqua);
      if (Closed == true) {
         Ticket = 0;
      }
   }

   // 買いシグナル
   if(OrdersTotal() == 0 && Close[0] <= bbL1)
   {
      Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Adjust_Slippage, 0, 0, Comments, Magic, 0, Magenta);
   }
   // 売りシグナル
   if(OrdersTotal() == 0 && Close[0] >= bbH1)
   {
      Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Adjust_Slippage, 0, 0, Comments, Magic, 0, Aqua);
   }
   
   return(0);
}

2016年1月1日から2017年1月25日まで実行してみました。

結果は以下のグラフのようになりました。

芳しくない結果です。

初期証拠金が10,0000
純益 -7.18
総利益 63.25
総損失 -70.43
最大ドローダウン 20.80(0.21%)
売りポジション(勝率) 38(47.37%)
買いポジション(勝率) 38(47.37%)
勝率(%) 36(37.37%)
負率(%) 40(52.63%)

手仕舞いを行う金額を、約定価格から50pips等に
変更してバックテストを行っていましたが、
結果は大きく変わりませんでした。

そもそも5分足がボリンジャーバンドにかかったら
反発するだろうというエントリー方法の
勝率が悪いというところに起因しているようです。

勝率のよいエントリー方法を探してみることにします。

スポンサードリンク

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

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