ダブルボリューム・マーケットトップ戦略のEAを作成してみる(2)

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

前回の記事で書いた仕掛け及び手仕舞い条件では、ロジックをプログラム化し難いことがプログラミング中に分かったため、以下の条件に変更しました。

仕掛け条件(ショート専用)

  • 1本前のローソク足の高値が、過去60本(日足の場合、過去3ヶ月に相当)の高値を更新
  • 1本前のローソク足の出来高が、過去15本の平均出来高の2倍以上
  • 1本前のローソク足、今の足、次の足のいずれかで終値が、始値より下に位置している
  • 上記条件が全て成立した場合、次のローソク足の始値でショートエントリー

手仕舞い条件

  • トレイリングストップ(利食い)
  • エントリー時のローソク足の1本前のローソク足の高値に最初のSLを置く(損切り)

「変更しちゃっていいの?」という声が聞こえてきそうですが、私は良いと思っています。まずはざっくりと作ってテストしてみて、脈がありそうだと感じたら、その時に改めて真剣にロジックの設計を見直します。100%の完成度を実現するのが3日必要で、80%の完成度なら1日で良いなら、まずは後者を選ぶわけです。モノづくりってそういうもんです。大体どんなものも試作機から作りますでしょ?

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

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

結果はこちらです。

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

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

元々この手法は日足で紹介されていたので、日足で試してみたのですが、なんと約8年で1回しか条件成立していないではないですか!

試しに1時間足とかで試してみたら、それなりにエントリーがありましたし、条件通り動作していましたので、プログラムは問題ないようです(ちなみに、見事な右肩下がりでしたが)。

見るべきポイントはオレンジ色の枠で囲っていますので、そこを重点的にご注目いただければ幸いです。上記の仕掛け条件と手仕舞い条件をきちんと満たしていることが分かると思います。

このトレード戦略は大量の通貨ペアを同時にウォッチして、条件成立の確率を上げないと使えなそうですね。

それと、これは初めから分かっていたことですが、MT4で取得できる出来高はいわゆる取引量ではなくティック数なので、コナーズ氏の想定していたものとは違います。これも上手く機能しない原因の1つでしょう。

「じゃあ何でこんなものを作ってみようと思ったのか?」ですって?それは、あれです。出来高のVolume()を一度使ってみたかったんです(笑)

DoubleVolumeMarketTop.mq4のコードを公開しますので、良かったら参考になさってください。「1本前のローソク足、今の足、次の足のいずれかで」という部分は他のEAを作成する際に役に立ちそうな気がします。

DoubleVolumeMarketTop.mq4

001//+------------------------------------------------------------------+
002//|                                        DoubleVolumeMarketTop.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//| EAパラメータ設定情報                                             |
025//+------------------------------------------------------------------+
026extern string Note01       = "=== General ==================================================";
027extern int    MagicNumber  = 7777777;
028extern int    SlippagePips = 5;
029extern string Comments     = "";
030extern double FixLotSize   = 0.01;
031 
032extern string Note02       = "=== Entry ====================================================";
033extern int    LongPeriod   = 60;
034extern int    ShortPeriod  = 15;
035extern double Times        = 2.0;
036 
037extern string Note03       = "=== Exit =====================================================";
038extern string Note03_1     = "--- Trailing Stop ---------------------------------------------";
039extern double TS_StartPips = 15.0;
040extern double TS_StopPips  = 10.0;
041 
042//+------------------------------------------------------------------+
043//| グローバル変数                                                   |
044//+------------------------------------------------------------------+
045// 共通
046double gPipsPoint     = 0.0;
047int    gSlippage      = 0;
048color  gArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red}; //BUY: Blue, SELL: Red
049int    gPrvBars       = 0;
050 
051int    gBars          = 0;
052 
053//+------------------------------------------------------------------+
054//| Expert initialization function                                   |
055//+------------------------------------------------------------------+
056int OnInit()
057{
058  gPipsPoint = currencyUnitPerPips(Symbol());
059  gSlippage = getSlippage(Symbol(), SlippagePips);
060 
061  gPrvBars = Bars;
062 
063  return(INIT_SUCCEEDED);
064}
065 
066//+------------------------------------------------------------------+
067//| Expert deinitialization function                                 |
068//+------------------------------------------------------------------+
069void OnDeinit(const int reason)
070{
071}
072 
073//+------------------------------------------------------------------+
074//| Expert tick function                                             |
075//+------------------------------------------------------------------+
076void OnTick()
077{
078  int currentBars = Bars;
079 
080  // -----------------------------------------------------------------
081  // 手仕舞い
082  // -----------------------------------------------------------------
083  trailingStopGeneral(MagicNumber, TS_StartPips, TS_StopPips);
084 
085  // -----------------------------------------------------------------
086  // 仕掛けフィルター
087  // -----------------------------------------------------------------
088  // 新しい足を生成した時ではない場合は、スキップ
089  if(currentBars == gPrvBars){
090    gPrvBars = currentBars;
091    return;
092  }
093 
094  // -----------------------------------------------------------------
095  // 仕掛け
096  // -----------------------------------------------------------------
097  // ①1本前のローソク足の高値が、過去60本(日足の場合、過去3ヶ月に相当)の高値を更新
098  double latestHigh   = NormalizeDouble(High[1], Digits);
099  double longTermHigh = NormalizeDouble(High[iHighest(NULL, 0, MODE_HIGH, LongPeriod, 2)], Digits);
100 
101  bool flg1 = false;
102 
103  if(latestHigh >= longTermHigh){
104    flg1 = true;
105  }
106 
107  // ②1本前のローソク足の出来高が、過去15本の平均出来高の2倍以上
108  double avgVolume = 0.0;
109 
110  for(int i = 2; i <= ShortPeriod + 1; i++){
111    avgVolume += Volume[i];
112  }
113 
114  avgVolume = avgVolume / (double)ShortPeriod;
115 
116  bool flg2 = false;
117 
118  if(Volume[1] >= avgVolume * Times){
119    flg2 = true;
120  }
121 
122  if(gBars == 0 && flg1 && flg2){
123    gBars = currentBars;
124  }
125 
126  // ③1本前のローソク足、今の足、次の足のいずれかで終値が、始値より下に位置している
127  bool flg3 = false;
128 
129  if(currentBars <= gBars + 2){
130    if(Close[1] < Open[1]){
131      flg3 = true;
132      double sl = NormalizeDouble(High[1], Digits);
133    }
134  }else{
135    gBars = 0;
136  }
137 
138 
139  if(flg3){
140    // ショートのみのエントリー
141    int ticket = orderSendReliable(Symbol(), OP_SELL, FixLotSize, Bid, gSlippage, sl, 0, Comments, MagicNumber, 0, gArrowColor[OP_SELL]);
142    gBars = 0;
143  }
144 
145  gPrvBars = currentBars;
146}

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

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

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

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

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

アイキャッチ

>

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

CTR IMG