三维图形 - 市场分析的专业工具

Antoniuk Oleg | 25 二月, 2016

简介

所有的交易者都面临不断变化的价格和报价。所有人都在寻找一致性和规律性。我们分析交易量、不同指标的值和很多其他参数。关于 MQL4 在市场分析中的优点,我想已不必赘言。只需写一个脚本,然后根据结果得出结论。通常,分析都基于反映两个变量的某些一致性的图表或图形。这当然没什么问题,但有时候我们需要找到三个变量的一致性并将其可视化。为此,全世界范围内都在使用三维图形及其分析。这种方法节省了时间和金钱。

本文中,我们将编写一个简单的库,用于构建 3D 图形及其在 Microsoft Excel 中的进一步浏览。我们将使用标准的 MQL4 选项准备和导出数据至 *.csv 文件


什么是 *.csv 文件格式?

它是一个文本文件,存储了由预设的分隔符隔开的数值系列,这里采用的分隔符是分号 - “;”。为了绘制表格,我们只需要编写几个代码字符串。这种格式的好处是其表格形式容易被 Microsoft Excel 识别和理解。在本程序中我们能够根据获得数据创建三维图形并进行分析。


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[][]);

这个简单的库包含两个函数。我们来查看每个函数的含义。第一个函数 PrepareString 用于将字符串中的点替换为逗号。原因在于,在使用标准函数 FileWrite 把数据写入文件时,整数和分数部分由点隔开。这是令我们无法接受的,因为 Microsoft Excel 只有在两部分由逗号隔开时才识别小数位。这就是为什么在 *.csv 文件中放入数据时在 GenerateCsv 函数体中调用这个函数。该函数唯一的参数是一个字符串,我们需要用逗号替换点。返回数值 - 没有点的新字符串。请注意 - 你不需要调用该函数,在需要的时候由第二个函数自动调用。

GenerateCsv 函数用于将数据以 *.csv 格式写入文件。以下是其参数:

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

为了理解每个参数的用途,请看下图:


你需要写入的数据是每个变量的三个数值数组。现在来看它如何工作。


使用 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);
  }

这是一个标准模板,所有三维图形都应该从这里开始。现在来逐行查看:

#include <generateCsv.mqh>

启动 generateCsv 库。

#define ARRAY_SIZE_X 16
#define ARRAY_SIZE_Y 16

这里定义了表格的尺寸:ARRAY_SIZE_X - width of the table, ARRAY_SIZE_Y - height.

int x,y;

这是两个数组索引。因为要多次用到它们,我将其放在循环体外面。

double arrayIndexX[ARRAY_SIZE_X];

这是第一个变量的数值数组。假定你分析两个指标对利润的影响。这时,第一个指标的值将位于该数组内。请注意:你应该从某起始值开始,例如零,然后以一定的步长开始增加,例如 0。5.

double arrayIndexY[ARRAY_SIZE_Y];

第二个指标的数值放置在该数组。同样,选择适当的起始值和步长。

double arrayZ[ARRAY_SIZE_X,ARRAY_SIZE_Y];
根据指标值,这个数组应含有利润值。再次查看上图以理解这些值。

注意:数组类型为 double。这使它们具有通用性。如果使用整数(int)作为数组元素,也是可以的,因为 MQL4 有隐含的类型转换。
for(x = 0; xARRAY_SIZE_X; x++)
  {
    // arrayIndexX[x]= ... ;
  }
在该程序块内,我们在第一个变量数组内填入数值。需要记住,数值要以一定的步长增加。
 for(y = 0; y < ARRAY_SIZE_Y; y++)
   {
      // arrayIndexY[y]= ... ;
   }
第二个变量也是如此。
 for(x = 0; x < ARRAY_SIZE_X; x++)
   {
     for(y = 0; y < ARRAY_SIZE_Y; y++)
       {
         // arrayZ[x,y]= ... ;
       }
   }
这是该模板最为有趣的地方:我们在这个二维数组内填入取决于其他两个变量的数值。
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)并选择“插入 -> 图表”(ALT+I,H):


然后选择“图表类型 -> 曲面图,图表子类型 -> 三维表面”并单击“完成”:


之后将显示三维图形。


总结


现在你拥有了将数据从交易终端 MetaTrader 快速导出至 Microsoft Excel 程序的便捷工具,以便快速构建三维图形及其进一步分析。你现在可以同时在三个变量之间分析其外汇一致性和规律性。尝试分析利润对 TakeProfit 和 StopLoss 等参数依赖性的三维柱形图,或者观察交易量对当前工作日和小时的依赖性图表外形如何。我想你会发现很多有趣和有用的一致性。