2018年11月19日月曜日

[雑記]インジケータの改造等やりたい方へ

コメントでよく、XXに矢印出したいです。どうやってやればよいですか?とか書き込みがあります。
書き込みしていただいた方には、申し訳ないのですが、自分で使うつもりのないものを作成する事はありません。ちょっと技術的や新しいテクニカルツールなど気なる時には頂いただいたコメントを元に記事を作成することはありますが、単純に矢印を出してくださいといった事は対応できません。

プログラムはできないけど、MT4でこんなインジケータがほしい!という場合、まず検索してみて無いようなら、FX-ONのクラウドソーシングという開発請負サービスがあります。ぜひ検討してみてください。

その時の予算の考え方です。
作業請負なので、最低限として、その人が作業する時間x1時間当たりのお金は必要です。

業界単価ですと、最低限3200円/時間だと考えてください。
個人でアルバイト代わりにやってくれる人だと、2000円/時間ぐらいでも受けてくれそうです。

■既存インジケータの改造ご予算
既存インジケータに特定条件で矢印を出すといった既存の改造の場合は2時間ぐらいからでも対応可能です。実際にはお客様とのやり取りにもう少しかかるため3時間といったところです。
3200円/時x3時間=9600円

ぐらいが受けてもらいやすい価格となります。

■新規インジケータ作成ご予算
1からインジケータを作成、計算式から構築するとなるともう少しかかるようになります。私のブログ記事であれこれ考えてアップしているやつは難しいもので(P&Fなど)で3日ほどかけています。

そのため、1日8時間だとして、最大このくらい用意すると皆様受けてくれるかと思います。
3200円/時x24時間=76,800円
ここはインジケータの難易度によりけりですので、受けてくれる人と相談してみてください。超簡単なものであれば9600円ぐらいからでも受けてくれると思います。

■EA作成
EAとなると、開発者さんとちゃんと話あってください。
バックテストで実際にうまい事結果が出ない時などに開発者さんと一緒に対応することが多いです。バックテストをしながら最適化もしくは新しい考え方の導入等をやっていくと、結構な日数が必要になります。
結果が芳しくないGewinn9君ですら、10日間ぐらいはまじめに組んでいると思うので、単純計算でも
3200円/時x80時間=256000円
ぐらいかけています。

全自動系のEAでそれで勝てるようなEAはなかなか難しいかと思いますが、トレード補助系EAなら5万ぐらいあれば作ってもらえるかもしれません。このあたり開発者さんとよく相談する必要があります。開発者さんも不具合リスクがとたんに大きくなるため、高くなる傾向にあります。

まぁ、EAについては、「ソースコード不開示、作成したEAは依頼者は自由に利用可、開発者は別途販売して開発費用を回収可能」ぐらいの条件を出すと安くやってくれる人いるかもしれません。

