以前の記事でパーフェクトオーダーの自動売買ロジックを作って、
5分足でバックテストを行ってみました。
2016年12月1日~2016年12月31日の期間でのバックテストでしたが、
結果は思わしくないものでした。
これまでもパーフェクトオーダーの他に色々とロジックを作成して
5分足でのバックテストを行ってきましたが
どれも芳しくないものばかりでした。
そこで、日足でのバックテストだとパフォーマンスは
どう変わるのかということをテストしていくことにしました。
最初に一番結果が出やすそうなパーフェクトオーダーで
試してみることにしました。
ソースコードは前回と同じですが、もう一度掲載します。
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
//+------------------------------------------------------------------+ //| 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 = 20170209; // 外部パラメータ extern double Lots = 0.01; extern int Slippage = 3; extern string Comments = "Perfect"; // エントリー関数 extern int MAPeriod10 = 10; // 10本移動平均 extern int MAPeriod20 = 20; // 20本移動平均 extern int MAPeriod100 = 100; // 100本移動平均 extern int MAPeriod200 = 200; // 200本移動平均 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 < MAPeriod200) { return(0); } if (Bar_Time == Time[0]) { return(0); } else if (Bar_Time != Time[0]) { Bar_Time = Time[0]; } double MA10 = iMA(NULL,0,MAPeriod10,0,MODE_SMA,PRICE_CLOSE,0); double MA20 = iMA(NULL,0,MAPeriod20,0,MODE_SMA,PRICE_CLOSE,0); double MA100 = iMA(NULL,0,MAPeriod100,0,MODE_SMA,PRICE_CLOSE,0); double MA200 = iMA(NULL,0,MAPeriod200,0,MODE_SMA,PRICE_CLOSE,0); // ポジションを持っているかの判定 if (OrderSelect(Ticket, SELECT_BY_TICKET)) { Close_Time = OrderCloseTime(); // 未決済の場合 if (Close_Time == 0) { // オープンポジションの計算 pos = OrderOpenPrice(); Order_Type = OrderType(); } } // Perfectか int perfectBuy = 0; int perfectSell = 0; // 買いのパーフェクト if (MA10 > MA20 && MA20 > MA100 && MA100 > MA200) { perfectBuy = 1; } // 売りのパーフェクト if (MA10 < MA20 && MA20 < MA100 && MA100 < MA200) { perfectSell = 1; } // ロングポジションのクローズ if (Ticket > 0 && Order_Type == OP_BUY && perfectBuy == 0) { Closed = OrderClose(Ticket, Lots, Bid, Adjust_Slippage, Magenta); if (Closed == true) { Ticket = 0; } // ショートポジションのクローズ } else if (Ticket > 0 && Order_Type == OP_SELL && perfectSell == 0) { Closed = OrderClose(Ticket, Lots, Ask, Adjust_Slippage, Aqua); if (Closed == true) { Ticket = 0; } } // 買いシグナル if(OrdersTotal() == 0 && perfectBuy == 1) { Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Adjust_Slippage, 0, 0, Comments, Magic, 0, Magenta); } // 売りシグナル if(OrdersTotal() == 0 && perfectSell == 1) { Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Adjust_Slippage, 0, 0, Comments, Magic, 0, Aqua); } return(0); } |
バックテスト期間 2016/01/01~2016/12/31
チャート 日足
実行した結果は以下のようになりました。
純益 -37.06
総取引数 8
総利益 36.62
総損失 -73.68
最大ドローダウン 139.66(1.38%)
売りポジション(勝率%) 7(57.14%)
買いポジション(勝率%) 1(100.00%)
勝率(%) 5(62.50%)
負率(%) 3(37.50%)
損失が出てしまいます。
ただし、これまでにない傾向として
勝率が高いということは言えます。
勝率が62.50%とこれまでにない高い勝率ですが、
損益ではマイナスになっています。
勝の時の利益は大きくないのですが、
負の時の損失が大きい(ドローダウンが大きい)ために
トータルとしてはマイナスになっています。
今回のロジックでは、損切りは入れておらず、
パーフェクトオーダーの形が崩れたら
利益・損失に関わらず決済するようにしています。
大きなマイナスが原因でトータルで負け越した結果になっていますので、
ある一定の値幅以上思惑と逆方向に動いた場合は
損切りするようにしておけば、損失は減らせるかもしれません。
ただ、一番のネックは「取引回数が少ない」ことですね。
損切りラインを入れて、多少パフォーマンスが改善したとしても、
1年間のバックテストで取引回数が8回のみでした。
1カ月当たり1回もありません。
やはり日足でパーフェクトオーダーの形ができるのは
そうそう多くないということですね。
パーフェクトオーダーのバックテストとしては、
5分足よりも長く日足よりも短い1時間足等でテストしてみましょう。
他のロジックでは、ボリンジャーバンドの日足の
バックテストも行ってみることにします。
これらの結果が出ましたらまたご報告致します。