2016年4月8日金曜日

[MT4プログラミング]EAに組み込みやすいようにインジケータを作成する。

EAにインジケータを組み込もうと思うと、iCustomで呼び出さないのであれば、EA内部に実装する必要があります。

インジケータを作成する際、EAで実装しやすいようにするにはどうすればよいでしょうか?
例で示します。
このインジケータは高値安値終値始値の平均をとるものです。平滑化のために一本前の値と単純平均をとっています。

//------------------------------------------------------------------
// テストインジケータ
#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//バッファーを指定する。
#property indicator_buffers 1

//プロット数を指定する。
#property indicator_plots   1

#property indicator_label1  "HARF"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_width1  2

// バッファー
double harf[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   string short_name = "Test";
   
   int count = 0;
   SetIndexBuffer(count++, harf);

   return INIT_SUCCEEDED;
}

//------------------------------------------------------------------
//終了処理
void OnDeinit(const int reason)
{

}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total,          //各レート要素数
                const int prev_calculated,      //計算済み要素数
                const datetime &time[],         //要素ごとの時間配列
                const double &open[],           //オープン価格配列
                const double &high[],           //高値配列
                const double &low[],            //安値配列
                const double &close[],          //クローズ価格配列
                const long &tick_volume[],      //ティック数(要素の更新回数)
                const long &volume[],           //実ボリューム(?)
                const int &spread[])            //スプレット
{
   for( int i = rates_total - prev_calculated - 1; i >= 0 && !IsStopped(); i-- )
   {
      if( i >= rates_total - 1 )
      {
         harf[i] = (open[i] + close[i] + high[i] + low[i]) / 4 ;
      }
      else
      {
         harf[i] = ((open[i] + close[i] + high[i] + low[i]) / 4 + harf[i + 1]) / 2;
      }
   }
   
   return rates_total - 1;
}

さて、表示用のバッファであるharfは、チャートのバーが更新される事に勝手に増えていきます。また関数の引数であるhigh low open closeも、EAの中では使えません。

そこで、このコードを次のように直すと、EAに組み込みやすくなります。

//------------------------------------------------------------------
// テストインジケータ
#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//バッファーを指定する。
#property indicator_buffers 1

//プロット数を指定する。
#property indicator_plots   1

#property indicator_label1  "HARF"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_width1  2

// バッファー
double harf[];       // 表示用


double harfCalc[];   // 表示計算用
int prevCalculated;  // 前回計算値

//------------------------------------------------------------------
//初期化
int OnInit()
{
   string short_name = "Test";
   
   int count = 0;
   SetIndexBuffer(count++, harf);

   prevCalculated = 0;

   return INIT_SUCCEEDED;
}

//------------------------------------------------------------------
//終了処理
void OnDeinit(const int reason)
{

}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total,          //各レート要素数
                const int prev_calculated,      //計算済み要素数
                const datetime &time[],         //要素ごとの時間配列
                const double &open[],           //オープン価格配列
                const double &high[],           //高値配列
                const double &low[],            //安値配列
                const double &close[],          //クローズ価格配列
                const long &tick_volume[],      //ティック数(要素の更新回数)
                const long &volume[],           //実ボリューム(?)
                const int &spread[])            //スプレット
{
   int ratesTotal = iBars(Symbol(), Period());

   int currentArraySize = ArraySize(harfCalc);
   if( currentArraySize < ratesTotal )
   {
      ArraySetAsSeries(harfCalc, false);

      ArrayResize(harfCalc, ratesTotal);
      
      ArraySetAsSeries(harfCalc, true);
      
      for( int i = 0; i < ratesTotal - currentArraySize; i++ )
      {
         harfCalc[i] = EMPTY_VALUE;
      }
   }

   for( int i = ratesTotal - prevCalculated - 1; i >= 0 && !IsStopped(); i-- )
   {
      if( i >= ratesTotal - 1 )
      {
         harfCalc[i] = (iOpen(Symbol(), Period(), i) + iClose(Symbol(), Period(), i) + iHigh(Symbol(), Period(), i) + iLow(Symbol(), Period(), i)) / 4 ;
      }
      else
      {
         harfCalc[i] = ((iOpen(Symbol(), Period(), i) + iClose(Symbol(), Period(), i) + iHigh(Symbol(), Period(), i) + iLow(Symbol(), Period(), i)) / 4 + harfCalc[i + 1]) / 2;
      }
      
      // 表示用バッファに値を設定する。
      harf[i] = harfCalc[i];
   }
   
   prevCalculated = ratesTotal - 1;
   
   return rates_total - 1;
}

