5分足の終値が、ボリンジャーバンドの+2σに達すると売りシグナル、
逆に-2σに達すると買いシグナルとして
トレードを行うMT4の自動売買プログラム(EA)をコーディングしてみました。
ボリンジャーバンドは5分足が25本の移動平均で線を引き、
注文時の価格から5分足の終値が30pipsれると手仕舞いするというロジックです。
損切りも利確も買ったときの値段からどちらに30pips動いたとしても
手仕舞うようにしました。
MQLのプログラムソースです。
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 |
//+------------------------------------------------------------------+ //| 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分足がボリンジャーバンドにかかったら
反発するだろうというエントリー方法の
勝率が悪いというところに起因しているようです。
勝率のよいエントリー方法を探してみることにします。