介绍
本文旨在通过一个实际的例子说明如何将MetaTrader 5终端与外部Web服务进行通信。我们发出的交易信号由EA生成。
这个想法来自于自动化交易的具体概念,称为计算机辅助交易。一般来说,21世纪的计算机没有认知能力,但它们很擅长处理信息和执行数据。那么,我们为什么不建立一个利用人脑作为决策过滤器的计算机系统呢?这种方法的灵感来源于基于人的计算(HBC)模型。因此,我们应该专注于构建决策支持工具,而不是编码决策者的算法。
我最初想创建一个RSS来推送由我的EA生成的交易信号(假设有一个中线或长线基础交易系统,这个想法对自动倒卖系统无效)。访问推送内容的人可以根据当前情况在信号到达市场前验证我的自动交易信号。然而,我很快意识到一切都可以变得更加社会化,我想,“为什么不在Twitter上发布我的交易信号呢?”这促使我开发了这个社会决策支持系统。
图1。SDSS体系结构
顺便说一下,如果你想创造一个与外汇交易相关的技术创新,本文可以帮助你找到一些想法。它可以看作是构建基于SDS的商业SaaS(软件即服务)的技术指南。
这一段很长,所以我决定把它分成两部分。第一部分主要介绍Web服务的体系结构、MetaTrader 5终端与Twitter应用程序之间的通信协议,以及Web应用程序与Twitter的最终集成。第二部分将介绍上面所示的网络图的MQL5层,其目的是使用我们的社会决策支持系统的RESTful Web服务。具体来说,我们将以与本文mql5-rpc相同的方式编写mql5 restful框架代码。来自mql5的远程过程调用:Web服务访问和xml-rpc atc analyzer for fun and profit(来自mql5的mql5-rpc:Network Service access for fun and profit:xml-rpc Automatic Trading Championship Analysis Program for fun and profit)。
这篇文章也是社会性的,所以我鼓励你表达你的意见,以帮助你继续第二部分。
1。关于SDSS架构
的一些注意事项
1.1。服务器上的MetaTrader 5
MetaTrader 5终端在一台每天24小时工作的机器上运行。此计算机可以是虚拟专用服务器(VPS)或专用服务器(DS)。MetaTrader 5和服务器上的Twitter应用程序之间的通信是通过RESTful Web服务进行的。数据交换格式为JSON。在本文的第二部分中,我们将部署MQL5层以使用本文稍后定义的通信协议Web服务。
1.2。Twitter应用程序
正如我们在引言中提到的,我们在本文的第一部分使用SDSS开发Twitter应用程序。这是一个PHP Web应用程序,它基本上从MetaTrader 5终端接收信号,将它们存储在MySQL数据库中,然后发布它们。但是,这个应用程序可以扩展到处理许多需要手动解决的问题。
例如,您希望获得知识并构建一个Web本体,以接收来自服务器上“metatrader 5”的人工过滤信号,并查看人工EA信号的可靠性。我们可以计算与之相关的给定信号的可靠性。这只是一个想法,当然,本文没有包括在内,它在理论上是可行的。这只是面向人计算(HBC)模型的一个实际应用。
1.3。推特
正如维基百科所指出的,Twitter是一个著名的在线社交网络和微博服务,允许用户发送和阅读140个字符的短文本信息,称为tweets。
2。RESTful Web服务规范
休息概述
REST、SOAP和XML-RPC是构建Web服务的三种常见体系结构范式。由于大多数现代Web2.0应用程序都使用此模型来开发自己的业务,因此我们还将在REST的基础上编写SDS。我鼓励您阅读名为twitter rest api的文档,以了解有关此主题的更多信息。简言之,REST调用HTTP进行交换,并使用JSON或XML作为数据交换格式。
与SOAP和XML-RPC不同,REST可以轻松快速地实现。这是最简单的,因为没有像XML-RPC和SOAP中那样的协议规范。这意味着开发人员必须学习有关XML伪语言的所有知识,才能部署Web服务。另一方面,REST可以使用JSON作为客户机和服务器之间的数据交换格式,从而得到更快的响应。事实上,在JSON中描述对象总是比在XML中占用更少的字节。这是因为JSON比XML具有更多的语义,换句话说,在JSON中表示信息的语法元素更少。
2.2。SDSS API参考
你读过名为twitter rest api的文档吗?总之,Twitter的API规范可以作为构建SDSSAPI的参考。回想起来,我们所做的非常简单,因为本文的目的不是开发一个完整的SDS,而是开发可以部署的技术创新。但实际上,它是一个实用的应用程序,即将您的MetaTrader5终端连接到外部Web服务。因此,在本节中,我们将设计一个非常简单的API,它在单独的REST方法中使用HTTPPOST。它用于接收、存储在数据库中,并发布特定EA的事务信号。
2.2.1例行程序
API将接管http://api.sdss-your-startup.com,可以通过http或https访问。对于POST请求,参数以JSON格式与POST实体一起提交。
休息资源
&资源 | 网址 | 说明 |
---|---|---|
POST信号/加法 | 网址:http://api.sdss-your-startup.com/signal/add | 向Twitter应用程序发送EA信号。此请求由MetaTrader 5终端执行,以便SDS存储和发布交易信号。 |
正如在引言中指出的,本文是社会性的,因此我鼓励您在这里列出您的社会决策支持系统期望实现的其他方法。请随时表达您的意见,并与MQL5社区分享。
2.2.3.POST信号/加法
 ;参数 | 描述 |
