English Русский 中文 Español Deutsch Português
4 とおりのタイムフレームからの複数インディケータシグナルの同時表示

4 とおりのタイムフレームからの複数インディケータシグナルの同時表示

MetaTrader 4 | 17 2月 2016, 15:28
701 0
Pavel Chigirev
Pavel Chigirev


はじめに

マニュアルトレーディングでは、複数インディケータの値から目を離すわけにはいきません。メカニカルトレーディングではそこは少しばかり異なります。2~3個のインディケータがあると、トレーディングにはタイムフレームを1つ選ぶ必要があり、それはむつかしい仕事ではありません。しかし5~6個ものインディケータがあり、トレーディング戦略が複数のタイムフレームについてのシグナルを考慮することを要求すればどうなるのでしょうか?その上、複数の通貨ペアで同時に取引をする場合、何が起こるでしょうか?タスクは複雑化し、ほとんどの場合、ミスに、ひいては損失につながります。


Real_Time_MultiIndicator_v1 はこういったタスクを遂行するために特別に作成されています。このインディケータは同時に4つのタイムフレームについて選ばれたインディケータのシグナルを計算し、それらをメインチャートのサブウィンドウ内のテーブルに変換します。インディケータのシグナルのあとの括弧内にシグナルを表示する、選択されたタイムフレームに属する最終バーの数が見れます。

インディケータのパラメータを変更し、ご自身のインディケータを追加することが可能です。判断を下すには、4つのタイムフレームからのシグナルが集められるテーブルを見るだけです。



Real_Time_MultiIndicator_v1

このインディケータはチャートの個別のサブウィンドウにあるデータを表示します。以下はインディケータの外観です。


INDICATOR 列では、使われているインディケータ名が確認できます。カッコ内にパラメータがあります。M15、M30、H1、H4 列には、対応するタイムフレームのインディケータシグナルが表示されています。シグナルを示すバー数もまた表示されています。履歴データがロードされていたり、欠けていると、対応するタイムフレームに対してデータ待ちメッセージが表示されます。ターミナルがインターネットに接続していれば、必要なデータは数秒でロードされます。

平均価格、(高値 + 安値)÷2 が全インディケータに使用されることに留意ください。これはデフォルト値とは異なります。インディケータをチャートにアタッチするか、メインチャートのズームを変更する場合、データを持つテーブルは拡大縮小可能です。混乱しないでください。テーブルは新規ティックが来たあと、通常の表示となります。ターミナルがインターネットに接続されていなければ、チャートをズームしたあと、以下を行います。:たとえば H1 からH4 とタイムフレームを変更します。そうするとテーブルは通常表示となります。

インディケータを使用するには、 Real_Time_MultiIndicator_v1.mq4 ファイルを terminal\experts\indicators と共に \ フォルダにダウンロードしターミナルを再起動します。インディケータをアタッチするには、『ナビゲータ』で『ユーザーインディケータ』を選択し、Real_Time_MultiIndicator_v1 に進みます。そしてメニュー


で、テーブルの色(TColor)テキストの色(TxtColor)、使われているインディケータのパラメータも選択します。インディケータのパラメータを変更したい場合は、以下を行います。:メインチャートで右クリックし、『インディケータリスト』コマンドを選ぶか、Ctrl+I ボタンを使います。




それから Real_Time_MultiIndicator_v1 を選択し『プロパティ』ボタンをクリックします。インディケータのパラメータ変更はあまりむつかしいことではありません。一方、新しいインディケータの追加にはいくらか労力と初心者レベルのf MQL4 の知識が必要です。



テーブルで新しいインディケータを追加する

みなさんがお使いのインディケータやご自身で書かれたインディケータを追加できるように、インディケータテーブルの最後の3行を書いていません。計算アルゴリズムとテーブルへのデータ変換をなるべく簡単なものとなるよう作成しようとしました。また、アルゴリズムの機能を詳しく調べなくても初心者レベルの MQL4 の知識がある人なら誰でもインディケータをテーブルに追加できるように、ソースプログラムではコメント付コードの部分を残しました。

コモディティチャンネル指数の例を使い、テーブルに新しいインディケータを追加するためのアルゴリズムを示します。私はこのインディケータのシグナルを次のように解釈したことに留意ください。:インディケータ値0-買いシグナル、そしてその逆。この解釈は従来のものとやや異なりますが、アルゴリズムの説明が簡単になるようあえてそうしました。あとでみなさんのご都合のよいようにシグナルの解釈をすることは可能です。

『ナビゲータ』で『ユーザーインディケータ』セクションを選択し、Real_Time_MultiIndicator_v1 に行き、『変更』ボタンをクリックします。




そうしてソースコードを変更します。