まず、open close high low引数は使用せず、iOpen iClose iHigh iLow関数を使用します。
同じ値が取得可能です。

さて、バーの更新毎に増えるバッファを自力で実装する必要があります。
   int currentArraySize = ArraySize(harfCalc);
   if( currentArraySize < ratesTotal )
   {
      ArraySetAsSeries(harfCalc, false);

      ArrayResize(harfCalc, ratesTotal);
      
      ArraySetAsSeries(harfCalc, true);
      
      for( int i = 0; i < ratesTotal - currentArraySize; i++ )
      {
         harfCalc[i] = EMPTY_VALUE;
      }
   }
の部分です。

これは、iBarsで取得したバーの本数と、配列の数が異なる場合、リサイズを行うという処理です。リサイズ時増える分には値は増える前までの値は保持されています。これを利用します。
初期値にEMPTY_VALUEを設定しています。

このように作成しておくと、EAにする際、簡単に移植が可能です。
EAにインジケータ部分を移植した例です。

//+------------------------------------------------------------------+
//|                                                       TestEA.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

double harfCalc[];   // 表示計算用
int prevCalculated;  // 前回計算値

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   prevCalculated = 0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //インジケータの計算
   int ratesTotal = iBars(Symbol(), Period());
   int currentArraySize = ArraySize(harfCalc);
   if( currentArraySize < ratesTotal )
   {
      ArraySetAsSeries(harfCalc, false);

      ArrayResize(harfCalc, ratesTotal);
      
      ArraySetAsSeries(harfCalc, true);
      
      for( int i = 0; i < ratesTotal - currentArraySize; i++ )
      {
         harfCalc[i] = EMPTY_VALUE;
      }
   }

   for( int i = ratesTotal - prevCalculated - 1; i >= 0 && !IsStopped(); i-- )
   {
      if( i >= ratesTotal - 1 )
      {
         harfCalc[i] = (iOpen(Symbol(), Period(), i) + iClose(Symbol(), Period(), i) + iHigh(Symbol(), Period(), i) + iLow(Symbol(), Period(), i)) / 4 ;
      }
      else
      {
         harfCalc[i] = ((iOpen(Symbol(), Period(), i) + iClose(Symbol(), Period(), i) + iHigh(Symbol(), Period(), i) + iLow(Symbol(), Period(), i)) / 4 + harfCalc[i + 1]) / 2;
      }
   }
   prevCalculated = ratesTotal - 1;   
  }
//+------------------------------------------------------------------+

このように、基本コピペだけで作成可能です。
関数化しておけば、さらに簡単です。

ということで、久しぶりにプログラムの話題でした。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2016年4月7日木曜日

[雑記]レンジ相場を判定したい! 7本FractalsからTick値見ながらレンジ描画

ということで、検証するにしても、見える化しないと戦略が思いつかないため、まずは見えるかしてみました。

■検証中のレンジ、トレンドエリア表示インジケータ EURUSD1H


描画ロジックは単純です。
1時間足の7本高値が発生した場合、それ以前の7本高値との幅を上限バンドとするというルールです。
安値は逆です。
また、Tick値を見てTick値が小さすぎる際に発生した高値安値位置は、無視します。
同じ価格位置に高値安値が発生した場合は、その前の高値安値を調べに行きます。

