English Русский 中文 Español Deutsch Português
3Dグラフ-市場分析のプロのツール

3Dグラフ-市場分析のプロのツール

MetaTrader 4 | 17 2月 2016, 11:51
563 0
Antoniuk Oleg
Antoniuk Oleg

はじめに

トレーダーはすべて絶えず変動する価格を処理します。だれもが対応と規則を探しています。われわれはボリューム、異なるインディケータ値、その他数多くのパラメータを分析します。マーケット分析に関してはf MQL4 のメリットを追求する必要はないと思います。ただスクリプトを書き、結果を基に結論を導くだけです。通常、分析は2つの変数の特定の対応を反映するチャートやグラフをもとに実施されます。どれも結構ですが、時として3つの変数の対応を見つけそれを可視化する必要があります。このために世界で利用されているのが 3D グラフとその分析です。そのような方法は時間と費用の節約になります。

本稿では、3D グラフ作成用の簡単なライブラリとそのグラフを Microsoft Excel でののちの閲覧を書きます。準備に MQL4 オプションを使い、*.csv ファイルにデータをエクスポートします。


*.csv のフォーマットはどのようなものでしょうか?

それはテキストファイルで、プリセットセパレータで分離された連続値を格納します。われわれの場合、それはセミコロン―";" です。テーブルを描くために必要なのは、いくつかのコード文字列だけです。このフォーマットのメリットは解りやすく、Microsoft Excel によってテーブルの形式に読み替えてくれることです。このプログラムでは簡単に、取得したデータに基づく 3D グラフが作成でき、それを分析することができます。


ライブラリLibrary generateCsv

データを速く簡単に入力するためにライブラリを一つ作成します。新しいライブラリを作成し、以下のコードを入れます。それを generateCsv.mq4 という名前でフォルダ "...MetaTrader\experts\libraries" に保存します。その後ライブラリをコンパイルします。

//+------------------------------------------------------------------+
//|                                                  generateCsv.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
#property library
 
//+------------------------------------------------------------------+
//| PrepareString                                                    |
//+------------------------------------------------------------------+
 
string PrepareString(string s)
  {
   bool exit = false;
   int index = 0;
   string str = s;
   
   while(!exit)
     {
       index = StringFind(str, ".", index);
      
       if(index > -1)
           str = StringSetChar(str, index, ',');
       else
           exit = true;
     }
   return(str);
  }
 
 
//+------------------------------------------------------------------+
//| GenerateCsv                                                      |
//+------------------------------------------------------------------+
int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
                double arrayIndexX[], double arrayIndexY[], double arrayZ[][])
  {
   int handle = FileOpen(fileName, FILE_CSV|FILE_WRITE, ' '), x, y;
   string str;
   
   if(handle1)
     {
       Print("Error:", GetLastError());
       return(handle);
     }
   else
     {
       str = ";";
       for(x = 0; x < arraySizeX; x++)
         {
           str = str + arrayIndexX[x];
           str = str + ";";         
         }
       FileWrite(handle,PrepareString(str));
      
       for(y = 0; y < arraySizeY; y++)
         {
           str = "";   
           str = str + arrayIndexY[y] + ";";
         
           for(x = 0; x < arraySizeX; x++)
             {
               str = str + arrayZ[x,y];
               str = str + ";";         
             }
           FileWrite(handle, PrepareString(str));
         }
     }
      
   FileClose(handle);   
   return(handle);
  }

ここでライブラリ関数にアクセスするための新しいヘッダファイルを作成し、generateCsv. mqh と名前をつけ、以下のコードを挿入して、フォルダ "...MetaTrader\experts\include" に保存します。

//+------------------------------------------------------------------+
//|                                                  generateCsv.mqh |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link "banderassa@ukr.net"
 
#import "generateCsv.ex4"
 
string PrepareString(string s);
int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
double arrayIndexX[], double arrayIndexY[],double arrayZ[][]);

このシンプルなライブラリには関数が2つあります。関数それぞれの意味を確認します。最初の関数は文字列中の点をコンマに置き換えます。実際、標準関数 FileWrite を使ってファイルにデータを書き込むとき、整数と小数点以下の部分は点で区切られています。これはわれわれには不適切なのです。というのも、Microsoft Excel はコンマで区切られている場合のみ少数点以下を認識するからです。 file *.csv ファイルにデータを入れるとき、関数 GenerateCsv の本文でこの関数を呼ぶのはそのためです。関数の唯一のパラメータは文字列で、そこで点をコンマに置き換えるのです。値を返します。-点のない文字列です。この関数を呼び出す必要がないことにご注意ください。それは必要なとき、2番目の関数で自動的に行われます。