余談ですが、この前、ディープラーニングを使用したEA作成で2万で応募がかかっていましたが、ィープラーニング使って儲けることができるEAシステムを自力構築できるなら、1本2万で売るわ!!って突っ込み入れてました(汗

余談2、PCまで買ってディープラーニングにさんざんチャートぶち込んで何日も回してみましたが、正直難しいですね。評価値が集約しません。ま、やっぱり基本ランダムウォークなんだろうなー。入力する通貨ペアを増やしていくと、GeForce1080の8Gではメモリ不足になるよー(泣)ってなったところで保留してしまってます。

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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年10月23日火曜日

[MT4]通貨強弱インジケータ更新

■通貨強弱インジケータ(USDJPY H1)

[MT4インジケータ]通貨の強弱をUSDを基準に表示する。その1

ずいぶん前になってしまいましたが、宿題になっていた通貨強弱を利用したEAについて考察しています。直近だけ見るとUSDJPYがかなりいい感じですよね。
TradersATRと合わせて表示しています。

まぁトレンド時はいいです。問題はレンジ相場時です。
JPYが0より上&ドルより上=円高トレンド
0より下&ドルより下=円安トレンド
それ以外レンジ

てな感じで判別できないかなーと眺めている処です。
ここ最近はリスクオン=ドル高、円高。リスクオフ=ドル安、円安という感じなので、ドル円がじり安じり高という値動きになっているからいい感じに見えているかもしれませんん。

バックテスト用のEAを組んで検証したいと思います。
その前に、通貨強弱インジケータの移動平均間比較のバージョンを修正しました。これをベースに検証します。値幅ではなくて率でみるのが大好きなので(笑)
Ku-chartは、特定の開始日時からの乖離率で見ていますが、こちらは長期の移動平均に対する値を見ています。移動平均の遅れ量は一定なので、N本前の平均値を見ている形になるはずです。


//------------------------------------------------------------------
// 通貨強弱 インジケータ(通貨間平均値基準)
#property copyright "Copyright 2018,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.10"
#property strict
#property indicator_separate_window
#property indicator_level1 100 
#property indicator_levelcolor clrWhite

#include <Arrays/ArrayString.mqh>

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

input string sep10 = "";               //【計算設定】
input int MaPeriodBase = 300;          // 比較元移動平均期間(大きな値)
input ENUM_MA_METHOD MaMode = MODE_EMA;// 比較元移動平均種別
input int MaPeriodTarget = 4;          // 比較先移動平均期間(小さい値)
input ENUM_APPLIED_PRICE MaTarget = PRICE_WEIGHTED;// 移動平均対象価格

input string sep20 = "";            //【その他】
input string CurrencyPrefix = "";   // 通貨ペア名の前に付く文字列
input string CurrencyPostfix = "";  // 通貨ペア名の後に付く文字列
input int LabelDistance = 3;        // 通貨名ラベル描画スペース

input string sep00 = "";            //【通貨】
input string Currency1 = "EUR";     // 対象通貨1
input color Color1 = clrDodgerBlue; // 対象通貨1色

input string Currency2 = "GBP";     // 対象通貨2
input color Color2 = clrMagenta;    // 対象通貨2色

input string Currency3 = "AUD";     // 対象通貨3
input color Color3 = clrGreen ;     // 対象通貨3色

input string Currency4 = "NZD";     // 対象通貨4
input color Color4 = clrSilver;     // 対象通貨4色

input string Currency5 = "USD";     // 対象通貨5
input color Color5 = clrAqua;       // 対象通貨5色

input string Currency6 = "CAD";     // 対象通貨6
input color Color6 = clrPink;       // 対象通貨6色

input string Currency7 = "CHF";     // 対象通貨7
input color Color7 = clrPaleGreen;  // 対象通貨7色

input string Currency8 = "JPY";     // 対象通貨8
input color Color8 = clrRed;        // 対象通貨8色


//バッファ
double m_buffer1[];
double m_buffer2[];
double m_buffer3[];
double m_buffer4[];
double m_buffer5[];
double m_buffer6[];
double m_buffer7[];
double m_buffer8[];

//通貨一覧
CArrayString m_currencies;

//通貨ペア一覧
CArrayString m_currencyPairs;

//USDインデックス
int m_usdIndex = -1;

//オブジェクト名
#define OBJECT_NAME "OBJ_CURR_KAIRI"

//色配列
color m_colors[8];

//------------------------------------------------------------------
// 初期化
int OnInit()
{
   ClearObjects();

   IndicatorBuffers(8);

   int count = 0 ;
   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color1);
   SetIndexBuffer(count++, m_buffer1);
   
   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color2);
   SetIndexBuffer(count++, m_buffer2);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color3);
   SetIndexBuffer(count++, m_buffer3);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color4);
   SetIndexBuffer(count++, m_buffer4);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color5);
   SetIndexBuffer(count++, m_buffer5);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color6);
   SetIndexBuffer(count++, m_buffer6);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color7);
   SetIndexBuffer(count++, m_buffer7);

   SetIndexStyle(count, DRAW_LINE, STYLE_SOLID, 1, Color8);
   SetIndexBuffer(count++, m_buffer8);
   
   m_currencies.Add(Currency1);
   m_currencies.Add(Currency2);
   m_currencies.Add(Currency3);
   m_currencies.Add(Currency4);
   m_currencies.Add(Currency5);
   m_currencies.Add(Currency6);
   m_currencies.Add(Currency7);
   m_currencies.Add(Currency8);
   
   m_colors[0] = Color1;
   m_colors[1] = Color2;
   m_colors[2] = Color3;
   m_colors[3] = Color4;
   m_colors[4] = Color5;
   m_colors[5] = Color6;
   m_colors[6] = Color7;
   m_colors[7] = Color8;

   m_usdIndex = -1;
   for( int i = 0; i < m_currencies.Total(); i++)
   {
      if(m_currencies.At(i) == "USD")
      {
         m_usdIndex = i;
         break;
      }
   }
   if( m_usdIndex < 0 )
   {
      //USDが見つからない場合、パラメータ異常
      return INIT_PARAMETERS_INCORRECT;
   }

   //USDに対する通貨ペアを生成する。   
   for( int i = 0; i < m_currencies.Total(); i++)
   {
      if( m_currencies.At(i) == "" )
      {
         m_currencyPairs.Add("");
         continue;
      }
      
      if( i < m_usdIndex )
      {
         m_currencyPairs.Add(CurrencyPrefix + m_currencies.At(i) + "USD" + CurrencyPostfix);
      }
      else if( i > m_usdIndex )
      {
         m_currencyPairs.Add(CurrencyPrefix + "USD" + m_currencies.At(i) + CurrencyPostfix);
      }
      else
      {
         m_currencyPairs.Add("USDUSD");
      }
      //線のラベルを設定する。
      SetIndexLabel(i, m_currencies.At(i));
   }
   
   ChartSetInteger(0, CHART_SHIFT, true);
   ChartSetDouble(0, CHART_SHIFT_SIZE, 12);

   return(INIT_SUCCEEDED);
}

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

