MT4でEA作成を目指すシリーズです。
ボリンジャーバンドによるエントリーシグナルを検出する
自動売買ロジックを作成しました。
ボリンジャーバンドの+2σに高値が届いたら売りを
-2σに下値が届いたら買いを入れるロジックです。
以前5分足で試しましたが、
芳しい結果は残せませんでしたので、少し改良して
日足で試してみることにしました。
早速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 |
//+------------------------------------------------------------------+ //| BB.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 = 2017022101; // 外部パラメータ extern double Lots = 0.01; extern int Slippage = 3; extern string Comments = "BB"; extern double Loss = 0.3; extern double Profit = 0.3; // エントリー関数 extern int BBPeriod = 15; // ボリンジャーバンドの期間 extern int BBDev = 2; // 標準偏差の倍率 extern datetime EffectiveTerm = 10; // 注文の有効期間 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]; } // ボリンジャーバンドの計算 double bbH1 = iBands(NULL, 0, BBPeriod, BBDev, 0, PRICE_OPEN, MODE_UPPER, 0); double bbL1 = iBands(NULL, 0, BBPeriod, BBDev, 0, PRICE_OPEN, MODE_LOWER, 0); // 買いシグナル if(OrdersTotal() == 0 && Ask <= bbL1) { // 下値ボリンジャーバンドに届いたら買い Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Adjust_Slippage, Ask - Loss, Ask + Profit, Comments, Magic, EffectiveTerm, Magenta); } // 売りシグナル if(OrdersTotal() == 0 && Bid >= bbH1) { // 高値ボリンジャーバンドに届いたら売り Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Adjust_Slippage, Bid + Loss, Bid - Profit, Comments, Magic, EffectiveTerm, Aqua); } return(0); } |
今回は注文時に損切り価格と利益確定価格を指定しました。
成り行き注文で、現在価格から±30pipsに損切り価格と利益確定価格を置きます。
バックテストは、USD/JPYで2016/01/01~2016/12/31の期間で行いました。
対象チャートは日足です。
これまで見られなかった資産残高が右上がりになっているグラフになりました。
結果は以下のようになりました。
純益 42.01
総取引数 33
総利益 66.56
総損失 -24.55
最大ドローダウン 12.67(0.13%)
売りポジション(勝率%) 16(75.00%)
買いポジション(勝率%) 17(70.59%)
勝率(%) 24(72.73%)
負率(%) 9(27.27%)
勝率が70%以上と高くなっているために
純益もプラスになっています。
パラメーターを変更して再度テストしてみました。
今度は現在価格から±50pipsに損切り価格と利益確定価格を置きます。
これ以外は同じ条件です。
純益 32.38
総取引数 33
総利益 92.13
総損失 -59.75
最大ドローダウン 20.12(0.20%)
売りポジション(勝率%) 16(62.50%)
買いポジション(勝率%) 17(58.82%)
勝率(%) 20(60.61%)
負率(%) 13(39.39%)
損切り・利益確定のラインを上下に広げたことで
純益は下がってしまいました。
勝率が下がったことが原因なので、
意図通りに動いたものの利益確定ラインに達する前に
反転して損切りラインに引っかかってしまったということでしょう。
今回、勝率が72.73%とEA作成に向けての光が見えてきたのですが、
1年間の取引数が33回と少ないのがデメリットです。
1週間に1回も取引がないペースですので、
もう少し取引回数を増やしてパフォーマンスを上げたいところです。