
在您的 MQL 项目中使用 JSON 数据 API
引言和背景
混合外部数据可以改善算法交易中的决策。API 实现了不同系统之间的数据传输,并帮助交易员访问不同的数据源,如来自其他经纪商和银行的实时市场数据、访问经济指标而不仅仅是经济日历、访问新闻源或社会情绪分析、在线人工智能工具、在线预测系统或 API 服务中您能想到的任何东西。 在本文中,我们将向您展示如何以最佳方式使用此工具。
在 EA 交易系统中使用 API 数据可以让您对交易市场有更多新的了解,从而帮助您做出明智的决策、创建更动态的交易策略并更好地管理风险。利用 API 数据,交易者可以使用先进的技术指标和复杂的图表工具提高交易信号的准确性。这种集成扩展了 MetaTrader 等平台的功能,并提供了对有价值的市场情报的访问,如用于市场情绪分析的自然语言处理 (NLP),以及基本面数据和新闻的访问。
Ziwox API 简介
Ziwox 是一个外汇数据分析系统,包含免费的 API 服务。此 API 为交易者提供全面的市场数据,包括价格、技术指标、情绪分析和基本面数据。它支持主要和次要外汇货币对,并提供重要指标,如基本货币偏差、基于人工智能的预测、散户统计数据、COT 报告、技术支持和阻力、市场情绪(风险开启和风险关闭)、债券收益率和 VIX 指数。这个丰富的数据集能够进行多方面的市场分析,结合技术、基本面和情绪洞察力,创造出改变游戏规则的工具。
这些数据的有趣之处在于,除了价格和技术数据外,我们还能获得人工智能或真实分析师生成的数据。其中一些数据包括:分析师团队对外汇对进行基本面分析,NLP(自然语言处理)系统输出外汇新闻情绪,人工智能生成价格预测。
API 易于使用,只需简单注册即可生成 API 密钥并访问 JSON 或文本格式的数据。这种可访问性及其广泛的数据覆盖范围使其成为加强交易策略和开发自定义指标或自动化交易系统的宝贵工具。
让我们再熟悉一下:什么是 API?
API 是一种机制,可使两个软件组件通过一套定义和协议相互通信。例如,气象局的软件系统包含每日天气数据。您手机上的天气应用程序通过 API 与该系统 "对话",并在您的手机上显示每日天气更新。
API 是应用程序编程接口(Application Programming Interface)的缩写。接口可视为两个应用程序之间的服务合同。该合同定义了两者如何使用请求和响应相互通信。他们的 API 文档包含有关开发人员如何构建这些请求和响应的信息。
API 架构通常用客户端和服务器来描述。发送请求的程序称为客户端,发送响应的程序称为服务器。因此,在天气示例中,office 的天气数据库是服务器,移动应用程序是客户端。
API 响应格式:
API 的响应或数据交换有多种格式。根据 API 的用途、与应用程序连接的其他应用,格式也会发生变化。这些响应可以是 JSON、HTML、TEXT、XML 或 CSV 标准格式。
简要介绍这一标准模型:
1.JSON: JSON 是一种轻量级、人类可读的数据交换格式,因其简单灵活而被用于 API 响应。它将数据表示为键值对,使其易于在各种编程语言中解析和操作。
JSON 响应示例:
"id":5687,
"source": "oanda",
"symbol":"EURUSD",
"price":"1.08562",
"high":"1.09211",
"low":"1.08154"
}
2.XML:XML 或 "可扩展标记语言 "是另一种广为接受的格式,用于在 API 响应中表示结构化数据。与 JSON 不同,XML 使用标记来定义分层数据结构,提供更精确但结构化的表示。它就像网页设计和网页结构中的 HTML 标签。虽然 JSON 因其简单性和可读性而受到青睐,但 XML 在某些领域(如企业系统和遗留集成)仍然具有相关性。
Forex Factory News API 中的 XML 示例:
<title>German Trade Balance</title>
<country>EUR</country>
<![CDATA[ 07-07-2024 ]]> </date>
<![CDATA[ 8:30am ]]>
</time>
<forecast><![CDATA[ 19.9B ]]></forecast>
<previous><![CDATA[ 22.1B ]]></previous>
<url>
<![CDATA[ https://www.forexfactory.com/calendar/125-eur-german-trade-balance ]]>
</url>
3. 其他格式:除 JSON 和 XML 外,API 还可以使用其他响应格式,如纯文本、HTM、协议缓冲区或 CSV 文件,具体取决于特定领域的要求和约定。每种格式都有自己的优势和用途,从效率和性能到人类可读性和适应性。
JSON 格式因其简单性、可读性和易用性而成为 web 开发中的流行选择。幸运的是,所讨论的服务也使用此模型进行数据交换。
设置环境和开发
要在 MQL5 中设置使用 JSON API 的环境,您需要遵循几个步骤。
MQL5 是一种编程语言,用于为 MetaTrader 5 交易平台创建交易机器人、技术指标、脚本和函数库。
以下是关于如何在 MQL5 中设置使用 JSON API 的环境的一般指南:
- 了解 MQL5 基础知识:确保您对 MQL5 编程语言的基础知识以及与交易和金融市场相关的基本概念有很好的理解。熟悉文档和 MQL5 参考,了解语言语法和函数。
- 选择一个 JSON 库:MQL5 本身不支持 JSON 解析,因此您需要使用第三方库。您可以在 MQL5 社区或 GitHub 等论坛上找到这些库。 JSON 序列化和 JSON 解析器。
- 下载并安装 JSON 库:下载所选的 JSON 库,并按照库提供的安装说明进行安装。这通常包括将库文件(mqh 或 mq5)放在 MetaTrader 安装的 Include 文件夹中。
- 在代码中包含库:在 MQL 脚本或 EA 交易的开头,使用 #include 指令包含 JSON 库:
- 发出 HTTP 请求:要与 JSON API 交互,您需要发出 HTTP 请求。常用的选择包括 WinHTTP 或 WebRequest。如果您需要使用其他类型的 HTTP,请下载并包含符合您需求的 HTTP 库。
- 将 HTTP 响应保存到文件:由于大多数 API 在请求数量方面都有限制,因此在考虑到 API 请求的限制时,最好将请求的数据保存到文件中,然后使用我们保存的文件,而不是重复和不必要的请求。
- 解析 JSON 响应:收到 API 的响应后,使用 JSON 库解析 JSON 数据。具体语法取决于您使用的库。
- 集成:对 JSON 数据进行分类后,您就可以根据模型、策略或类型将所需数据与程序结合起来。
//Use this type of file include if the file is in MQL include follder #include <JAson.mqh> // Use this type of file include If this file is next to your EA file/follder #include "JAson.mqh"
API 函数代码的说明
MQL5 为 HTTP 请求提供了 WebRequest 函数,从而实现了与 API 的交互。
您可以阅读更多有关 Webrequest 的文档 > Webrequest 和 HTTP 数据交换
下面是使用 GET 方法从 API 地址请求 JSON 数据的 MQL 代码示例:
// Required variables string cookie=NULL, headers="", apikey="your api key", value1="value 1", value2="value 2"; char post[],result[]; int res; string URL = "https://www.example.com/API?apikey="+apikey+"&data1=value1&data2="+value2; // Rest API address ResetLastError(); // Reset ast error // HTTP request via MQL Webrequest, GET method with apikey, value1, and value2 and 2000 millisecond timeout res=WebRequest("GET", URL, cookie, NULL, 2000, post, 0, result, headers); if(res==-1) // WebRequest error handling { int error = GetLastError(); if(error==4060) Print("Webrequest Error ",error); else if(error==5203) Print("HTTP request failed!"); else Print("Unknow HTTP request error("+string(error)+")! "); LastHTTPError=error; } else if (res==200) // The HTTP 200 status response code indicates that the request has succeeded { Print("HTTP request successful!"); // Use CharArrayToString to convert HTTP result array to a string string HTTP_Result = CharArrayToString(result, 0, 0, CP_UTF8); Print(HTTP_Result); }
这段代码向指定的 API URL 发送 GET 请求,展示了在 MQL4 中集成 API 调用的简易性。
案例研究:使用 API 数据访问的成功 MQL EA 交易
如何使用 Ziwox 外汇数据 API 通过基本面数据和实时 AI 预测数据创建自动交易系统
在本文中,我们将探讨如何使用 Ziwox Forex Data API 在 MetaQuotes Language (MQL) 中构建基于基本面和实时数据的工具。他们的 API 上有很多信息,但我们的项目选择了AI 预测。
根据他们提供的信息,Ziwox 终端上的 AI 预测系统是基于新闻、经济日历数据、利率及其利率变化、中央银行的货币和经济政策、市场情绪、外汇货币强度、COT 数据和散户交易商数据等数据的汇总。因此,要对整个市场进行分析,以便将这种预测作为有价值的数据。
我们将介绍获取 API 数据、将 JSON 数据保存到文件、解析 JSON 响应以及使用这些信息创建 EA 交易的过程。
我们的计划是制作一个 EA 交易,使用简单的 MA 策略作为技术信号,如果 AI 预测与我们的方向一致,则作为 AI 过滤器进行交易。
让我们尽力而为。
第 1 步:注册并生成 API 密钥
要开始使用 Ziwox Forex Data API,请按照以下步骤操作:
1.访问这里在 Ziwox 终端上注册
2.填写表格中的信息,阅读条款和政策并接受,点击 "我不是机器人",然后点击 "创建新账户"。
3.验证电子邮件已发送到您的邮箱,请验证您的电子邮件。
4.从这里登录您的账户,浏览个人资料页面,API 选项卡这里,点击绿色生成按钮生成 API 密钥
5.生成 API 密钥后,您就可以访问 Ziwox API 数据了。复制生成的API代码,以便在我们的项目中使用它。
第 2 步:了解 API 结构
API 链接结构如下:
https://ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey={API_KEY}&apitype={REQUEST_TYPE}&pair={PAIR}
- {API_KEY}:上一步中的唯一 API 密钥
- {REQUEST_TYPE}:响应的格式,可以是 JSON 格式或文本格式。
- {PAIR}:所需外汇货币对的标准格式,不含前缀或后缀,如 EURUSD、USDJPY、GBPUSD、XAUUSD、WTI...
第 3 步:测试您的 API 结构
现在,我们要检查 API 链接结构,并向 Ziwox API 申请一个样本。只需使用步骤 2 中的 API 链接,用您的参数编辑参数,打开浏览器,在地址栏上输入 API 链接并按回车键。
如果您正确编辑了 API 链接,HTTP 响应就会是这样:
如果 API 密钥不正确,就会出现类似下面的错误响应:
{
"status": "error",
"desc": "invalid api key"
}
或者如果您输入的资产名称不正确,您可能会看到这样的回复:
{
"status": "error",
"desc": "invalid asset name!!"
}
第 4 步:执行 HTTPAPI Request 函数
如果第 3 步操作成功,现在我们就可以执行一个函数来自动完成这一部分。查看此代码:
datetime LastWebRequest = 0; // use this datetime var for limit failed request API bool GetAPI(string symbolname, string apikey, string filename) { Print("Get API Update"); bool NeedToUpdate = false; // Check if the API data file available if(FileGetInteger(filename,FILE_EXISTS,true)>=0) { // Check the latest update time from file modify date time if(TimeLocal()-(datetime)FileGetInteger(filename,FILE_MODIFY_DATE,true)>900) // update data every 15 min becasue of API call rate limitation NeedToUpdate = true; } else NeedToUpdate = true; if(NeedToUpdate && TimeLocal()-LastWebRequest>300) // retry failed API request every 5 min to avoid firewall IP block { string cookie=NULL,headers; char post[],result[]; int res; string URL = "https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey="+apikey+"&apitype=json&pair="+symbolname; ResetLastError(); int timeout=5000; res=WebRequest("GET", URL, cookie, NULL, timeout, post, 0, result, headers); if(res==-1) { LastWebRequest = TimeLocal(); int error = GetLastError(); if(error==4060) Print("API data Webrequest Error ",error, " Check your webrequest on Metatrader Expert option."); else if(error==5203) Print("HTTP request for "+symbolname+" Data failed!"); else Print("Unknow HTTP request error("+string(error)+")! "+symbolname+" Data"); return(false); } else if(res==200) { LastWebRequest = TimeLocal(); string HTTPString = CharArrayToString(result, 0, 0, CP_UTF8); Print("HTTP request for "+symbolname+" Data successful!"); Print(HTTPString); if (StringFind(HTTPString,"invalid api key",0)!=-1) { Alert("invalid api key"); return(false); } // Store the API data into a common folder file int filehandle=FileOpen(filename,FILE_READ|FILE_SHARE_READ|FILE_WRITE|FILE_SHARE_WRITE|FILE_BIN|FILE_COMMON); if(filehandle!=INVALID_HANDLE) { FileWriteArray(filehandle,result,0,ArraySize(result)); FileClose(filehandle); } } } return(true); }
该函数从您处输入验证 API 密钥 (apikey)、资产名称 (symbolname) 和文件名称 (filename)。它在 url 中嵌入了 "apikey" 和 "symbolname",以预先匹配 API 请求链接。
然后,它使用 Webrequest 函数发出 HTTP 请求,类似于上一步所做的操作。最后,它从服务器获取响应,并将相关信息放入一个名为 "filename" 的文件中。
我们这样调用 API 函数:
string APIfilename = symbolname+"_API_Data.json"; // API store file name string APIKey = "76thfd67a6f867df7"; // Our unic API Key, change it with your API Key string SymbolRequest = "EURUSD"; // Symbol request, without prefix or suffix string APIJSON[]; bool APIGET = GetAPI(SymbolRequest, APIKey, APIfilename);
第 5 步:解析 JSON 数据
正如步骤 3 所述,从 API 收到的数据包含一个数据数组。您可以在下表中看到这些数据的完整解释。
JSON 对象名称 | 数据类型 | 描述 |
---|---|---|
Symbol | 字符串 | 返回相同的资产/交易品质名称 |
Last Price | 数字 | 资产最新价格 |
digits | 数字 | 资产价格的位数 |
Base | 字符串 | 货币对的基准名称 |
Quote | 字符串 | 货币对的引用名称 |
Base Fundamental Bias | 字符串 | 基础货币的基本倾向或基本前景。可能看涨,也可能看跌 |
Base Fundamental Power | 字符串 | 基本偏置动能。可能是弱、中或强 |
Quote Fundamental Bias | 字符串 | 报价货币基本倾向或基本前景。可能看涨,也可能看跌 |
Quote Fundamental Power | 字符串 | 引用基本偏差动能。可能是弱、中或强 |
Fundamental Bias | 字符串 | 资产基本面倾向,即资产的长期基本面前景。看涨或看跌 |
Fundamental Power | 字符串 | 资产基本动能。弱、中或强 |
Fundamental Driver | 字符串 | 与资产基本面倾向相同,它是一个数字,50=中性,大于 50 表示看涨,小于 50 表示看跌。 |
AI Bullish Forecast | 百分比 | 资产价格牛市走势预测,数字越大越看涨 |
AI Bearish Forecast | 百分比 | 资产价格熊市走势预测,数字越大越看跌 |
Retail Long Ratio | 百分比 | 散户交易者多头百分比 |
Retail Long Lot | 数字 | 散户交易者多头手数(订单交易量) |
Retail Long Pos | 数字 | 散户交易者多头仓位数量 |
Retail Short Ratio | 百分比 | 散户交易者空头百分比 |
Retail Short Lot | 数字 | 散户交易者空头手数(订单交易量) |
Retail Short pos | 数字 | 散户交易者空头仓位数量 |
Base COT NET | 数字 | 基础货币的 COT 净头寸 |
Base COT change | 数字 | 基础货币 COT 净头寸变化(每周) |
Quote COT NET | 数字 | 报价货币的 COT 净头寸 |
Quote COT change | 数字 | 报价货币的 COT 净头寸变化(每周) |
COT chng Ratio | 数字 | 大型机构投机者净头寸变化率,正数 = 多头情绪,负数 = 空头情绪 |
Risk Sentiment | 字符串 | 市场风险情绪,可能是 "风险开启"(Risk-ON)、"风险关闭"(Risk-OFF)或 "混合"(MIX)。 |
D1 Trend | 字符串 | 技术数据、每日趋势、买卖趋势 |
D1 RSI | 数字 | 指标数据,每日 RSI 指标值 |
D1 Stoch | 数字 | 指标数据,每日随机振荡指标值 |
cci | 数字 | CCI 指标值 |
cci signal | 字符串 | CCI 指标信号 |
supports | 数字 | 资产支撑水平 |
resistance | 数字 | 资产阻力水平 |
pivot | 数字 | 资产轴枢点/水平 |
VIX Value | 数字 | VIX,波动率指数值 |
VIX Direction | 数字 | VIX 情绪走向,上行 = 恐惧和风险市场,下行 = 贪婪市场 |
VIX Buy driver | 数字 | 正数 = 贪婪市场 |
VIX Sell driver | 数字 | 负数 = 恐惧和风险市场 |
Base Bond | 数字 | 基础货币的债券收益率 |
Base Bond chg | 数字 | 基础货币的债券收益率价值变化 |
Quote Bond | 数字 | 报价货币的债券收益率 |
Quote Bond chg | 数字 | 报价货币的债券收益率价值变化 |
US10Y | 数字 | 美国 10 年期债券收益率 |
US10Y chg | 数字 | 美国 10 年期债券收益率每小时变化 |
Yield Driver | 数字 | 正数偏向基准货币,负数偏向报价货币 |
Allow To Trade | 布尔 | Ziwox 建议,最好停止交易 |
Stop Reason | 字符串 | 如果不建议交易,原因就在这里。 |
riskriversal | 数字 | 该资产的风险逆转值。确定 PUT/CALL 值 |
cesi | 数字 | CESI 值 |
yielddiff | 数字 | 基准货币收益率 - 报价货币收益率 |
banksposition | 数字 | 银行机构头寸比率 |
macrofundamental | 数字 | 宏观经济价值,正数代表资产看涨,负数代表资产看跌。 |
longtermsentiment | 数字 | 基于经济、政治和社会因素的资产长期情绪。 |
seasonal | 百分比 | 从季节性数据看资产增长或下降的可能性 |
在本案例研究/示例中,我们喜欢使用看跌/看涨 AI 预测。 现在,为了设计这个函数,我们通过 JSON 库读取文件中存储的数据(来自第 4 步),然后提取我们需要的内容。
函数如下:
#include "JAson.mqh" // include the JSON librery in our project CJAVal JsonValue; void JsonDataParse(string filename, string &_APIJSON[]) { bool UpdateData = false; for (int arraIn=0; arraIn<ArraySize(APIJSON); arraIn++) APIJSON[arraIn]=""; if(FileGetInteger(filename,FILE_EXISTS,true)>=0) { int FileHandle =FileOpen(filename,FILE_READ|FILE_SHARE_READ|FILE_WRITE|FILE_SHARE_WRITE|FILE_BIN|FILE_COMMON); char jsonarray[]; FileReadArray(FileHandle,jsonarray); FileClose(FileHandle); JsonValue.Clear(); JsonValue.Deserialize(CharArrayToString(jsonarray, 0, 0, CP_UTF8)); _APIJSON[0] = JsonValue[0]["Symbol"].ToStr(); _APIJSON[1] = JsonValue[0]["Fundamental Bias"].ToStr(); _APIJSON[2] = JsonValue[0]["Fundamental Power"].ToStr(); _APIJSON[3] = JsonValue[0]["AI Bullish Forecast"].ToStr(); _APIJSON[4] = JsonValue[0]["AI Bearish Forecast"].ToStr(); _APIJSON[5] = JsonValue[0]["Retail Long Ratio"].ToStr(); _APIJSON[6] = JsonValue[0]["Retail Short Ratio"].ToStr(); _APIJSON[7] = JsonValue[0]["Retail Short Lot"].ToStr(); _APIJSON[8] = JsonValue[0]["Retail Short pos"].ToStr(); _APIJSON[9] = JsonValue[0]["Base COT NET"].ToStr(); _APIJSON[10] = JsonValue[0]["Base COT change"].ToStr(); _APIJSON[11] = JsonValue[0]["Quote COT NET"].ToStr(); _APIJSON[12] = JsonValue[0]["Quote COT change"].ToStr(); _APIJSON[13] = JsonValue[0]["COT chng Ratio"].ToStr(); _APIJSON[14] = JsonValue[0]["Risk Sentiment"].ToStr(); } }
我们这样调用 JSON 函数:
string APIfilename = symbolname+"_API_Data.json"; // API store file name string API_DATA[]; // define an array variable to store API details JsonDataParse( APIfilename,API_DATA);
第 6 步:创建简单的移动平均交叉策略
使用存储在 "APIJSON" 变量中的提取数据,我们现在可以创建自动交易策略,并将我们的策略与 AI 预测系统相结合。下面是一个如何在 EA 中使用数据的基本示例:
你可以选择任何你喜欢的策略,但在这篇文章中,我们试图选择一个简单的策略,因为我们的目标是指导和教你如何在项目中使用这样的工具,这样你就可以把它做得更好。
移动平均线交叉策略是交易者用来识别潜在买入和卖出信号的一种流行技术。
该策略使用两条移动平均线。一个短期,一个长期,以确定市场趋势。
当短期 MA 向上穿过长期 MA 时,表示买入;当它向下穿过长期 MA 时,表示卖出。
让我们这样做:
shortMA = iMA(Symbol(), 0, shortMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); longMA = iMA(Symbol(), 0, longMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); // Check for crossover signals if ( int(APIJSON[3])>=60 ) // if bullish forecast is higher than 60% if (shortMA > longMA) // BUY trend { if (OrdersTotal() == 0) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "Buy Order", 0, 0, Green); if (ticket < 0) Print("Error opening buy order: ", GetLastError()); } } if ( int(APIJSON[4])>=60 ) // if bearish forecast is higher than 60% if (shortMA < longMA) // Sell trend { if (OrdersTotal() == 0) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, 0, 0, "Sell Order", 0, 0, Red); if (ticket < 0) Print("Error opening sell order: ", GetLastError()); } }
第 7 步:使用 JSON 数据进行信号过滤
为了改进 MA 交叉策略,我们使用 JSON 数据和 Ziwox API 中的 AI 预测比率来过滤信号。
例如,如果 MA 交叉显示买入趋势,如果 AI 预测值超过 50%,表明看涨/向上运动,那么买入是个好主意。相反,如果技术分析(MA)发出卖出信号,我们只会在分析和预测数据与卖出方向一致的情况下卖出。这样,既可降低入门风险,又可提高胜率
根据第 4 步中 JSON 数据的排列,人工智能预测、看涨百分比位于数组的第三个元素中,看跌预测位于第四个元素中。
代码可能是这样的:
void OnTick() { if (!APIOK) return; double shortMA, longMA; long ticket = -1; if(IsNewCandle()) { shortMA = iMA(Symbol(), 0, shortMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); longMA = iMA(Symbol(), 0, longMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0); // Check for crossover signals if ( int(APIJSON[3])>=60 ) // if bullish forecast is higher than 60% if (shortMA > longMA) // BUY trend { if (OrdersTotal() == 0) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "Buy Order", 0, 0, Green); if (ticket < 0) Print("Error opening buy order: ", GetLastError()); } } if ( int(APIJSON[4])>=60 ) // if bearish forecast is higher than 60% if (shortMA < longMA) // Sell trend { if (OrdersTotal() == 0) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, 0, 0, "Sell Order", 0, 0, Red); if (ticket < 0) Print("Error opening sell order: ", GetLastError()); } } } }
结论
将 API 数据与 MQL4 集成后,交易员可以创建更具适应性和数据驱动的 EA 交易系统。通过利用外部来源的实时信息,交易者可以在动态的市场条件下强化自己的策略,做出更明智的交易决策。您可以访问原始市场价格之外的数据。这种方法允许您结合技术和基本面分析,提高交易策略的有效性。
最终代码可在下方下载。
我在这里,准备回答任何问题、建议或批评。
致以最诚挚的问候,交易愉快。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/14108