//------------------------------------------------------------------
//計算イベント
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 total = m_currencyPairs.Total();

   //通貨の中心地をとるためにいったんの確保用配列を用意する。
   double currentValues[];
   ArrayResize(currentValues, total);

   for( int i = rates_total - prev_calculated - 1; i >= 0; i--)
   {
      //インデックス範囲外の場合は、飛ばす。
      if( i >= rates_total - MaPeriodBase ) continue;

      //通貨のインデックス値と平均値を求める。      
      double average = 0;
      for( int j = 0; j < total; j++)
      {
         string pair = m_currencyPairs.At(j);
         if(pair == "USDUSD" )
         {
            currentValues[j] = 100;
         }
         else
         {
            double baseValue = iMA(pair, PERIOD_CURRENT, MaPeriodBase, 0, MaMode, MaTarget, i);
            double targetValue = iMA(pair, PERIOD_CURRENT, MaPeriodTarget, 0, MODE_LWMA, MaTarget, i);

            if( j < m_usdIndex )
            {
               if( baseValue != 0 && baseValue != EMPTY_VALUE )
               {
                  currentValues[j] = targetValue / baseValue * 100;
               }
            }
            else
            {
               if( targetValue != 0 && targetValue != EMPTY_VALUE )
               {
                  currentValues[j] = baseValue / targetValue * 100;
               }
            }
         }
         average += currentValues[j];
      }
      average /= total;
      
      if( average > 0 )
      {
         //平均値をベースに再度値を計算しなおす(割合ベース)
         for( int j = 0; j < total; j++)
         {
            SetValue(j, currentValues[j] / average * 100.0, i);
         }
      }
   }
   
   DrawCurrencyLabels();
   ArrayFree(currentValues);

   return rates_total - 1;
}


//------------------------------------------------------------------
//通貨ラベルを描画する。
void DrawCurrencyLabels()
{
   //ソート行う。
   //とりあえずバブルソート
   int index[8];
   double rates[8];
   ArrayInitialize(index, 0);
   ArrayInitialize(rates, 0);

   int total = m_currencyPairs.Total();

   for( int i = 0 ; i < total; i++ )
   {
      index[i] = i;
      rates[i] = GetValue(i, 0);
   }
   
   //ソート行う。
   //とりあえずバブルソート
   for( int b = 1 ; b < total; b++ )
   {
      for( int j = 0; j < total - b; j++ )
      {
         if( rates[j] > rates[j + 1]  )
         {
            double work = rates[j + 1];
            rates[j + 1] = rates[j];
            rates[j] = work;
            
            int indexWork = index[j + 1];
            index[j + 1] = index[j];
            index[j] = indexWork;
         }
      }
   }

   //通貨ラベルを更新する。
   ClearObjects();
   int sub = WindowOnDropped();

   double max = ChartGetDouble(0, CHART_PRICE_MAX, sub);
   double min = ChartGetDouble(0, CHART_PRICE_MIN, sub);
   
   double distance = ( max - min ) / (total + 2);
   datetime writeTime = iTime(NULL, PERIOD_CURRENT, 0) + PeriodSeconds() * LabelDistance ;

   for( int j = 0; j < total; j++)
   {
      //描画対象通貨(インデックス)
      int currencyIndex = (int)index[j];
   
      //価格テキストを追加する。
      string objectName = StringFormat("%s_TXT_%d_%d", OBJECT_NAME, sub, j);

      if( ObjectCreate(0, objectName, OBJ_TEXT, WindowOnDropped(),writeTime , min + distance * (j + 1)) )
      {
         // 表示文字列
         ObjectSetString(0, objectName, OBJPROP_TEXT, m_currencies.At(currencyIndex));
         
         // アンカー
         ObjectSetInteger(0, objectName, OBJPROP_ANCHOR, ANCHOR_BOTTOM);
         
         ObjectSetInteger(0, objectName, OBJPROP_COLOR, m_colors[currencyIndex]);
      }
   }
}

//------------------------------------------------------------------
//値を設定する。
void SetValue(
   int i,            //配列番号0~7
   double value,     //値
   int shift)        //シフト
{
   switch(i)
   {
      case 0:
         m_buffer1[shift] = value;
         break;
      case 1:
         m_buffer2[shift] = value;
         break;
      case 2:
         m_buffer3[shift] = value;
         break;
      case 3:
         m_buffer4[shift] = value;
         break;
      case 4:
         m_buffer5[shift] = value;
         break;
      case 5:
         m_buffer6[shift] = value;
         break;
      case 6:
         m_buffer7[shift] = value;
         break;
      case 7:
         m_buffer8[shift] = value;
         break;
   }
}

//------------------------------------------------------------------
//値を取得する。
double GetValue(
   int i,            //配列番号0~7
   int shift)        //シフト
{
   switch(i)
   {
      case 0:
         return m_buffer1[shift];
      case 1:
         return m_buffer2[shift];
      case 2:
         return m_buffer3[shift];
      case 3:
         return m_buffer4[shift];
      case 4:
         return m_buffer5[shift];
      case 5:
         return m_buffer6[shift];
      case 6:
         return m_buffer7[shift];
      case 7:
         return m_buffer8[shift];
   }
   return EMPTY_VALUE;
}