関数 GenerateCsv は *.csv 形式でファイルにデータを書き込むのに使われます。以下がパラメータです。

int GenerateCsv(string fileName, int arraySizeX, int arraySizeY,
                double arrayIndexX[], double arrayIndexY[], double arrayZ[][]);

  • string fileName -書き込むためのファイル名、フォーマット*.csv を示すのを忘れないようにします。
  • int arraySizeX -データを持つ配列の幅
  • int arraySizeY -データを持つ配列の高さ
  • double arrayIndexX[] -1番目の変数値の配列
  • double arrayIndexY[] -2番目の変数値の配列
  • double arrayZ[][] -3番目の変数値の二次元配列

各パラメータの目的を理解するために画像を見ます。



このデータを書くのに必要なのはそれぞれの変数に対する3つの値配列だけです。それではそれがどのように動作するか見ます。


ライブラリ generateCsv の利用

3dGraphicOut という名前をつけて新しいスクリプトを作成し、そこに以下のコードを入れます。

//+------------------------------------------------------------------+
//|                                                 3dGraphicOut.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
 
#include <generateCsv.mqh>
 
#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16
 
//+------------------------------------------------------------------+
//| start                                                            |
//+------------------------------------------------------------------+
int start()
  {
  
   int x,y;
   
   double arrayIndexX[ARRAY_SIZE_X];
   double arrayIndexY[ARRAY_SIZE_Y];
   double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
   
   
   for(x=0;x<ARRAY_SIZE_X;x++)
      arrayIndexX[x]=x/10.0; 
      
   for(y=0;y<ARRAY_SIZE_Y;y++)
      arrayIndexY[y]=y/10.0;
   
   for(x=0;x<ARRAY_SIZE_X;x++)
      for(y=0;y<ARRAY_SIZE_Y;y++)
         arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]);
 
   GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ); 
   return(0);
  }

これは標準的なテンプレートで、そこから 3D グラフがすべてスタートします。行をそれぞれ個別に検討します。

#include <generateCsv.mqh>

ライブラリ generateCsv をスタートします。

#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16

ここでテーブルのディメンションを定義します。:: ARRAY_SIZE_X-幅、ARRAY_SIZE_Y-高さ。

int x,y;

これらは2つの配列インデックスです。数多く使用されるので、私はサイクル本体の外に置きました。

double arrayIndexX[ARRAY_SIZE_X];

これは1番目の変数値です。2つのインディケータの収益に対する影響を分析するとします。この場合、1番目のインディケータ値はこの配列に入れられます。なんらかのスタート値で開始する必要があることに注意ください。たとえば、ゼロから、そして一定のステップで増加する、たとえば 0 です。5.

double arrayIndexY[ARRAY_SIZE_Y];

2番目のインディケータ値はこの配列内に入れられます。また、適切なスタート値とステップを選択します。

double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];

そしてこれにはインディケータ値によって決まる収益値が入ります。ふたたび上の絵を見て値についてご理解ください。

配列タイプはダブルであることに留意します。これでそれらがユニバーサルになります。配列エレメントとして整数(int)を使うなら、それでも結構です。 MQL4 には 暗黙のタイプ変換機能が備わっているからです。

for(x = 0; xARRAY_SIZE_X; x++)
  {
    // arrayIndexX[x]= ... ;
  }

このブロックでは1番目の変数配列に値を書き込みます。それらは一定のステップで増やす必要があることを忘れないようにします。

 for(y = 0; y < ARRAY_SIZE_Y; y++)
   {
      // arrayIndexY[y]= ... ;
   }

2番目の変数に関しても同様です。

 for(x = 0; x < ARRAY_SIZE_X; x++)
   {
     for(y = 0; y < ARRAY_SIZE_Y; y++)
       {
         // arrayZ[x,y]= ... ;
       }
   }

そしてここはテンプレートで最も興味を惹かれる部分です。:二次元配列に他の2つの変数に応じた値を書き込みます。

GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ);

最後に、さらなる分析のためにデータを Microsoft Excel のファイルに書きます。ここでこのテンプレートをのちに使用するため保存します。