+して、各国の取引時間を表示できるようにしてあります。

■2016/4/1~4/7 EURUSD1H

4/1までの上昇相場からレンジ相場に移行しています。枠線だけの四角が各国の取引時間を示しています。(青枠:日本、黄色:EU、赤:アメリカ)それぞれの人たちが、どのような行動をとっているのかがはっきりと表れています。

まず、日本とEUの人たちは、EURを売っています。アメリカの人たちはEURを買っています。(というよりたぶんドルを売っています。)
そのため、日本時間からEU時間の中盤にかけて下げ相場となり、アメリカ時間で戻すといレンジを形成しています。昨日までは、7本高値安値位置の終値がそれぞれ上限・下限バンド内で収まっていて、レンジを形成していましたが、4/7はアメリカ時間に上限を抜けた位置で高値を形成しました。 レンジが崩れつつあります。

■2016/3/21~3/31 EURUSD1H


下げ相場→上げ相場の流れを見てみたいと思います。
3/24まで、下限バンドの下側で、下値頂点をつけながら遷移していきます。
ただ、もう少し拡大してみると、3/22までは、アメリカ時間の人たちが売ってきていますが、2/23はアメリカは中立化、3/24でアメリカは買い転換しています。(その間、日本-EUは売り)

その後、2/28の朝までレンジを演出したのち、アメリカ時間の頭で買いに転換となります。

このようにみると、EURUSDにおいては上限下限の更新状態と、EU時間アメリカ時間の値動きが流れの変化を考えるのにとても重要に見えてきます。

その観点で、再度直近のレンジを見ると昨日の形として、EU売り、アメリカ買いという流れに変化はありません。ただし、バンド上限超えというシグナルは発生しています。これを準備状態ととらえると、今日の時点で、EUが買いに回ると上昇トレンド開始、EUが売りに回るとレンジに戻るという流れに見えます。

まだ目視レベルの検証ですが、なにやら結構使える予感がしてきました。っていうか、かなりよさそう。

考え方は単純なのですが、プログラムで組むと結構苦労しました・・・・・。
これは、ちょっと手間賃をもらわないと出せないコード量になってしまいました。

しかし、これは、裁量トレード派の人たちもかなり役立つインジケータな感じがします。

このインジケータを使用して、トレード手法を記述していただいて、その方からのページで購入した場合FX-ONのアフィリエイト報酬で50%とかもっていっていただける変わりに、手法のPDFを配布していただけるとかなら、大歓迎なのですが・・・・・・。まぁまだトレードに対してはっきりと優位性を確認できてないので、ないですよね^^;;

どなたかやってみたいという方はFX-ONメッセージでご連絡ください。
ソースコードはお渡しできませんが、モニターとしてex4ファイルはお渡しできます。トレードに活用していただいて有用かどうかのご連絡をいただくのが条件となります。

トレード手法をFX-ONにて販売するかどうかはお任せいたします。
2016/4/28までの募集です。

私はあくまでEA化が目的ですので、ここからEAに展開していきたいと思っています。特徴量を数値化しないといけません・・・うー結構大変です。しかし行けそうな予感がするので頑張ります。

あ、有料といえば、変化率分散バンドの前の日を含めて偏差をとるバージョンですが、有用性を確認できなかったため、公開を見合わせます。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2016年4月6日水曜日

[MT4インジケータ]期間が変更可能なフラクタルでレンジ相場を判定したい。

Gewinn7や、今開発中のGewinn8の精度を高めるため、レンジ相場かどうかを判定したいなぁと四苦八苦しています。

レンジ相場かどうかの判定といえば、まず高値安値の観測から始まるのですが、MT4標準でついているFractalsは5本間の高値安値位置に矢印を描画するというインジケータです。

日足などでは問題ないのでしょうが、時間足など短い足だと、矢印がたくさん出てしまい、どれを観測すればよいのかわからなくなってしまいます。