//------------------------------------------------------------------
//オブジェクトをすべて削除する。
void ClearObjects()
{
   long chartId = ChartID();   
   int sub = WindowOnDropped();
   int total = ObjectsTotal( chartId, sub );

   //生成したオブジェクトを削除する。
   //0から削除するとインデックス位置がずれて
   //正しく削除できないため、後ろから削除するようにする。
   for( int i = total - 1; i >= 0 ; i--)
   {
      string name = ObjectName( chartId, i, sub );
      
      // 先頭文字列がRangeRectangleNameと一致する場合、削除する。
      if ( StringFind( name, OBJECT_NAME ) == 0 )
      {
         ObjectDelete( chartId, name );
      }
   }
}



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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年10月19日金曜日

[Gewinn]裁量トレード派に送るEURUSD攻略法 Gewinn9アルゴリズム解説

Gewinn9はフラクタルを使用した逆張り系EAです。
中身は単純です。今はやりのAIとかは(勉強はしていますが)横においておいて単純なアルゴリズムで実装されています。
バックテスト上では+になっています。ここに人による裁量判断を入れれば、もっと取れそうです。

ということで、自分用メモも含めてEURUSD裁量トレード派に向けてGewinn9のバックテストからわかったEURUSDの傾向と対策を公開したいと思います。

なお、お約束ですが、これはバックテストの結果からみた傾向というだけで利益を保証するものではありません。ご注意ください。

1.週足を確認する

長期のトレンド判断には週足で見るのがよさそうです。
 見方は簡単です。週足チャートを表示して、MT4標準のFractalsインジケータを表示します。Zigzagも併せて入れておけばイメージしやすいかもしれません。
 
でトレンドの確認方法ですが、Fractalsの頂点を上回るor下回るです。
 わかりやすいところだけ、青枠と赤枠で記述しています。

 バックテストで確認すると、青枠の処では売らない、赤枠のところでは買わないという制御を入れるだけで、勝率が倍以上違います。
 特に前の足の高値安値を超えている場合には絶対に逆張りしないようにしましょう。

 逆に枠で囲ってないところは、売っても買ってもそれなりです。もっと時間の短い足で判断した方がいいことがわかります。

2.4時間足前回フラクタル超えは逆張りチャンス

特に2011年以降ですが、頂点を超えた際のブレイクアウトで順張りを狙うより、ブレイクアウト後の高値を狙って逆張りの方が勝率が高いです。
 最低でもブレークイーブンに終われるチャンスがあり、時によっては大きくとれるからでしょうか?
 Gewinn9ではW1のトレンド状態ではない場合、逆張りを狙います。
 4時間足のフラクタルを超えた処から逆張りを検討し始めて、1時間足でフラクタルが出るで売り仕掛けます。
 なお、次のバージョンでは、フラクタルが出る前に、陰線やら上髭で仕掛けてしまえと思ってテストしています。2011年からの成績は良いのですが、それ以前の成績がかなり波が出るのでリリースしようか悩んでいます。

※EAでは実際にはH1の始値で判断するため、上髭つけた形になるともう少し下の位置で売ります。

■EURUSD H4 フラクタル超えの売り位置

■EURUSD H1 H4での矩形をH1で表示する

上記の用に、H1フラクタルが出てから逆張り仕掛けても、2か所はブレークイーブン、2か所はそれなりにとれる形になります。

3.1時間足を見て仕掛ける

Gewinn9では、上の条件を満たしたら状態でH1でフラクタルが出たら売り買いするというアルゴリズムです
■EURUSD H1 EAは赤◀のところで売りポジションをオープンします。
2本前に出ている上フラクタルですが、赤◀が示すバーの終値で確定しますが、それではさすがに遅すぎてチャンスを逃すということで、EAでは始値時点で2本前にフラクタルが出てればポジションオープンとしています。

上髭っぽいやつとかピンバーとかロウソク足形状での判断もありかなーと思っています。次のバージョンでいろいろ試したいなと。

4.損切Pipsを決める&両建てしない

損切を指定した場合と、指定しなかった場合では、かなり成績が違います。損切した方が成績が良いです。
思った方向と逆行した場合は素直に損切して次のチャンスに備えた方がいいです。
それもあまり大きすぎると一撃の損失がでかすぎるので、今回のようなテクニカルベースのデイトレの場合、前回高値安値+4時間足ATRかつ最大150Pipsぐらいがよさそうです。

今回のEAでは実現できてないのですが、終値ベースでここを超えたら損切!っていうラインと、損失限定のポジションに設定する損切ラインは分けた方がよさそうな結果も出ています。このあたりまだテスト不足でV120ではちょっと大きめにとってます。