シンプルな例

ライブラリ使用のひじょうにシンプルな例を検討します。コードを最大限シンプルで使用可能なものとするため、私は意図的にトレーディングに関連した例を書きませんでした。

//+------------------------------------------------------------------+
//|                                                 3dGraphicOut.mq4 |
//|         Copyright © 2006, Antonio Banderass. All rights reserved |
//|                                               banderassa@ukr.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Antonio Banderass. All rights reserved"
#property link      "banderassa@ukr.net"
 
#include <generateCsv.mqh>
 
#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16
 
//+------------------------------------------------------------------+
//| start                                                            |
//+------------------------------------------------------------------+
int start()
  {
   int x,y;
 
   double arrayIndexX[ARRAY_SIZE_X];
   double arrayIndexY[ARRAY_SIZE_Y];
   double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
 
 
   for(x=0;x<ARRAY_SIZE_X;x++)
      arrayIndexX[x]=x/10.0;
 
   for(y=0;y<ARRAY_SIZE_Y;y++)
      arrayIndexY[y]=y/10.0;
 
   for(x=0;x<ARRAY_SIZE_X;x++)
      for(y=0;y<ARRAY_SIZE_Y;y++)
         arrayZ[x,y]=MathSin(arrayIndexX[x]+arrayIndexY[y]);
 
   GenerateCsv("test.csv",ARRAY_SIZE_X,ARRAY_SIZE_Y,arrayIndexX,arrayIndexY,arrayZ);
 
   return(0);
  }

テクストスクリプトを保存し、コンパイルしたら、ターミナルで起動します。ここでフォルダ "...MetaTraider\experts\files\" を開くと、新しいファイル "test.csv" がそこにできています。Microsoft Excel を使ってそれを開きます。ファイルは以下に示すように、二次元テーブルに変換されます。

ここではすべてのセル(CTRL+A)を選択し、 Insert -> Chart (ALT+I,H)を入力します。

それから Chart Type→Surface, C、hart sub-type →3D-Surface を選択し、終了をクリックします。

その後 3D グラフが表示されます。



おわりに

これで MetaTrader トレーディングターミナルからプログラム Microsoft Excel への迅速なデータエクスポートを行い、3D グラフをすばやく作成し、それを分析するための便利なツールが利用できるようになりました。3つの変数間で Forex の対応と規則を分析することができるのです。 テイクプロフィットやストップロスといったパラメータについて収益依存の 3D ヒストグラムを分析してみます。そうすると現在の平日や時間に関するボリューム依存のチャートがどう見えるかわかります。みなさんが数多くの興味深く有用な対応を見つけられることを願っています。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/1443

添付されたファイル |
3dGraphicOut.mq4 (1.43 KB)
generateCsv.mq4 (2.24 KB)
generateCsv.mqh (0.77 KB)
MetaTrader4クライアントターミナルを扱う際の初心者が起こすミス MetaTrader4クライアントターミナルを扱う際の初心者が起こすミス
ミスは人間につきものです。みな失敗を犯します:多かれ少なかれ、無知や、うっかりしていいたせいでミスを犯します。訪ねていただいた以下の質問にお答えします:ターミナルタイム・テスト結果・ジャーナルへの表示・テスター用履歴・履歴インポート・レバレッジ・トラフィック・ヒント・スケーリング・計算ミス・不当なアカウント・エンプティニュース・価格の変化・不十分な資金・マーケット閉鎖などです。
テスターにおける再クオートのモデル化と Expert Advisor 安定性解析 テスターにおける再クオートのモデル化と Expert Advisor 安定性解析
再クオートは多くの Expert Advisors にとって災難です。とりわけトレードへのエンター/エグジット条件の感度が高い場合は。本稿では再クオートについての EA 安定性を確認する方法を提供します。
再来:テクニカル分析の問題点 再来:テクニカル分析の問題点
現時点で、ファイダメンタル分析と共にテクニカル分析は株式市場を分析するうえでもっとも重要な手法のひとつです。株式市場の価格変動を予測する手法のひとつとして、テクニカル分析には、実践的適用にいくらかの疑問を投げかけるデメリットが数多くあります。
履歴によるフィルター 履歴によるフィルター
本稿はトレード開始フィルターの不可欠な部分としての仮想トレーディングの利用について説明します。