//----The parameters of the indicators
extern string p1 = "SAR parameters";
extern double SAR_Step = 0.01;
extern double SAR_Max = 0.1;
extern string p2 = "MACD parameters";
extern int Fast_EMA = 12;
extern int Slow_EMA = 26;
extern int MACD_SMA = 9;
extern string p3 = "Moving Average parameters";
extern int Fast_MA = 5;
extern int Slow_MA = 10;
extern string p4 = "ADX parameters";
extern int ADX_Period = 14;
//extern string p5 = "The parameters of the indicator 1";
//extern string p6 = "The parameters of the indicator 2";
//extern string p7 = "The parameters of the indicator 3";


この部分では、"The parameters of the indicator 1" テキストのある行でコメントを削除し、CCI 名を追加します。結果、以下を取得します。

extern string p5 = "CCI parameters";

そしてCCI インディケータのパラメータ-期間、を追加します。

extern string p5 = "CCI parameters";
extern int Period_CCI = 14;


以下の行

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","","",""};


にテーブルで表示するインディケータ名を追加します。

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","CCI","",""};


そしてインディケータの初期化ブロック

int init()
    {
     string sn = "Real_Time_MultiIndicator_v1";
     IndicatorShortName(sn);
     SetIndexLabel(0, sn);
     name[0] = name[0] + "(" + DoubleToStr(SAR_Step, 2) + ", " +
               DoubleToStr(SAR_Max, 2) + ")";
     name[1] = name[1] + "(" + DoubleToStr(Fast_EMA, 0) + ", " +
               DoubleToStr(Slow_EMA, 0) + ", " + 
               DoubleToStr(MACD_SMA, 0) + ")";
     name[2] = name[2] + "(" + DoubleToStr(Fast_MA, 0) + ", " +
               DoubleToStr(Slow_MA, 0) + ")";
     name[3] = name[3] + "(" + DoubleToStr(ADX_Period, 0) + ")";
     //name[4] = name[4] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 1, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";
     //name[5] = name[5] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 2, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 2, 0) + ")";
     //name[6] = name[6] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 3, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 3, 0) + ")";
     return(0);
    }


の以下の行でコメントを削除します。

//name[4] = name[4] + "(" + 

//          DoubleToStr(1st paramater of the indicator 1, 0) +

//          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";

そして次の変更を行います。

name[4] = name[4] + "(" + DoubleToStr(Period_CCI, 0) + ")";

それからこのブロックからコメントを削除します。

/*

//+------------------------------------------------------------------+

//| Function 1                                                                       |
//+------------------------------------------------------------------+

string Function(int p)

 {
  int ii  = 1;
  if (C=Condition for the indicator - true - sell, false - buy)
    {
      while (Conditionc for sell)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while (Condition for buy)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }*/

『関数』という語の代わりに、関数名を書きます。たとえば CCI です。

string CCI(int p)

ここで行 "Condition for the indicator - true - sell, false – buy" の代わりに現行バー(ゼロ)に対して買いシグナルの条件を書きます。

iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0

それから行 "Condition for sell" の代わりに、買いシグナルとこのシグナルを表示する処理済みバー数を計算するための条件を書きます。

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)

ii — は現行バーを参考にした移動です。同じように行 "while" (買いの条件)を以下に変更します。

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)

結果は以下です。

string CCI(int p)
  {
    int ii = 1;
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0)
     {
       while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)       
ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }


シグナルをレベル 100 からと -100 から数えたい場合で、(-100;100)範囲を買いまたは売りのシグナルとして解釈したくない場合は、 0 を売りに対しては -100 に、買いに対しては 100 に変更し、テーブルの不明確な事柄を表示する次の行を追加する必要があります。

if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) &&   
iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100))
    return("N/A");

それで取得したのが以下です。

string CCI(int p)
   {  
int ii = 1;
    if((iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
       (iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100) )
        return("N/A");
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < -100)
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < -100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Sell(" + DoubleToStr(ii, 0) + ")");
      }
    else
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Buy(" + DoubleToStr(ii, 0) + ")");
      }
   }

ここで計算結果をテーブルに変換する必要があります。以下を行います。:プログラムテキストで次のコードの一部を探し出します。

/*//----------Пятая строка   
  for (i = 1; i <= 4; i++)
     {
       ObjectDelete("6" + DoubleToStr(i, 0));
       ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT, 
                           WindowFind("Real_Time_MultiIndicator_v1"), textT[i+1], textC[6]);
       ObjectSetText("6" + DoubleToStr(i, 0), Функция(per[i-1]), 13, "Tahoma", TxtColor);
    }*/

そこからコメントを削除します。テキスト表示の座標は個別に計算されるため、サイクルを使ってテーブルに書き込めるようにします。結果を計算する関数を設定する必要があります。それから語 "Function" の代わりに関数名を書きます。. それで取得したのが以下です。

//----------Fifth line   
 for (i=1;i<=4;i++)
   {
     ObjectDelete("6" + DoubleToStr(i, 0));
     ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT,
                  WindowFind("Real_Time_MultiIndicator_v1"),
                  textT[i+1], textC[5]);
     ObjectSetText("6" + DoubleToStr(i, 0), CCI(per[i-1]), 13, 
                   "Tahoma", TxtColor);
   }