両建有り無し比較しましたが、同じアルゴリズムでトレードする場合は、両建するより、今持っているシグナルと反対方向のポジションを閉じた方がテスト結果は上でした。

(※EAでは、その場合ポジションクローズで終了。新しく逆方向のポジションは立てずに次の機会を待つようにしています。)

両建てを行う場合は、戦略が両建て前提になっているトレードに限るのかと思います。(例えば株主優待目的の両建て戦略とか・・・。)

5.ブレークイーブン&トレイリングストップは有効

正直逆張りは、すぐさま戻ってきてしまう事も多々あります。その際損切Pipsまで耐えるのではなく、さっさと負けなしでポジションを閉じてしまう事も重要なようです。
もう一回行きそうなら、その時にまたポジションをオープンするといことで。

MT4の場合は、決済サポートツールなどで、自動的に行うようにしておいた方がいいかと思います。FX-ONで購入可能な有名どころだと、決済サポート君でしょうか?

本当は利益が最大のところで決済したいのですが、なかなか難しい。トレイリングで追いかけた方が利益が大きいというバックテスト結果となっています。

トレイリングは固定値よりATRを見ながら変動させた方がよさそうです。チャート見ていられる人は、無料公開中のTradersATRが手動の決済ラインにできるかと思います。

■EURUSD H1 TradersATR x2/x4でのトレイリングストップ風戦略

うん。最近EURUSDトレードしていないですが、再開前に自分用に決済補助EA作ること!(メモメモ)

・・・・。
以上です。
うん、ちょっとタイトル的に釣りすぎたかもしれません・・・。こんなんで攻略できるかー!って言われそうです。

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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年10月17日水曜日

Gewinn9 アップデート申請(予定)のお知らせ

皆様いろいろあって遅れました。Gewinn9のアップデートです。
こんなEAですがご購入いただいた方々がいらっしゃったのにしばらく放置していました。

大変申し訳ありません。

大きく負けた後、フィルタ入れまくった結果、ほとんどトレードせず横ばい状態だったかと思います・・。(そもそもほとんどの方が運用止めていそうです・・)

考えを改めることにします。

Gewinn9は週足トレンドに対してトレンドフォロー、時間足トレンドに対して逆張りを仕掛けるEAです。トレンドの判断には、直近に発生したフラクタルを二つ比較して、下がっていれば下げ、上がっていれば上げという単純なものです。

で、トレンドと逆行する政治的リスクが発生すると大負けします。突発的な事項は防げないですが、明らかにわかっているような内容は防ぐことが出来ます。その時はEAを止めてもらう前提です。

その前提で、次の変更を行いました。
・フィルタをできうる限り排除しました。
・トレイリングを固定値からATRベースに変更して相場の状況に合わせるようにしました。過剰最適化防止狙いです。
・ポジションオープン時ATRの最小値を指定して、なるべく細かな値動きでポジションをためてしまわないように変更しました。
・最大ストップロス値をATRの4倍もしくは、直近5日の高値安値のどちらか小さい方というロジックにしました。

旧バージョンと比較してトレード結果の大きな違いは下記の通りです。
・総取引回数 632→1647(2.60倍)
・純益 42809.76→91418.21(2.13倍)
・最大DD 6024.30→11870.79(1.97倍)

よりいっぱいトレードするようになり、利益が伸びて、それに合わせてDDも大きくなっています。純益の伸びに対して最大DDの伸びが低いので、許容できると判断しました。

ただいま、OANDAのリアル口座側のテスト運用中EAを差し替えました。トレード問題なければFX-ONに申請したいと思います。

■Gewinn9 V1.20設定可能パラメータ
ユーザ様が修正必要な設定は次の箇所です。
・マジックナンバー
 運用している他のEAと重複しない値を設定してください。

・発注ロット
 発注するロット数を検討してください。
 1万通貨(0.1ロット)で13年で最大のドローダウンは、2374USD(約24万円)です。
 注文タイミングをずらしてリスク分散を図る制御ですので、リスクを減らしたい場合は、ロット数を下げてください。0.01から発注可能な業者をお勧めいたします。(OANDA NYサーバー(ベーシックコース)、楽天証券など)
 例えば、1EA 0.1ロットと決められている場合は、0.02 or 0.03ロットを指定します。

・コメント
 EAが発注したポジションのコメントです。自由に設定可能です。

ポジション戦略、シグナル戦略の設定は、ご自身でバックテストでさらに最適化を進めたい方向けです。積極度については、設定可能な0.5、-0.5、-1の設定結果のバックテストを記事の最後に追加しています。

注意:本EAは、夏GMT+3、冬GMT+2のみ動作します。


バックテスト結果(旧バージョン)
■Gewinn9 V1.10 2005/1/1-2018/9/30 Lot 0.5
通貨ペアEURUSD (Euro vs US Dollar)
期間1時間足(H1) 2005.01.03 00:00 - 2018.09.28 23:00 (2005.01.01 - 2018.09.30)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
テストバー数85989モデルティック数182245041モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益42809.76総利益98968.52総損失-56158.76
プロフィットファクタ1.76期待利得67.74
絶対ドローダウン868.00最大ドローダウン6024.30 (10.50%)相対ドローダウン17.37% (2480.70)
総取引数632売りポジション(勝率%)319 (77.74%)買いポジション(勝率%)313 (66.45%)
勝率(%)456 (72.15%)負率 (%)176 (27.85%)
最大勝トレード2082.72敗トレード-650.00
平均勝トレード217.04敗トレード-319.08
最大連勝(金額)15 (941.38)連敗(金額)6 (-145.10)
最大連勝(トレード数)5386.66 (9)連敗(トレード数)-1982.84 (4)
平均連勝5連敗2



バックテスト結果(新バージョン)
■Gewinn9 V1.20 2005/1/1-2018/9/30 Lot 0.5 積極度0.5
通貨ペアEURUSD (Euro vs US Dollar)
期間1時間足(H1) 2005.01.03 00:00 - 2018.09.28 23:00 (2005.01.01 - 2018.09.30)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
テストバー数85989モデルティック数182245041モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益91418.21総利益288077.93総損失-196659.72
プロフィットファクタ1.46期待利得55.51
絶対ドローダウン2249.50最大ドローダウン11870.79 (16.83%)相対ドローダウン36.44% (4444.40)
総取引数1647売りポジション(勝率%)784 (74.23%)買いポジション(勝率%)863 (70.80%)
勝率(%)1193 (72.43%)負率 (%)454 (27.57%)
最大勝トレード2035.33敗トレード-1445.01
平均勝トレード241.47敗トレード-433.17
最大連勝(金額)32 (3276.94)連敗(金額)10 (-4965.03)
最大連勝(トレード数)7903.40 (12)連敗(トレード数)-4965.03 (10)
平均連勝6連敗2

バックテスト結果(新バージョン)
■Gewinn9 V1.20 2005/1/1-2018/9/30 Lot 0.5 積極度-0.5
通貨ペアEURUSD (Euro vs US Dollar)
期間1時間足(H1) 2005.01.03 00:00 - 2018.09.28 23:00 (2005.01.01 - 2018.09.30)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
テストバー数85989モデルティック数182245041モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益79573.60総利益226982.69総損失-147409.09
プロフィットファクタ1.54期待利得63.76
絶対ドローダウン2249.50最大ドローダウン10299.10 (17.19%)相対ドローダウン36.44% (4444.40)
総取引数1248売りポジション(勝率%)608 (75.82%)買いポジション(勝率%)640 (70.00%)
勝率(%)909 (72.84%)負率 (%)339 (27.16%)
最大勝トレード2035.33敗トレード-1445.01
平均勝トレード249.71敗トレード-434.84
最大連勝(金額)37 (17252.04)連敗(金額)10 (-4965.03)
最大連勝(トレード数)17252.04 (37)連敗(トレード数)-4965.03 (10)
平均連勝6連敗2


バックテスト結果(新バージョン)
■Gewinn9 V1.20 2005/1/1-2018/9/30 Lot 0.5 積極度-1

通貨ペアEURUSD (Euro vs US Dollar)
期間1時間足(H1) 2005.01.03 00:00 - 2018.09.28 23:00 (2005.01.01 - 2018.09.30)
モデル全ティック (利用可能な最小時間枠による最も正確な方法)
パラメーターSep00=""; MagicNumber=28980001; IsCountdong=false; SpreadFilter=5; MaxPosition=4; Comment="Gewinn9_EURUSD"; Lot=0.5; Sep01=""; MaxProfit=1000; MinStopLoss=100; ProfitBigBar=true; MaxOpenBars=240; CloseWeekEnd=true; Sep02=""; AggressivenessWeek=-1;
テストバー数85989モデルティック数182245041モデリング品質90.00%
不整合チャートエラー0
初期証拠金10000.00スプレッド20
純益59092.29総利益161897.37総損失-102805.08
プロフィットファクタ1.57期待利得67.46
絶対ドローダウン978.22最大ドローダウン6961.54 (12.64%)相対ドローダウン38.01% (5975.82)
総取引数876売りポジション(勝率%)427 (75.88%)買いポジション(勝率%)449 (70.60%)
勝率(%)641 (73.17%)負率 (%)235 (26.83%)
最大勝トレード2035.33敗トレード-1445.01
平均勝トレード252.57敗トレード-437.47
最大連勝(金額)30 (14232.24)連敗(金額)10 (-4965.03)
最大連勝(トレード数)14232.24 (30)連敗(トレード数)-4965.03 (10)
平均連勝6連敗2


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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年9月24日月曜日

ポイントアンドフィギュア修正のお知らせ

FX-ONで公開しているインジケータセットで、ポイントアンドフィギュアを定型チャートに登録した際、正しく呼び出しできない件修正したファイルを公開いたしました。