そこで、5本ではなく7本など、観測期間を変更可能なフラクタルを作成しました。また、高値安値ではなくてクローズ値をベースに描画できるようにもしてあります。

■MT4標準フラクタル(上) カスタムフラクタル(下)


これでも、例えば画像の例だと、日本時間の値動きが少ない時間帯に矢印が出たりします。
そのため、もう一つTickVolumeと合わせて表示することで有効な矢印かどうかを判断しましょう。

■カスタムフラクタルと、TickVolume

TickVolumeにて平均値を下回っている個所の矢印は有効ではないと判断します。
ここからレンジ相場のレンジを判断していくのはまだ研究中です・・。


判定期間が変更可能なフラクタル
判定期間が変更可能なフラクタル
判定期間が変更可能なフラクタル | fx-on.com

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。


ソースコードです。

2016年4月5日火曜日

[Gewinn7]2016/03のGewinn7フォワード報告

2016/3のGewinn7 フォワードテストの成績は次の通りでした。
Gewnn7のOANDAリアル口座でのフォワードテスト
 | fx-on.com


OANDA PRO 口座
初期資金 144,490円

取引損益スポット損益スワップ損益売買手数料
4,055.0965円4,079.5298円-24.4333円0.0000円

通貨ペア取引Lv売買約定値数量約定日時取引損益スポット損益スワップ損益原取引注文番号原取引
EUR/USD新規501.0861,0002016/03/0212:000.0000円0.0000円0.0000円----
EUR/USD新規501.0851,0002016/03/0220:000.0000円0.0000円0.0000円----
EUR/USD新規501.0871,0002016/03/0311:000.0000円0.0000円0.0000円----
EUR/USD新規501.0861,0002016/03/0314:000.0000円0.0000円0.0000円----
EUR/USD新規501.0871,0002016/03/0318:000.0000円0.0000円0.0000円----
EUR/USD新規501.0911,0002016/03/0321:000.0000円0.0000円0.0000円----
EUR/USD決済501.0961,0002016/03/0414:05-1,115.2054円-1,114.6894円-0.5160円1013827841.086
EUR/USD決済501.0951,0002016/03/0416:00-1,129.2449円-1,128.6202円-0.6247円1013855191.085
EUR/USD決済501.0951,0002016/03/0416:00-967.5508円-966.9261円-0.6247円1013983951.087
EUR/USD決済501.0951,0002016/03/0416:00-1,065.4962円-1,064.8715円-0.6247円1013990981.086
EUR/USD決済501.0951,0002016/03/0416:00-962.9952円-962.3705円-0.6247円1014004631.087
EUR/USD決済501.0951,0002016/03/0416:00-498.3284円-497.7037円-0.6247円1014015541.091
EUR/USD新規501.0951,0002016/03/0720:000.0000円0.0000円0.0000円----
EUR/USD新規501.0951,0002016/03/0723:000.0000円0.0000円0.0000円----
EUR/USD新規501.0981,0002016/03/0800:000.0000円0.0000円0.0000円----
EUR/USD決済501.1011,0002016/03/0818:44637.0431円637.8172円-0.7741円1014476121.095
EUR/USD決済501.1011,0002016/03/0818:44641.5586円642.3327円-0.7741円1014485701.095
EUR/USD決済501.1011,0002016/03/0818:44261.1237円261.9002円-0.7765円1014491631.098
EUR/USD新規501.0981,0002016/03/0911:000.0000円0.0000円0.0000円----
EUR/USD決済501.0981,0002016/03/1008:3843.9484円44.1546円-0.2062円1014744661.098
EUR/USD新規501.0981,0002016/03/1019:000.0000円0.0000円0.0000円----
EUR/USD決済501.0871,0002016/03/1020:47-1,252.5178円-1,252.4160円-0.1018円1014933661.098
EUR/USD新規501.1041,0002016/03/1023:000.0000円0.0000円0.0000円----
EUR/USD新規501.1121,0002016/03/1122:000.0000円0.0000円0.0000円----
EUR/USD新規501.1181,0002016/03/1201:000.0000円0.0000円0.0000円----
EUR/USD新規501.1171,0002016/03/1408:000.0000円0.0000円0.0000円----
EUR/USD決済501.1131,0002016/03/1417:13970.6150円971.3140円-0.6990円1014987101.104
EUR/USD決済501.1121,0002016/03/1417:25-89.4186円-88.7032円-0.7154円1015165961.112
EUR/USD新規501.1101,0002016/03/1500:000.0000円0.0000円0.0000円----
EUR/USD新規501.1111,0002016/03/1511:000.0000円0.0000円0.0000円----
EUR/USD新規501.1111,0002016/03/1514:000.0000円0.0000円0.0000円----
EUR/USD新規501.1111,0002016/03/1516:520.0000円0.0000円0.0000円----
EUR/USD新規501.1121,0002016/03/1516:550.0000円0.0000円0.0000円----
EUR/USD決済501.1121,0002016/03/1516:57-707.3823円-706.6938円-0.6885円1015187731.118
EUR/USD新規501.1071,0002016/03/1519:000.0000円0.0000円0.0000円----
EUR/USD新規501.1121,0002016/03/1522:000.0000円0.0000円0.0000円----
EUR/USD新規501.1111,0002016/03/1603:000.0000円0.0000円0.0000円----
EUR/USD決済501.1101,0002016/03/1611:05-717.4372円-717.0862円-0.3510円1015430481.117
EUR/USD決済501.1101,0002016/03/1611:0514.3995円14.7484円-0.3489円1015489341.110
EUR/USD決済501.1081,0002016/03/1617:10-370.1929円-369.4925円-0.7004円1015590811.111
EUR/USD新規501.1091,0002016/03/1620:000.0000円0.0000円0.0000円----
EUR/USD新規501.1061,0002016/03/1623:000.0000円0.0000円0.0000円----
EUR/USD決済501.1061,0002016/03/1700:00-492.4673円-491.3741円-1.0932円1015604481.111
EUR/USD新規501.1081,0002016/03/1702:000.0000円0.0000円0.0000円----
EUR/USD決済501.1281,0002016/03/1816:411,843.3173円1,843.9759円-0.6586円1015617411.111
EUR/USD決済501.1281,0002016/03/1816:411,797.7229円1,798.3818円-0.6589円1015617661.112
EUR/USD決済501.1281,0002016/03/1816:412,290.7018円2,291.3581円-0.6563円1015630631.107
EUR/USD決済501.1281,0002016/03/1816:411,822.1895円1,822.8483円-0.6588円1015645121.112
EUR/USD決済501.1281,0002016/03/1816:411,877.8323円1,878.4908円-0.6585円1015666441.111
EUR/USD決済501.1281,0002016/03/1816:412,143.8049円2,144.4619円-0.6570円1015778621.109
EUR/USD決済501.1281,0002016/03/1816:412,404.2131円2,404.8688円-0.6557円1015792991.106
EUR/USD決済501.1281,0002016/03/1816:412,229.4948円2,230.1514円-0.6566円1015804211.108
EUR/USD新規501.1281,0002016/03/1821:000.0000円0.0000円0.0000円----
EUR/USD新規501.1301,0002016/03/1900:000.0000円0.0000円0.0000円----
EUR/USD新規501.1271,0002016/03/2108:000.0000円0.0000円0.0000円----
EUR/USD新規501.1281,0002016/03/2111:000.0000円0.0000円0.0000円----
EUR/USD新規501.1271,0002016/03/2114:000.0000円0.0000円0.0000円----
EUR/USD新規501.1251,0002016/03/2117:000.0000円0.0000円0.0000円----
EUR/USD新規501.1281,0002016/03/2120:000.0000円0.0000円0.0000円----
EUR/USD新規501.1271,0002016/03/2123:000.0000円0.0000円0.0000円----
EUR/USD新規501.1241,0002016/03/2202:000.0000円0.0000円0.0000円----
EUR/USD新規501.1241,0002016/03/2205:000.0000円0.0000円0.0000円----
EUR/USD新規501.1241,0002016/03/2208:000.0000円0.0000円0.0000円----
EUR/USD決済501.1221,0002016/03/2221:00-623.2374円-622.3194円-0.9180円1016166661.128
EUR/USD新規501.1231,0002016/03/2222:000.0000円0.0000円0.0000円----
EUR/USD決済501.1211,0002016/03/2302:05-1,006.8876円-1,005.6715円-1.2161円1016180851.130
EUR/USD新規501.1221,0002016/03/2303:000.0000円0.0000円0.0000円----
EUR/USD決済501.1221,0002016/03/2308:00-649.4404円-649.2674円-0.1730円1016432071.127
EUR/USD新規501.1221,0002016/03/2309:000.0000円0.0000円0.0000円----
EUR/USD決済501.1211,0002016/03/2311:00-775.2093円-774.8631円-0.3462円1016439031.128
EUR/USD決済501.1211,0002016/03/2312:00-621.3726円-620.9692円-0.4034円1016444471.127
EUR/USD決済501.1211,0002016/03/2312:00-402.4081円-402.0054円-0.4027円1016454971.125
EUR/USD決済501.1211,0002016/03/2312:00-767.3651円-766.9612円-0.4039円1016469431.128
EUR/USD決済501.1211,0002016/03/2312:00-587.6957円-587.2924円-0.4033円1016482021.127
EUR/USD決済501.1211,0002016/03/2312:00-312.5769円-312.1745円-0.4024円1016494561.124
EUR/USD決済501.1211,0002016/03/2312:00-333.9127円-333.5102円-0.4025円1016500941.124
EUR/USD決済501.1211,0002016/03/2312:00-283.3807円-282.9784円-0.4023円1016580601.124
EUR/USD決済501.1211,0002016/03/2312:00-121.6782円-121.2764円-0.4018円1016631311.123
EUR/USD決済501.1211,0002016/03/2312:00-70.0234円-69.6217円-0.4017円1016652981.122
EUR/USD決済501.1211,0002016/03/2312:00-72.0396円-71.8675円-0.1721円1016738251.122
EUR/USD新規501.1161,0002016/03/2522:000.0000円0.0000円0.0000円----
EUR/USD新規501.1161,0002016/03/2600:000.0000円0.0000円0.0000円----
EUR/USD決済501.1211,0002016/03/2920:00-479.3701円-478.5002円-0.8699円1017070931.116
EUR/USD決済501.1221,0002016/03/2922:00-570.5191円-569.5341円-0.9850円1017073481.116
EUR/USD新規501.1191,0002016/03/3000:000.0000円0.0000円0.0000円----
EUR/USD新規501.1271,0002016/03/3002:000.0000円0.0000円0.0000円----
EUR/USD新規501.1341,0002016/03/3117:000.0000円0.0000円0.0000円----
EUR/USD決済501.1381,0002016/04/0105:002,122.4855円2,122.4855円0.0000円1017510621.119