『コンパイル』ボタンをクリックします。ターミナルへ行き、チャートにインディケータをアタッチします。結果取得するのは以下です。


インディケータ値が数えられるタイムフレームを変更したければ、以下を行います。
行に次のように

int per[] = {15,30,60,240};

選択したタイムフレームに対する分数を入れます。たとえば次のようにします。

int per[] = {5,30,60,240};


そして以下の行に、

string nameS[] = {"INDICATOR","M15","M30","H1","H4"}

その名前を入れます。


string nameS[] = {"INDICATOR","M5","M30","H1","H4"};

そしてコンパイルします。最終的に以下を取得しました。



履歴上でパラメータをデバッグする

説明したインディケータはオンラインモードのみで使用可能です。その理由は、ビジュアルモードで検証している間、インディケータは現行タイムフレームでのみ適切な値を表示するからです。それがターミナルとテスターの特性です。インディケータのパラメータをデバッグしたい、履歴上でのビジュアル化検証の際自分の戦略を検証したい、などの場合は Real_Time_MultiExpert_v1 を使うとよいでしょう。関数は Real_Time_MultiIndicator_v1 により処理を行い、Real_Time_MultiExpert_v1 は完全に同じです。両者のソースコードは同じで、エキスパートのコード変更はインディケータコードの変更と同じアルゴリズムです。エキスパートを使うには、Real_Time_MultiExpert_v1.mq4 ファイルを\terminal folder\experts\indicators にダウンロードし、ターミナルを再起動する必要があります。

Real_Time_MultiExpert_v1 を使用するには、チャートにアタッチされたインディケータ“Real_Time_MultiIndicator_v2”を持つ“Real_Time_MultiExpert_v1”名のテンプレートを作成する必要があります。“Real_Time_MultiIndicator_v2”インディケータのタスクはメインチャートの下にズームをするサブウィンドウを作成することです。それからテスターの『アドバイザー』フィールドで Real_Time_MultiExpert_v1 を、『モデル』フィールドで『全ティック』オプションを選択します。そうでなければ、現行バー(ゼロ)にあるアドバイザーのインディケータは実際のものとは異なりますが、全体的にはインディケータは正しいものとなっています。


自動シフトボタンをクリックすることを忘れないでください。

その次に『ビジュアル化』オプションを選択し、『開始』ボタンをクリックします。


Real_Time_MultiIndicator_v2 ウィンドウに、インディケータシグナルを持つテーブルが表示されます。検証にはどのタイムフレームも選択可能です。インディケータ値はそれに依存しないためです。述べられているエキスパートとインディケータの間に大きな差はありませんから、お好きなものを選択できます。私の意見では、インディケータをオンラインモードで使うのが便利だと思います。


おわりに

本稿では、市場条件の重要な情報-4つのタイムフレームからの複数インディケータシグナル、を収集し整理する方法のひとつをお話ししました。この方法は幅広いタスク遂行に利用可能です。説明したプログラムを利用して、履歴クオートで検証する際使用するインディケータに対して必要なパラメータを選択することが可能です。インディケータはマニュアルトレーディングで使用することを目的としています。


MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1461

MQL 4 で信頼性ある安全な売買ロボットを作成する方法 MQL 4 で信頼性ある安全な売買ロボットを作成する方法
本稿では、Expert Advisor を作成し使用する場面で生じるごく一般的なエラーについてお話します。典型的な安全な自動売買システムについてもご説明します。
Expert Advisorのオーダーメード - トレーダー向けマニュアル Expert Advisorのオーダーメード - トレーダー向けマニュアル
トレーダーが全員プログラマーというわけではありません。そしてプログラマーが全員優秀というわけではありません。自分のシステムを自動化する必要がある場合、何をすべきでしょうか?MQL4 を学ぶのに時間も欲求もなしで?
インディケータコードの Expert Advisor コードへの変換おわりに インディケータコードの Expert Advisor コードへの変換おわりに
本稿はインディケータコードを Expert Advisor コードへ変換することに関して述べられる最終稿です。ここで著者はある例においてExpert Advisor のコードを変換します。よって、この EA はカスタムインディケータを呼びださず単一ファイルに示されます。
インディケータコードから Expert Advisor コードへの変換Expert Advisor およびインディケータ関数の一般的スキーム インディケータコードから Expert Advisor コードへの変換Expert Advisor およびインディケータ関数の一般的スキーム
本稿はインディケータコードを Expert Advisor コードへ変換し、カスタムインディケータの呼び出しなく、Expert Advisor 内で必要なインディケータ値を計算するためのプログラムコード全体を使って Expert Advisor を書く方法に特化して述べます。本稿は Expert Advisor 変更とカスタムインディケータを基にしたインディケータ関数構築の考えを提供します。対象とする読者はすでに MQL4 言語でのプログラム経験をお持ちの方です。