インジケータセットは寄付金ありと無しの二つがあります。
寄付金ありのほうは修正したソースコードも添付いたしました。

ダウンロードはこちらのリンクをクリック
MT4でFXを勝ち抜く研究をするブログで公開しているインジケータセット(寄付金付き)
ブログで作成したインジケータをソースコード付きで公開しています


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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年8月31日金曜日

[TradingView]Traders ATRスクリプト公開

すこし悩んでいたTradingViewでのTradersATRの描画ですが、多分うまく行ったので公開しています。

すっかり記事にするのを忘れていました。

TradersATRは、ATR*指定倍率の範囲を追従させて、ATRから想定されるエントリポイントと損切りラインを描画するインジケータです(多分)

描画しているATRは、一旦描画されると、逆方向のラインに対して価格位置が逆転しないと、リセットされない動作担っています。
(わかりにくい説明ですみません。チャートを見てもらったほうが早いです)

そのためATRを使用したパラボリック的な使い方と、損切りラインが同時に表示されていると認識しています。

ちょっとバックテストまでは確認していないのですが、なかなか優秀のように見えます。底値から戻り途中でエントリする感じになるインジケータです。

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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年8月13日月曜日

[MT4インジケータ]フラクタルトレンドライン Ver4リリースのお知らせ

フラクタルトレンドラインVer4をリリースいたします。

・ラインに達した場合、アラートor音を鳴らす機能の追加
・ラインの線種、幅を変更できる機能の追加

を行いました。



あと、設定にラベル付けとして少しまとめました。

線種ですが、MT4の仕様だとおもうのですが、線幅を2以上にすると、線種の設定にかかわらず単純線になってしまいます。点線や破線を利用したい方は線幅1を指定お願いします。

フラクタルバンドについては、こちらの記事に説明しています。
http://mt4program.blogspot.com/2017/04/mt4.html

記事内で、フラクタルについて記載していますが、フラクタルの矢印は2本経過後に表示されます。ぴったり矢印の位置でのトレードは行えませんので、検証時はご注意ください。バンドの外にでて反発し始めた後をねらうといった形です。

現在スマホ版MT4にアラートを通知する機能があるようです。こちらもちょっと試してみて、またの機会に記事にしたいと思います。

FX-ONにて1680円にて販売中
フラクタルバンド
フラクタルからレンジ、トレンドを描画する
フラクタルからレンジ、トレンドを描画する?|?fx-on.com
「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年7月12日木曜日

[MT4]TradersAtr Rateの違う2本の線を出せるようにしました。

資料を見るとRateの違う二つのラインを出すようなので、Rateの違う2本を出せるようにしました。あと、ノイズフィルタもかねてATRを足しこむ値を単純なClose値からPRICE_WEIGHTEDに変更しました。

//------------------------------------------------------------------
// Traders ATR 
#property copyright "Copyright 2018,Daisuke "
#property link      "http://mt4program.blogspot.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//buffers
#property indicator_buffers 4

#property indicator_plots   4

#property indicator_label1  "HIGH"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LOW"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAqua
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


#property indicator_label3  "HIGH2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrIndianRed
#property indicator_style3  STYLE_DOT
#property indicator_width3  1

#property indicator_label4  "LOW2"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrAqua
#property indicator_style4  STYLE_DOT
#property indicator_width4  1

input int AtrPeriod = 14; // ATR Period
input double Rate1 = 1.0;  // Rate
input double Rate2 = 2.0;  // Rate
input ENUM_APPLIED_PRICE PriceType = PRICE_WEIGHTED; // Price Type

//buffer variables
double atrH1[];
double atrL1[];
double atrH2[];
double atrL2[];

//------------------------------------------------------------------
//initialize
int OnInit()
{
   // short name setting
   string shortName = "TATR (" + IntegerToString(AtrPeriod) + ")";
   IndicatorShortName(shortName);

   int count = 0;
   SetIndexBuffer(count++, atrH1);
   SetIndexBuffer(count++, atrL1);
   SetIndexBuffer(count++, atrH2);
   SetIndexBuffer(count++, atrL2);

   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//calculate event
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; i-- )
   {
      TradersAtr(atrH1, atrL1, Rate1, rates_total, open, close, high, low, i);
      TradersAtr(atrH2, atrL2, Rate2, rates_total, open, close, high, low, i);
   }

   return(rates_total - 1);
}

void TradersAtr(
   double &bufferH[], 
   double &bufferL[], 
   double rate,
   int rates_total,
   const double &open[],   // オープン値
   const double &close[],  // クローズ値
   const double &high[],   // 高値
   const double &low[],    // 安値
   int i)
{
      double atr = iATR(NULL, PERIOD_CURRENT, AtrPeriod, i);
      double price = GetPrice(open[i], close[i], high[i], low[i], PriceType);
      double h = price + rate * atr;
      double l = price - rate * atr;
      
      if( rates_total - 2 <= i )
      {
         bufferH[i] = h;
         bufferL[i] = l;
      }
      else
      {
         if(   bufferH[i + 1] != EMPTY_VALUE &&
               bufferL[i + 1] != EMPTY_VALUE && 
               bufferH[i + 1] < bufferL[i + 1] )
         {
            bufferH[i] = close[i + 1] > bufferH[i + 1] ? EMPTY_VALUE : MathMin(h, bufferH[i + 1]);
            bufferL[i] = close[i + 1] < bufferL[i + 1] ? EMPTY_VALUE : MathMax(l, bufferL[i + 1]);
         }
         else
         {
            bufferH[i] = bufferH[i + 1] == EMPTY_VALUE ? h : MathMin(h, bufferH[i + 1]);
            bufferL[i] = bufferL[i + 1] == EMPTY_VALUE ? l : MathMax(l, bufferL[i + 1]);
         }
      }
}
   


//------------------------------------------------------------------
// 価格を計算する。
// return 対象価格
double GetPrice(
   double open,   // オープン値
   double close,  // クローズ値
   double high,   // 高値
   double low,    // 安値
   ENUM_APPLIED_PRICE maPrice    //取得価格
   )
{
   double price = 0;

   switch( maPrice )
   {
      case PRICE_CLOSE:
         price = close;
         break;
      case PRICE_OPEN:
         price = open;
         break;
      case PRICE_HIGH:
         price = high;
         break;
      case PRICE_LOW:
         price = low;
         break;
      case PRICE_MEDIAN:
         price = (high + low) / 2;
         break;
      case PRICE_TYPICAL:
         price = (high + low + close) / 3;
         break;
      case PRICE_WEIGHTED:
         price = (high + low + close + close) / 4;
         break;
   }
   return price;
}

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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年7月11日水曜日

[MT4]TradersATR

ちょっとTradingViewのPineスクリプトで作りたかったのだけど、Pineは配列の扱いが難しい・・・。ひとつ前の足の値が取れたり取れなかったりでちょっとわかりやすいMT4で組んでみました


Close+-ATRのラインを引いて抵抗線、支持線と考えるやつです。
それぞれのラインは、ラインがクロスするまでリセットされず一方方向に動きます。

ATRをつかったパラボリックみたいな感じですね。ちなみに下のラインを上のラインがうわまったら買いシグナル、逆で売りシグナルだそうです。

ちょっとだけ改造しました。
http://mt4program.blogspot.com/2018/07/mt4tradersatr-rate2.html

//------------------------------------------------------------------
// Traders ATR 
#property copyright "Copyright 2018,Daisuke "
#property link      "http://mt4program.blogspot.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//buffers
#property indicator_buffers 2

#property indicator_plots   2

#property indicator_label1  "SHORT"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrIndianRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LONG"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAqua
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input int AtrPeriod = 20; // ATR Period
input double Rate = 2.0;  // Rate

//buffer variables
double atrH[];
double atrL[];

//------------------------------------------------------------------
//initialize
int OnInit()
{
   // short name setting
   string shortName = "TATR (" + IntegerToString(AtrPeriod) + ")";
   IndicatorShortName(shortName);

   int count = 0;
   SetIndexBuffer(count++, atrH);
   SetIndexBuffer(count++, atrL);

   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//calculate event
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; i-- )
   {
      double atr = iATR(NULL, PERIOD_CURRENT, AtrPeriod, i);
      double h = close[i] + Rate * atr;
      double l = close[i] - Rate * atr;
      
      if( rates_total - 2 <= i )
      {
         atrH[i] = h;
         atrL[i] = l;
      }
      else
      {
         if(   atrH[i + 1] != EMPTY_VALUE &&
               atrL[i + 1] != EMPTY_VALUE && 
               atrH[i + 1] < atrL[i + 1] )
         {
            atrH[i] = close[i + 1] > atrH[i + 1] ? EMPTY_VALUE : MathMin(h, atrH[i + 1]);
            atrL[i] = close[i + 1] < atrL[i + 1] ? EMPTY_VALUE : MathMax(l, atrL[i + 1]);
         }
         else
         {
            atrH[i] = atrH[i + 1] == EMPTY_VALUE ? h : MathMin(h, atrH[i + 1]);
            atrL[i] = atrL[i + 1] == EMPTY_VALUE ? l : MathMax(l, atrL[i + 1]);
         }
      }
   }

   return(rates_total - 1);
}



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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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

2018年7月2日月曜日

無料ダウンロード再開しました。

MT4でFXを勝ち抜く研究をするブログで公開しているインジケータセット(寄付金付き)
ブログで作成したインジケータをソースコード付きで公開しています
ブログで作成したインジケータをソースコード付きで公開しています?|?fx-on.com

停止していたFX-ONでの無料ダウンロード再開しました。
寄付金ありなしが選べます。

ちなみに無料インジケータのアフィリエイトリンクの作成方法もやっとわかりました。
FX-ONのアフィリエイト検索で商品番号を入れると無料のやつも出てくるようです。

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

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

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