モメンタムギャップ戦略のEAを作成してみる(2)

「コナーズの短期売買実践」のトレード戦略のEA化【第2弾】

前回の記事で書いた仕掛け条件だと、最高値/最安値更新中に次のローソク足が生成された時、意図したギャップにならないことがバックテストして気づいたので、条件を1箇所変更しました。

仕掛け条件(買いの場合)

  • 1本前の足を基準に、14本ADX>25でかつ14本+DI>14本分の-DI
  • 1本前の足の始値が2本前の高値よりADX_DifPipsを超えて上に位置(ギャップを空けて上昇を表現)
  • 現在足の始値で買い(仕掛けの判断は新しい足が生成された時だけ)

では、早速動かしてみましょう。バックテストは以下の条件で実施しました。

  • 対象EA:MomentumGap
  • 通貨ペア:EURUSD
  • ローソク足の種類:日足
  • モデル:全ティック
  • スプレッド:3pips固定
  • バックテスト期間:2008/1/1~2016/7/5
  • ヒストリカルデータ:Dukascopy社のJForexからダウンロードした1分足
  • 初期口座残高:10,000ドル
  • ロット数:0.01固定

結果はこちらです。

MomentumGapのトレード結果(グラフ)

MomentumGapのトレード結果(チャート)

よくよく考えると、為替相場は株式相場と違って24h開いているので、ギャップは休場明けの月曜の最初等でしか発生しないんですよね…。完璧に失念していました。

EAのパラメータは適当です。不整合チャートも発生していましたが、気にしないでおきます。

モメンタムギャップ戦略はランナウェイギャップを狙ったものでしたが、為替相場においては、平均値に戻ろうとする力の方が大きいような気がします(トレード回数が少なすぎてボツにしたので、ちゃんと調べていませんが)。

このトレード戦略もダブルボリューム・マーケットトップ戦略と同じで大量の通貨ペアを同時にウォッチして、条件成立の確率を上げないと使えなそうです。次はもっと日中足でも使える戦略を探さないといけませんね!

MomentumGap.mq4のコードを公開しますので、良かったら参考になさってください。

001//+------------------------------------------------------------------+
002//|                                                  MomentumGap.mq4 |
003//|                                     Copyright (c) 2016, りゅーき |
004//|                                            https://autofx100.com/ |
005//+------------------------------------------------------------------+
006#property copyright "Copyright (c) 2016, りゅーき"
007#property link      "https://autofx100.com/"
008#property version   "1.00"
009 
010//+------------------------------------------------------------------+
011//| ライブラリ                                                       |
012//+------------------------------------------------------------------+
013#include <stderror.mqh>
014#include <stdlib.mqh>
015#include <WinUser32.mqh>
016#include <Original/Application.mqh>
017#include <Original/Basic.mqh>
018#include <Original/DateAndTime.mqh>
019#include <Original/LotSizing.mqh>
020#include <Original/OrderHandle.mqh>
021#include <Original/OrderReliable.mqh>
022 
023//+------------------------------------------------------------------+
024//| 定数                                                             |
025//+------------------------------------------------------------------+
026// #define
027 
028//+------------------------------------------------------------------+
029//| EAパラメータ設定情報                                             |
030//+------------------------------------------------------------------+
031extern string Note01       = "=== General ==================================================";
032extern int    MagicNumber  = 7777777;
033extern int    SlippagePips = 5;
034extern string Comments     = "";
035extern double FixLotSize   = 0.01;
036 
037extern string Note02       = "=== Entry ====================================================";
038extern int    ADX_Period   = 14;
039extern double ADX_Value    = 25.0;
040extern double ADX_DifPips  = 10.0;
041 
042extern string Note03       = "=== Exit =====================================================";
043extern double SL_Pips      = 10.0;
044extern double TP_Pips      = 15.0;
045extern string Note03_1     = "--- Trailing Stop --------------------------------------------";
046extern bool   UseTS        = false;
047extern double TS_StartPips = 15.0;
048extern double TS_StopPips  = 10.0;
049 
050//+------------------------------------------------------------------+
051//| グローバル変数                                                   |
052//+------------------------------------------------------------------+
053// 共通
054double gPipsPoint     = 0.0;
055int    gSlippage      = 0;
056color  gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red
057int    gPrvBars       = 0;
058 
059//+------------------------------------------------------------------+
060//| Expert initialization function                                   |
061//+------------------------------------------------------------------+
062int OnInit()
063{
064  gPipsPoint = currencyUnitPerPips(Symbol());
065  gSlippage = getSlippage(Symbol(), SlippagePips);
066 
067  gPrvBars = Bars;
068 
069  return(INIT_SUCCEEDED);
070}
071 
072//+------------------------------------------------------------------+
073//| Expert deinitialization function                                 |
074//+------------------------------------------------------------------+
075void OnDeinit(const int reason)
076{
077}
078 
079//+------------------------------------------------------------------+
080//| Expert tick function                                             |
081//+------------------------------------------------------------------+
082void OnTick()
083{
084  int currentBars = Bars;
085 
086  // -----------------------------------------------------------------
087  // 手仕舞い
088  // -----------------------------------------------------------------
089  if(UseTS){
090    trailingStopGeneral(MagicNumber, TS_StartPips, TS_StopPips);
091  }
092 
093  // -----------------------------------------------------------------
094  // 仕掛けフィルター
095  // -----------------------------------------------------------------
096  // 新しい足を生成した時ではない場合は、仕掛けない
097  if(currentBars == gPrvBars){
098    gPrvBars = currentBars;
099    return;
100  }
101 
102  // -----------------------------------------------------------------
103  // 仕掛け
104  // -----------------------------------------------------------------
105  double ADX  = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MAIN,    1);
106  double P_DI = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_PLUSDI,  1);
107  double M_DI = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MINUSDI, 1);
108 
109  double open1 = NormalizeDouble(Open[1], Digits);
110  double high2 = NormalizeDouble(High[2], Digits);
111  double low2  = NormalizeDouble(Low[2],  Digits);
112 
113  if(ADX > ADX_Value){
114    if(P_DI > M_DI){
115      if(open1 - high2 > ADX_DifPips * gPipsPoint){
116        int ticket = orderSendReliableRange(Symbol(), OP_BUY, FixLotSize, Ask, gSlippage, SL_Pips, TP_Pips, Comments, MagicNumber, 0, gArrowColor[OP_BUY]);
117      }
118    }else if(M_DI > P_DI){
119      if(low2 - open1 > ADX_DifPips * gPipsPoint){
120        ticket = orderSendReliableRange(Symbol(), OP_SELL, FixLotSize, Bid, gSlippage, SL_Pips, TP_Pips, Comments, MagicNumber, 0, gArrowColor[OP_SELL]);
121      }
122    }
123  }
124 
125  // 本来はticketの値によって後続の処理を制御する必要があるが、簡単のため、ここでは無視
126 
127  gPrvBars = currentBars;
128}

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG