FX MT4 システムトレード

MT4EA作成・FXのパーフェクトオーダーによるエントリーロジックを作ってみた

スポンサードリンク

MT4のEAを作成してみました。

今回は移動平均線を使ったパーフェクトオーダー
によるエントリーロジックです。

パーフェクトオーダーというのは、
短期移動平均線、中期移動平均線、長期移動平均線を引きます。

強い上昇トレンドがある場合には
短期移動平均線 > 中期移動平均線 > 長期移動平均線
となり、逆に強い下降トレンドがある場合には
短期移動平均線 < 中期移動平均線 < 長期移動平均線
となる場合が見られ、
これをエントリーシグナルとして使用するというものです。

今回は、10本、20本、100本、200本の
移動平均を使用しました。

早速プログラムソースです。

//+------------------------------------------------------------------+
//|                                                     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);
}

移動平均は、以下の関数を使用して求めています。

double MA10 = iMA(NULL,0,MAPeriod10,0,MODE_SMA,PRICE_CLOSE,0);

エントリータイミングは、以下で買いシグナル

MA10 > MA20 && MA20 > MA100 && MA100 > MA200

以下で売りシグナルを出します。

MA10 < MA20 && MA20 < MA100 && MA100 < MA200

手仕舞いはパーフェクトオーダーの形が
崩れた時に行います。

バックテストの結果も合わせて報告したいのですが、
先日のボリンジャーバンドの結果がまだ出ませんので
実行出来次第ご報告させて頂きます。

2017/02/17 追記

5分足でのパーフェクトオーダーのバックテスト結果が出ました。

5分足だからなのか、結果はよくないですね。

バックテスト期間 2016/12/01~2016/12/31
通貨ペア USD/JPY
5分足

純益 -14.31
総取引数 144

総利益 63.71
総損失 -78.02

勝率 45(31.25%)
負率 99(68.75%)

以上のような結果でした。

意外だったのは、1カ月間の間に取引が144回あったということです。

パーフェクトオーダーの形になるのは
もっと少ないと思っていたのですが、
5分足だと頻繁に起こるようです。

その分、勝率も下がったということでしょうか。

色々な指標を使ってUSD/JPYの5分足で
バックテストを行ってきましたが、
どれもいまいちな結果です。

5分足だと動きがランダムすぎて
テクニカル指標通りに動いてくれないのでしょうか。

システムトレードによる自動売買を考えているので、
日中(夜間でも)に頻繁にトレードがあるべき
と考えていたのですが、利益を見込めるロジックが
できなければ何の意味もありません。

細かいスパンでの売買ということにはこだわらずに
今後は日足でのバックテストを行うようにしてみます。

その結果も掲載していきますね。

スポンサードリンク

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

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