---|---|
AAYID- | 这个ID是发送新信号的EA标识符。示例值:12345 |
符号 | 交易品种符号。示例值:欧元兑美元 |
搜索引擎 | 执行的操作。示例值:买入或卖出 |
值 | 交易品种的价格。示例值:1.3214 |
请求示例:
{ "ea_id": 1, "symbol": "AUDUSD", "operation": "BUY", "value": 0.9281 }
在所示的示例中,有两个要点。一方面,我们假设同时只有一个MetaTrader5终端向Twitter应用程序发送信号。因此,不需要终端ID。如果我们决定扩展系统并进一步开发我们的创新应用程序,我们可能需要将多个终端连接到Twitter应用程序。
因此,在本例中,我们将添加一个名为mt5_id的字段来标识metatrader 5终端。另一方面,请注意,上述调用应该通过一些安全身份验证机制(基本HTTP身份验证)附加到SSL、基于身份验证的令牌或OAuth。虽然我们跳过了这一部分,但我们不能忘记指出这个问题。请注意,如果MetaTrader 5终端和Twitter应用程序之间没有认证机制,那么每个人都将知道图1中向Twitter应用程序发送交易信号的通信协议。SDSS体系结构。
三。Web应用程序的数据库设计
RESTAPI规范帮助我们了解系统的工作原理,因此我们现在可以了解数据库设计:
# MySQL database creation... CREATE DATABASE IF NOT EXISTS sdss; use sdss; # Please, change the user's password in production GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES, CREATE TEMPORARY TABLES ON `sdss`.* TO 'laplacianlab'@'localhost' IDENTIFIED BY 'password'; CREATE TABLE IF NOT EXISTS eas ( id mediumint UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(32), description TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS signals ( id int UNSIGNED NOT NULL AUTO_INCREMENT, id_ea mediumint UNSIGNED NOT NULL, symbol VARCHAR(10) NOT NULL, operation VARCHAR(6) NOT NULL, value DECIMAL(9,5) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (id_ea) REFERENCES eas(id) ) ENGINE=InnoDB; # Dump some sample data... INSERT INTO eas(name, description) VALUES ('Bollinger Bands', '<p>Robot based on Bollinger Bands. Works with H4 charts.</p>'), ('Two EMA', '<p>Robot based on the crossing of two MA. Works with H4 charts.</p>');
4。编程php restful web服务
用开发人员自己的话说,Slim是一个PHP微框架,可以帮助您快速编写简洁但功能强大的Web应用程序和API。是的,你猜对了!我们基于Slim编写了RESTfulAPI,只需要几行代码。记住,为了学习和简化,我们只编写一个HTTP Post方法。阅读Slim的官方文档,了解更多关于它如何工作的信息。
图2。基于slim的php api目录结构
配置/config.php
<?php // Creating constants. // General define('BASE_URL', 'laplacianlab.local'); define('APPLICATION_PATH', realpath(dirname(__FILE__)) . '/../'); // Database connection define('DB_NAME', 'sdss'); define('DB_USER', 'laplacianlab'); define('DB_PASSWORD', 'password'); // Don't forget to change this in your production server! define('DB_SERVER', 'localhost');
model/dbconnection.php模型
<?php class DBConnection { private static $instance; private $mysqli; private function __construct() { $this->mysqli = new MySQLI(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME); } public static function getInstance() { if (!self::$instance instanceof self) self::$instance = new self; return self::$instance; } public function getHandler() { return $this->mysqli; } }
公共/.htaccess
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes... RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
public/index.php文件
<?php // Bootstrap logic require_once '../config/config.php'; set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . '/vendor/'); set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . '/model/'); require_once 'slim/slim/Slim/Slim.php'; require_once 'DBConnection.php'; use /Slim/Slim; Slim::registerAutoloader(); $app = new Slim(); $app->response->headers->set('Content-Type', 'application/json'); // RESTful API methods // POST signal/add $app->post('/signal/add', function() { $request = Slim::getInstance()->request(); $signal = json_decode($request->getBody()); $sql = 'INSERT INTO signals(id_ea, symbol, operation, value) VALUES (' . mysql_real_escape_string($signal->ea_id) . ",'" . mysql_real_escape_string($signal->symbol) . "','" . mysql_real_escape_string($signal->operation) . "'," . mysql_real_escape_string($signal->value) . ')'; DBConnection::getInstance()->getHandler()->query($sql); $signal->id = DBConnection::getInstance()->getHandler()->insert_id; echo json_encode($signal); }); // More API methods here!.., according to your API spec $app->run();
作曲家.json
{ "require": { "slim/slim": "2.*", "abraham/twitteroauth": "dev-master" } }
有了这些,我们可以在本地开发机器上测试Web服务。顺便说一下,不要忘记(1)在主机文件中添加一个新条目,这样您的Windows就可以解析本地域名API了。拉普兰实验室本地,和(2)为Apache创建新的虚拟主机。
C:/Windows/System 32/驱动程序/etc/主机
::1 localhost # Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host # localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost 127.0.0.1 localhost 127.0.0.1 api.laplacianlab.local
httpd-vhosts.conf文件
# Virtual Hosts # # Required modules: mod_log_config # If you want to maintain multiple domains/hostnames on your # machine you can setup VirtualHost containers for them. Most configurations # use only name-based virtual hosts so the server doesn't need to worry about # IP addresses. This is indicated by the asterisks in the directives below. # # Please see the documentation at # <URL:http://httpd.apache.org/docs/2.4/vhosts/> # for further details before you try to setup virtual hosts. # # You may use the command line option '-S' to verify your virtual host # configuration. # # VirtualHost example: # Almost any Apache directive may go into a VirtualHost container. # The first VirtualHost section is used for all requests that do not # match a ServerName or ServerAlias in any <VirtualHost> block. # <VirtualHost *:80> ServerAdmin webmaster@laplacianlab.local DocumentRoot "c:/wamp/www/laplacianlab/public" ServerName api.laplacianlab.local ErrorLog "logs/api.laplacianlab.local-error.log" CustomLog "logs/api.laplacianlab.local-access.log" common <directory "c:/wamp/www/laplacianlab/public"> Options FollowSymLinks AllowOverride all Order Deny,Allow Deny from all Allow from 127.0.0.1 </directory> </VirtualHost>
现在我们开始用 RESTClient 测试第一个 REST 资源, 它是一个 Firefox 补丁用于调试 RESTful web 服务。如果一切正常,web 服务必须运行我们的 Slim 方法,并且返回一个 HTTP 200 的结果以及 JSON 响应。
图3。向http://api.laplacianlab.local发送POST信号/添加请求
HTTP用以下头响应POST信号/添加请求:
Status Code: 200 OK Connection: Keep-Alive Content-Length: 70 Content-Type: application/json Date: Mon, 07 Apr 2014 18:12:34 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.4 (Win64) PHP/5.4.12 X-Powered-By: PHP/5.4.12
和HTTP响应实体:
{ "ea_id": 1, "symbol": "AUDUSD", "operation": "BUY", "value": 0.9281, "id": 22 }
我们明白了!我们已经实现了社会决策支持系统的一部分,响应图如下所示。但请记住,在现实场景中,有一个身份验证层来保护调用。
图4。MetaTrader 5和Twitter应用程序通过RESTful Web服务相互交流
5。将Web应用程序与Twitter集成
现在,让我们来讨论一下将事务信号发布到Twitter的瘦php-twitter应用程序中的网络图部分。
图5。从twitter应用到twitter应用释放交易信号
下一步是什么?你又猜到了!首先,你需要一个Twitter应用程序。因此,请访问Twitter开发者的网站并使用您的Twitter帐户登录(您首先需要一个Twitter帐户,以便创建Twitter应用程序),输入“我的应用程序”,然后单击“创建新应用程序”。
图6。在Twitter开发者中创建一个新的应用程序
您需要填写新应用程序的详细信息,并接受开发人员路径的规则。例如,我的新应用程序的详细信息如下:
姓名:Laplacianlab的SDS
说明:社会决策支持系统
网址:http://api.laplacianlab.local
回调 URL: http://api.laplacianlab.local/twitter/oauth_callback
现在转到标记为“权限”的页面,并更改读写权限。最后,当您创建一个Twitter应用程序时,写下您的API键、API键和OAuth回调URL,这样您就可以将它们用作配置/配置中的常量。PHP文件:
// Twitter OAuth define('API_KEY', 'akMnfXR45MkoaWbZoPiu3'); define('API_SECRET', '45Mkoa54NcvQRBbf119qWerty0DnIW45MncvFgqw'); define('OAUTH_CALLBACK', 'http://api.laplacianlab.local/twitter/oauth_callback');
此时,我们使用Laplacianlab的SDS与瘦PHP微应用程序(即我们之前创建的Twitter应用程序)进行通信。为此,您需要了解OAuth2.0协议的基础知识。不要错过阅读官方文件的机会。你应该熟悉OAuth的流程图。
图7。OAuth流程图
因此,根据这个图,我们现在必须创建以下mysql表来存储资源所有者(想要发布事务信号的twitter):
CREATE TABLE IF NOT EXISTS twitterers ( id mediumint UNSIGNED NOT NULL AUTO_INCREMENT, twitter_id VARCHAR(255), access_token TEXT, access_token_secret TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB;
具体来说,我们使用TwitterOAuth,一个与Twitter的OAuth API一起工作的PHP库。如果安装了Slim-Through Composer并使用该Composer。我附加到上一节的JSON文件,您不必担心安装库文件,因为twitteroauth已经复制到您的php应用程序供应商文件夹中。
否则,您可以从Github下载PHP控件。使用OAuth过程作为一个教训,我们只需要为tweeters方法编程,就可以申请laplacianlab和OAuth回调的SDS特权。考虑到我们的SDS现在有多简单,我们可以在索引中编写所有内容。PHP文件。
public/index.php文件
<?php // Bootstrap logic require_once '../config/config.php'; set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . '/vendor/'); set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . '/model/'); require_once 'slim/slim/Slim/Slim.php'; require_once 'abraham/twitteroauth/twitteroauth/twitteroauth.php'; require_once 'DBConnection.php'; use /Slim/Slim; session_start(); Slim::registerAutoloader(); $app = new Slim(); $app->response->headers->set('Content-Type', 'application/json'); // RESTful API methods // POST signal/add $app->post('/signal/add', function() { $request = Slim::getInstance()->request(); $signal = json_decode($request->getBody()); $sql = 'INSERT INTO signals(id_ea, symbol, operation, value) VALUES (' . mysql_real_escape_string($signal->ea_id) . ",'" . mysql_real_escape_string($signal->symbol) . "','" . mysql_real_escape_string($signal->operation) . "'," . mysql_real_escape_string($signal->value) . ')'; DBConnection::getInstance()->getHandler()->query($sql); $signal->id = DBConnection::getInstance()->getHandler()->insert_id; echo json_encode($signal); }); // More API methods here!.., according to your API spec // Twitter OAuth flow // This method is for users to give permissions to Laplacianlab's SDSS to tweet // on their behalf. $app->get('/tweet-signals', function() use ($app) { if (empty($_SESSION['twitter']['access_token']) || empty($_SESSION['twitter']['access_token_secret'])) { $connection = new TwitterOAuth(API_KEY, API_SECRET); $request_token = $connection->getRequestToken(OAUTH_CALLBACK); if ($request_token) { $_SESSION['twitter'] = array( 'request_token' => $request_token['oauth_token'], 'request_token_secret' => $request_token['oauth_token_secret'] ); switch ($connection->http_code) { case 200: $url = $connection->getAuthorizeURL($request_token['oauth_token']); // redirect to Twitter $app->redirect($url); break; default: echo '{"error":{"text":"Connection with Twitter failed"}}'; break; } } else { echo '{"error":{"text":"Error Receiving Request Token"}}'; } } else { echo '{"message":{"text":"Everything is ok! Laplacianlab/'s SDSS ' . 'can now tweet trading signals on your behalf. Please, if you no ' . 'longer want the SDSS to tweet on your behalf, log in your Twitter ' . 'account and revoke access."}}'; } }); // This is the OAuth callback $app->get('/twitter/oauth_callback', function() use ($app) { if(isset($_GET['oauth_token'])) { $connection = new TwitterOAuth( API_KEY, API_SECRET, $_SESSION['twitter']['request_token'], $_SESSION['twitter']['request_token_secret']); $access_token = $connection->getAccessToken($_REQUEST['oauth_verifier']); if($access_token) { $connection = new TwitterOAuth( API_KEY, API_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']); // Set Twitter API version to 1.1. $connection->host = "https://api.twitter.com/1.1/"; $params = array('include_entities' => 'false'); $content = $connection->get('account/verify_credentials', $params); if($content && isset($content->screen_name) && isset($content->name)) { $_SESSION['twitter'] = array( 'id' => $content->id, 'access_token' => $access_token['oauth_token'], 'access_token_secret' => $access_token['oauth_token_secret'] ); // remove the request token from session unset($_SESSION['twitter']['request_token']); unset($_SESSION['twitter']['request_token_secret']); // Twitter's OAuth access tokens are permanent until revoked so // we try to update them when a tweeterer tries to give access // permissions again $sql = "SELECT * FROM twitterers WHERE twitter_id='$content->id'"; $result = DBConnection::getInstance()->getHandler()->query($sql); if($result->num_rows) { $sql = "UPDATE twitterers SET " . "access_token = '" . mysql_real_escape_string($access_token['oauth_token']) . "', " . "access_token_secret = '" . mysql_real_escape_string($access_token['oauth_token_secret']) . "' " . "WHERE twitter_id ='" . $content->id . "'"; } else { $sql = "INSERT INTO twitterers(twitter_id, access_token, access_token_secret) " . "VALUES ('" . mysql_real_escape_string($content->id) . "','" . mysql_real_escape_string($access_token['oauth_token']) . "','" . mysql_real_escape_string($access_token['oauth_token_secret']) . "')"; } DBConnection::getInstance()->getHandler()->query($sql); echo '{"message":{"text":"Everything is ok! Laplacianlab/'s SDSS ' . 'can now tweet trading signals on your behalf. Please, if you no ' . 'longer want the SDSS to tweet on your behalf, log in your Twitter ' . 'account and revoke access."}}'; } else { echo '{"error":{"text":"Login error"}}'; } } } else { echo '{"error":{"text":"Login error"}}'; } }); $app->run();
nbsp;
这里最重要的是在数据库中存储两段数据,并允许SDS调用Twitter提供的访问权限来进行用户身份验证。这些是访问令牌和访问令牌密钥,在用户注销之前是永久的。因此,社会决策支持系统永远不会存储用户证书,另一方面,当用户打算注销时,可以删除其访问权限。
使用正确的访问令牌和访问令牌密钥,基于PHP的SDS可以执行以下Twitter调用:
// Let's assume there's an object named $user to access the tokens... $connection = new TwitterOAuth( API_KEY, API_SECRET, $user->getAccessToken(), $user->getAccessTokenSecret()); $message = "Hello world! I am Laplacianlab's SDSS and I am tweeting on behalf of a tweeterer."; $connection->post('statuses/update', array('status' => $message));
我们已经有了我们需要的所有原料。现在,4。我们在php restful web服务中开始编码的sdss api的post signals/additions的编程非常容易完成,因此将其留给您作为练习,您可以添加必要的php代码来发布一些示例数据。
结论
本文展示了如何将MetaTrader5终端连接到Twitter,以便发布EA事务信号。我们开发了一个计算机辅助系统,将自动事务处理与个人认知能力相结合。我们希望人们验证机器的自动交易信号,否则EA将自动在市场上下订单。因此,我们为一个新的令人兴奋的话题打开了大门,人们可以在转发或收集交易信号时获得有关自动交易系统的知识。这是面向人计算(HBC)模型的实际应用。
部署一个完整的社会决策支持系统是一项耗时的工作,因此这项工作可以被看作是一个建立技术创新的想法。我们已经开始开发SDS,它由三个主要部分组成:
- 在VPS或DC上运行的MetaTrader 5终端;
- 基于瘦PHP的Twitter Web应用程序;
- 推特;
具体来说,在第一部分中,我们实现了RESTful Web服务体系结构,它可以在MetaTrader 5和瘦PHP Web应用程序之间进行通信。我们还通过OAuth协议将PHP Web应用程序链接到Twitter。在下一节中,我们将以与本文mql5-rpc相同的方式编写mql5 restful框架生成。远程过程调用来自mql5:web服务访问和xml-rpc atc analyzer,以获取乐趣和利润代码。
由MetaQuotes Software Corp.从英文翻译为
原文。https://www.mql5.com/en/articles/925
MyFxtop迈投(www.myfxtop.com)-靠谱的外汇跟单社区,免费跟随高手做交易!
免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经(www.myfxtop.cn)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。