FX MT4 システムトレード

FX(MT4)でパーフェクトオーダーのバックテストを日足で行った結果

スポンサードリンク

以前の記事でパーフェクトオーダーの自動売買ロジックを作って、
5分足でバックテストを行ってみました。

2016年12月1日~2016年12月31日の期間でのバックテストでしたが、
結果は思わしくないものでした。

これまでもパーフェクトオーダーの他に色々とロジックを作成して
5分足でのバックテストを行ってきましたが
どれも芳しくないものばかりでした。

そこで、日足でのバックテストだとパフォーマンスは
どう変わるのかということをテストしていくことにしました。

最初に一番結果が出やすそうなパーフェクトオーダーで
試してみることにしました。

ソースコードは前回と同じですが、もう一度掲載します。

//+------------------------------------------------------------------+
//|                                                     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時間足等でテストしてみましょう。

他のロジックでは、ボリンジャーバンドの日足の
バックテストも行ってみることにします。

これらの結果が出ましたらまたご報告致します。

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

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