基本的にトレンドを判定してひたすら追撃売り買いするロジックですので、トレンドが長続きしない場合は勝ったり負けたりします。勝つときより負けるときのほうが損が少ないことを目指したロジックになっています。

3月のEAの動きを言葉で説明するとこんな感じになります。

3/14~3/15の一時的な下げ時点で買い玉をため、3/15~3/16の上昇局面で大きくとりました。3/18以降に再度の上昇を見込んで再び買い玉を貯めましたが、EAが考えたよりも長い間調整期間が続いたためいったん損切をしてます。売り転換となった3/25直後に上昇局面に変化したため再び損切という形です。ただし、EAとしては直後に買い転換して、4/2までに少し取り戻しました。

3月のフォワードで、デモ口座とプロ口座で結構Tick更新回数がことなり結果に差が出てしまう症状が現れました。4/4のバージョンアップにてTick値を過去300本の最大値最小値をもとに%化して、更新回数の最大値によるばらつきを減らすような改造を行いました。

4月のフォワードにてデモ口座とプロ口座で差が少ないようでしたら、本格的に販売を開始したいと思います。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2016年4月4日月曜日

[MT4インジケータ]TEMA傾き累積インジケータによるトレンドフォロー 追加考察

追従性となめらかさの両立を図った、トリプルEMAですが、なめらかであるということは、傾き量の変化が短期周期に惑わされずトレンド方向を表す可能性を示しています。

