MT4のEAを作成してみました。
今回は移動平均線を使ったパーフェクトオーダー
によるエントリーロジックです。
パーフェクトオーダーというのは、
短期移動平均線、中期移動平均線、長期移動平均線を引きます。
強い上昇トレンドがある場合には
短期移動平均線 > 中期移動平均線 > 長期移動平均線
となり、逆に強い下降トレンドがある場合には
短期移動平均線 < 中期移動平均線 < 長期移動平均線
となる場合が見られ、
これをエントリーシグナルとして使用するというものです。
今回は、10本、20本、100本、200本の
移動平均を使用しました。
早速プログラムソースです。
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); } |
移動平均は、以下の関数を使用して求めています。
1 |
double MA10 = iMA(NULL,0,MAPeriod10,0,MODE_SMA,PRICE_CLOSE,0); |
エントリータイミングは、以下で買いシグナル
1 |
MA10 > MA20 && MA20 > MA100 && MA100 > MA200 |
以下で売りシグナルを出します。
1 |
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分足だと動きがランダムすぎて
テクニカル指標通りに動いてくれないのでしょうか。
システムトレードによる自動売買を考えているので、
日中(夜間でも)に頻繁にトレードがあるべき
と考えていたのですが、利益を見込めるロジックが
できなければ何の意味もありません。
細かいスパンでの売買ということにはこだわらずに
今後は日足でのバックテストを行うようにしてみます。
その結果も掲載していきますね。