三维图形 - 市场分析的专业工具
简介
所有的交易者都面临不断变化的价格和报价。所有人都在寻找一致性和规律性。我们分析交易量、不同指标的值和很多其他参数。关于 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[][]);
- string fileName - 编写的文件名称,不要忘记指明 *.csv 格式;
- 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 等参数依赖性的三维柱形图,或者观察交易量对当前工作日和小时的依赖性图表外形如何。我想你会发现很多有趣和有用的一致性。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/1443