ということで、TEMAから観測されるトレンド方向と強度をわかりやすく表現した傾き量累計インジケータを作成しました。

前回は、累計量と突っ込み判断で、バックテストによる検証を行ってみました。おさらいとして、過去記事の内容を振り返ってみたいと思います。

■TEMA傾き量累計インジケータ


TEMA傾き量累計インジケータは、その名の通り、TEMAの前回足と今回足の差を累計していったインジケータです。
傾き方向が逆転すると0リセットされます。

累計値の大きさがトレンドの強さを示します。大きく変化するか長い時間変化するかで累計量がたまっていく形です。

前回、EURUSD1Hにおいて、傾き量がリセットされたタイミング(TEMAの方向が変化した)で、過去2日間を探査して、下記条件でトレードした場合のバックテストを検証してみました。

・1時間足チャートで判断しています。
・15分毎に足の形成途中でも条件を満たせばをポジションを持ちます。
・過去2日間で、下げ方向、上げ方向の最大値が大きい方のみにポジションをとります。
・変化率分散バンドによる突っ込み判断で、すでに高値・安値(1σを超えた値)に位置する場合はポジションを取らない。
(※これは、単にすでに十分動きすぎた後にポジションを取らない事を目的としていますので、突っ込みを判定しているだけですので、移動平均かい離率やRSI等の短期的な突っ込み判定ができれば代用可能かと思います。)
・100pips利益が超えたら100pips位置にストップを移動するトレイリングと、利益が40pips超えたら損益トントン位置にストップを移動するロジックが入っています。
・0.1ロット 1ポジション両建てなしです。

