
三维图形 - 市场分析的专业工具
简介
所有的交易者都面临不断变化的价格和报价。所有人都在寻找一致性和规律性。我们分析交易量、不同指标的值和很多其他参数。关于 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
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.