■TEMA傾き量によるトレードバックテスト考察
通貨ペアEURUSD (Euro vs US Dollar)
期間15分足(M15) 2007.01.02 08:00 - 2015.12.31 00:00 (2007.01.01 - 2015.12.31)
モデルコントロールポイント(おおまかな方法。結果はあまり信頼性はない)
テストバー数223183モデルティック数7618960モデリング品質n/a
不整合チャートエラー0
初期証拠金10000.00スプレッド15
純益3644.37総利益54655.28総損失-51010.91
プロフィットファクタ1.07期待利得2.07
絶対ドローダウン771.15最大ドローダウン2998.62 (21.33%)相対ドローダウン21.33% (2998.62)
総取引数1764売りポジション(勝率%)898 (61.25%)買いポジション(勝率%)866 (66.40%)
勝率(%)1125 (63.78%)負率 (%)639 (36.22%)
最大勝トレード400.17敗トレード-103.20
平均勝トレード48.58敗トレード-79.83
最大連勝(金額)12 (688.73)連敗(金額)10 (-682.29)
最大連勝(トレード数)944.28 (8)連敗(トレード数)-682.29 (10)
平均連勝3連敗


TEMA傾き累積のみを使った機械的な取引でも+です。単一インジケータによる取引の基礎としては十分優秀なことがわかります。

さて、閾値を使ってある程度細かい振幅は無視してしまう制御を行ったのですが、これを逆手にとって、閾値でリセットされた場合とリセットされなかった場合で、追撃売り買いする戦略などはどうでしょう?
少し時間がかかるかもしれませんが、検証して記事にアップ予定です。

TEMAの傾き量インジケータの無料ダウンロードはこちらから
TEMAの傾き量でトレンドフォロー
TEMAの傾き量でトレンドフォロー


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。