English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Construire une start-up de technologie sociale, Première partie Envoyez des Tweets sur vos signaux MetaTrader 5

Construire une start-up de technologie sociale, Première partie Envoyez des Tweets sur vos signaux MetaTrader 5

MetaTrader 5Systèmes de trading | 13 janvier 2022, 14:35
336 0
laplacianlab
[Supprimé]

Introduction

Cet article vise à illustrer, à travers d’exemple pratique, la façon de communiquer un terminal MetaTrader 5 avec un service Web externe. Nous tweetons les signaux de trading générés par un Expert Advisor.

Cette idée vient exceptionnellement d’une conception du trading automatique appelée trading assisté par ordinateur. En un mot, les ordinateurs du XXIe siècle n’ont pas de capacités cognitives, mais ils sont très bons pour traiter l’information et exécuter des données. Alors pourquoi ne pas construire des systèmes informatiques en utilisant le cerveau humain comme filtres dans la prise de décisions ? Cette approche s’inspire du paradigme du calcul basé sur l’humain (HBC), et se concentre donc sur la création d’outils d’aide à la décision plutôt que sur le codage d’algorithmes de décideurs.

J’avais initialement pensé à créer un flux RSS avec les signaux de trading générés par mes EA (on suppose qu’il existe un système de trading sous-jacent à moyen ou long terme, cette idée n’est pas valable pour les systèmes de scalping automatique). Un humain ayant accès au flux devrait valider mes signaux robotiques en fonction des circonstances, avant de les mettre sur le marché. Cependant, je me suis vite rendu compte que tout pouvait être encore plus social, et je me suis dit : « Pourquoi ne pas publier mes signaux de trading sur Twitter ? » Cela m’a amené à développer ce système https://en.wikipedia.org/wiki/Decision_support_system social.

Figure 1. ArchitectureSDSSSDSS

Figure 1. SDSS Architecture

Au fait, si vous envisagez créer une start-up technologique liée au trading FX, cet article peut vous donner quelques idées. Il peut être considéré comme un guide technique pour construire un SaaS commercial (logiciel en tant que service) basé sur un SDSS.

Ce texte est long, j’ai donc décidé de le scinder en deux parties. Le premier se parle de l’architecture du service Web, le protocole de communication utilisé entre le terminal MetaTrader 5 et l’application Twitter, et enfin l’intégration de l’application Web avec Twitter. La deuxième partie couvrira la couche MQL5 du diagramme de réseau illustré ci-dessus, qui est destinée à consommer le service Web RESTful de notre système d’aide à la décision sociale. Plus précisément, nous allons coder un cadre MQL5-RESTful de la même manière que celle expliquée dans l’article MQL5-RPC. Appels de procédure à distance depuis MQL5 : Accès aux services Web et analyseur XML-RPC ATC pour le plaisir et le profit.

Cet article est également social, je vous encourage donc à écrire vos commentaires pour aider à continuer avec la deuxième partie.


1. Quelques remarques sur l’architecture SDSS

1.1. MetaTrader 5 sur un serveur

Il s’agit d’un terminal MetaTrader 5 fonctionnant sur une machine disponible 24 heures sur 24. Cet ordinateur peut être un serveur privé virtuel (VPS) ou un serveur dédié (DS). MetaTrader 5 sur un serveur communique avec l’ application Twitter via un service Web RESTful titlehttps://en.wikipedia.org/wiki/Representational_state_transfer.title Le format d’échange de données est JSON. Dans la deuxième partie de cet article, nous allons déployer la couche MQL5 consommant le service Web, selon le protocole de communication que nous définissons plus loin dans ce texte.

1.2. Application Twitter

Comme nous l’avons dit dans l’introduction, nous développons l’application Twitter du SDSS dans la première partie de cet article. Il s’agit d’une application Web PHP qui reçoit essentiellement des signaux du terminal MetaTrader 5, les stocke dans une base de données MySQL, puis les tweete. Cependant, cette application peut être étendue afin de gérer et résoudre de nombreux problèmes qui nécessitent des capacités humaines.

Par exemple, vous voudriez capturer des connaissances et construire une Web http://www.w3.org/TR/owl-ref/ avec les signaux reçus de 'MetaTrader 5 sur un serveur' qui ont été filtrés par des personnes, pour voir à quel point votre EA est fiable du point de vue humain. Nous pourrions calculer la fiabilité d’un signal donné (un tweet) à partir des retweets et des favoris qui lui sont associés. C’est juste une idée qui ne peut pas être abordé dans cet article, bien sûr, mais c’est théoriquement possible. Il s’agit simplement d’une application pratique basée sur le paradigme du calcul basé sur l’homme (HBC).

1.3. Twitter

Comme le dit Wikipédia, Twitter est le célèbre réseau social en ligne et de microblogage qui permet aux utilisateurs d’envoyer et de lire de courts messages texte de 140 caractères, appelés tweets.



2. Spécification du service Web RESTful

2.1. Aperçu du REST

REST, SOAP et XML-RPC sont les trois modèles architecturaux les plus utilisés pour créer un service Web.. Comme la plupart des applications Web 2.0 modernes utilisent ce modèle pour développer leurs services, nous coderons également nos FDSS sur REST. Je vous encourage à en apprendre davantage sur ce sujet en lisant le document intitulé The Twitter REST API. En somme, REST est un échange d’appels HTTP avec JSON ou XML comme format d’échange de données.

Contrairement à SOAP et XML-RPC, REST est très facile à implémenter et est aussi le plus rapide. C’est le plus simple car il n’y a pas de spécification de protocole dans le même sens qu’il y en a dans XML-RPC et SOAP. Cela signifie que le développeur n’a pas besoin d’apprendre un pseudo-langage XML pour déployer le service Web. D’autre part, REST peut utiliser JSON comme format d’échange de données entre le client et le serveur, ce qui permet de donner une réponse plus rapide. En effet, tout objet représenté en JSON occupe toujours moins d’octets que s’il était représenté en XML. C’est parce que JSON est plus sémantique, ou en d’autres termes, JSON a moins d’éléments syntaxiques que XML pour représenter l’information.

2.2. Référence de l’API SDSS

Avez-vous déjà lu le document intitulé The Twitter REST API? Maintenant, avec tout ce qui a été dit, la spécification d’API de Twitter peut servir à prendre quelques idées et à les appliquer dans la construction de notre API SDSS. Rappelons que nous rendons les choses très simples car le but de cet article n’est pas de développer complètement le SDSS, qui pourrait être déployé par une startup technologique, mais de montrer une application pratique dans la vie réelle où vous pouvez connecter votre terminal MetaTrader 5 à un service Web externe. En conséquence, dans cette section, nous concevons une API extrêmement simple avec une seule méthode REST qui utilise le verbe HTTP POST. Il s’agit de recevoir, de stocker dans la base de données et de tweeter le signal de trading d’un EA donné.

2.2.1. Généralités

L’API doit être hébergée à http://api.sdss-your-startup.com et doit être accessible via HTTP ou HTTPS.E Pour les demandes POST, les paramètres sont soumis dans le corps POST au format JSON.

2.2.2. Ressources REST

 Resource  URL Description
Signal POST/ajout http://api.sdss-your-startup.com /signal/add Envoie un signal EA à l’application Twitter. C’est la demande qui est effectuée par le terminal MetaTrader 5 afin que le SDSS stocke et tweete le signal de trading.

Comme indiqué dans l’introduction, cet article est social, je vous encourage donc à énumérer ici les méthodes REST que vous souhaitez mettre en œuvre dans votre système d’aide à la décision sociale. N’hésitez pas à faire vos commentaires et les partager avec la communauté MQL5.

2.2.3. Signal POST/ajout

 Paramètre Description
ea_id

ID de l’EA qui envoie le nouveau signal. Exemple de valeur : 12345

symbole

Symbole impliqué dans cette transaction. Exemple de valeur : EURUSD

opération

Opération à effectuer. Exemple de valeur : ACHETER ou VENDRE

valeur

Valeur du symbole au moment de la transaction. Exemple de valeur : 1.3214

Exemple de demande :

{
    "ea_id": 1,
    "symbol": "AUDUSD",
    "operation": "BUY",
    "value": 0.9281    
}

Avec cet exemple en vue, il y a deux choses importantes à noter. D’une part, supposons pour le moment qu’il n’y a qu’un seul terminal MetaTrader 5 envoyant des signaux à l’application Twitter. Pour cette raison, il n’y a pas besoin d’identifiant de terminal. Si, plus tard, nous décidons d’étendre le système et de développer davantage notre startup, nous voudrons probablement connecter plusieurs terminaux à l’application Twitter.

Dans ce cas alors, nous ajouterions un champ nommé mt5_id afin d’identifier le terminal MetaTrader 5. D'un autre côté, notez que l'appel ci-dessus doit être sécurisé par un mécanisme d'authentification (Authentification HTTP de base sur SSL, authentification basée sur des signes ou OAuth). Cependant, nous sautons cette partie, mais n’oubliez pas de souligner ce problème. Veuillez noter que sans mécanisme d’authentification entre le terminal MetaTrader 5 et l’application Twitter, toute personne connaissant le protocole de communication pourrait envoyer des signaux de trading à l’application Twitter dans la figure 1. Architecture SDSS.


3. Conception de la base de données de l’application Web

La spécification de l’API REST nous a aidés à voir comment le système fonctionne, nous comprenons maintenant la conception de la base de données :

# 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. Programmation du service Web PHP RESTful

Selon les mots de ses propres développeurs, Slim est un micro structure PHP qui vous aide à écrire rapidement des applications Web et des API simples mais puissantes. Oui, vous l’avez deviné! Nous allons écrire notre API RESTful sur Slim, avec très peu lignes de code. Rappelez-vous que nous ne codons qu’une seule méthode HTTP POST pour des raisons d’apprentissage et de simplicité. S’il vous plaît, lisez la documentation officielle de Slim pour mieux savoir comment cela fonctionne.

Figure 2. Structure de répertoire de l'API PHP basée sur Slim

Figure 2. Structure de répertoire de l’API PHP basée sur Slim


<?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; 
    } 
}

public\.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();

composer.json

{
    "require": {
        "slim/slim": "2.*",
        "abraham/twitteroauth": "dev-master"
    }
}

Avec tout cela, nous pouvons tester le service Web dans notre machine de développement local. Au fait, n’oubliez pas (1) d’ajouter une nouvelle entrée dans votre fichier hosts afin que votre Windows résolve le nom de domaine local api.laplacianlab.local, et (2) crée un nouvel hôte virtuel pour votre Apache.

C:\Windows\System32\Drivers\etc\hosts

::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>
Nous testons maintenant notre première ressource REST avec RESTClient, qui est un complément Firefox pour le débogage des services Web RESTful. Si tout se passe bien, le service Web doit exécuter la logique que nous avons codée dans la méthode Slim ci-dessus et renvoyer un résultat HTTP 200 avec une réponse JSON.


Figure 3. L’envoi d’un signal/d’une demande d’ajout POST à http://api.laplacianlab.local

Figure 3. Envoi d’un signal POST/demande d’ajout à http://api.laplacianlab.local

L'en-tête de réponse HTTP pour la demande de signal/d'ajout POST ci-dessus est le suivant :

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

Et c’est le Corps de la réponse HTTP :

{
        "ea_id": 1,
        "symbol": "AUDUSD",
        "operation": "BUY",
        "value": 0.9281,
        "id": 22
}

Nous l’avons compris! Nous venons de mettre en place la partie de notre système d’aide à la décision sociale qui correspond à la figure ci-dessous. Mais rappelez-vous!, il devrait y avoir une couche d’authentification pour protéger de tels appels dans un scénario réel.

Figure 6. MetaTrader 5 et l’application Twitter se parlent via

Figure 4. MetaTrader 5 et l’application Twitter se parlent via un webservice RESTful


5. Intégration de l’application Web avec Twitter

Traitons maintenant de cette partie du diagramme de réseau qui tweete les signaux de trading de l’application Twitter Slim PHP vers Twitter.

Figure 5. Tweeter des signaux de

Figure 5. Tweeter des signaux de trading de l’application Twitter vers Twitter

Quoi de neuf ? Encore une fois, vous l’avez deviné! Tout d’abord, vous avez besoin d’une application Twitter. Alors s’il vous plaît aller à Développeurs Twitter , connectez-vous avec votre compte Twitter (vous devez d’abord avoir un compte Twitter pour pouvoir créer une application Twitter), allez dans « Mes applications » et cliquez sur « Créer une nouvelle application ».


Figure 6. Créer une nouvelle application

Figure 6. Créer une nouvelle application dans Développeurs Twitter

Vous devez remplir les détails de votre nouvelle application et accepter les règles à suivre du développeur. Par exemple, les détails de ma nouvelle application sont les suivants :

Name: SDSS de Laplacianlab

Description: Système d’aide à la décision sociale

Siteweb: http://api.laplacianlab.local

URLde rappel: http://api.laplacianlab.local/twitter/oauth_callback

S’il vous plaît, allez maintenant dans l’onglet dénommé « Autorisations » et mettez à jour les autorisations à « Lecture et écriture ». Enfin, après avoir créé votre application Twitter, notez votre clé API, votre secret API et votre rappel Oauth afin de pouvoir les utiliser comme constantes dans votre fichier config\config.php :

// Twitter OAuth

define('API_KEY', 'akMnfXR45MkoaWbZoPiu3');
define('API_SECRET', '45Mkoa54NcvQRBbf119qWerty0DnIW45MncvFgqw');
define('OAUTH_CALLBACK', 'http://api.laplacianlab.local/twitter/oauth_callback');

À ce stade, nous communiquons la micro application Web Slim PHP avec le SDSS de Laplacianlab (l’application Twitter que nous avons créée ci-dessus). Pour ce faire, vous devez connaître les bases de le protocole OAuth 2.0, alors, s’il vous plaît, ne manquez pas l’occasion de lire la documentation officielle. Vous devez être familier avec le diagramme de flux OAuth.

Figure 7. Diagramme

Figure 7. Diagramme de flux OAuth

Par conséquent, selon ce diagramme, nous devons maintenant créer la table MySQL suivante pour stocker les propriétaires de ressources (les utilisateurs de Twitter qui veulent tweeter les signaux de trading):

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;

Plus précisément, nous utilisons , TwitterOAuth, qui est une bibliothèque PHP pour travailler avec l’API OAuth de Twitter. Si vous avez installé Slim via Compositeur à l’aide du fichier composer.json que j’ai joint dans la section précédente, vous n’avez pas à vous soucier de l’installation de cette bibliothèque car TwitterOAuth sera déjà copié dans le dossier fournisseur de votre application PHP.

Sinon, vous pouvez toujours télécharger ce composant PHP à partir de GitHub. Avec le flux OAuth en vue, il suffit de programmer la méthode permettant aux utilisateurs de Twitter d’appliquer des autorisations à la FDSS de Laplacianlab et le rappel oauth. Pour l’instant, notre SDSS est si simple que nous pouvons tout écrire dans le fichier index.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();

 

La chose la plus importante ici est de stocker dans la base de données les deux données qui permettent au SDSS de passer des appels authentifiés à Twitter au nom des utilisateurs qui ont fourni les autorisations d’accès. Ces deux éléments sont le signal d’accès et le secret du signal d’accès, qui sont permanents jusqu’à ce qu’ils soient révoqués par les utilisateurs. Ainsi, le système d’aide à la décision sociale ne stocke jamais les informations d’identification de l’utilisateur et, d’autre part, les utilisateurs peuvent supprimer leurs autorisations d’accès quand ils le souhaitent par le biais de la révocation.

Bien que le SDSS basé sur PHP ait le signal d’accès et le secret d’accès corrects, il peut effectuer des appels Twitter comme suit :

// 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));

Nous avons tous les ingrédients nécessaires. Maintenant, il est très facile de compléter la ressource POST signal/ add de l’API SDSS que nous avons commencé à coder en 4. Programmation du service Web PHP RESTful, il vous reste donc un exercice pour ajouter le code PHP nécessaire pour tweeter des exemples de données.


Conclusion

Cet article a montré comment connecter un terminal MetaTrader 5 à Twitter afin que vous puissiez tweeter les signaux de trading de vos EA. Nous avons développé un système assisté par ordinateur qui combine la puissance de traitement des robots avec les capacités cognitives des individus. Nous voulons que les gens valident les signaux de trading robotiques qui, autrement, seraient automatiquement mis sur le marché par les Expert Advisors. Ainsi nous avons ouvert la porte à un sujet nouveau et passionnant, qui est de capturer des connaissances sur les systèmes de trading automatique lorsque les gens renvoient des tweets ou signaux fav de trading. Il s’agit d’une application pratique basée sur le paradigme du calcul basé sur l’homme (HBC).

Le déploiement d’un système complet d’aide à la décision sociale prend du temps, de sorte que cet exercice peut être considéré comme une idée pour créer une start-up technologique. Nous avons commencé à développer une FDSS qui se compose de trois parties principales:

  1. Terminal MetaTrader 5 fonctionnant sur un VPS ou un DS ;
  2. Application Web PHP Twitter basée sur Slim;
  3. Twitter;

Plus précisément, dans cette première partie, nous avons implémenté l’architecture du service Web RESTful qui communique MetaTrader 5 avec l’application Web Slim PHP, et nous avons également lié l’application Web PHP à Twitter via le protocole OAuth. Dans la deuxième partie, nous coderons un cadre MQL5-RESTful de la même manière comme expliqué dans l’article MQL5-RPC. Appels de procédure à distance depuis MQL5 : Accès aux services Web et analyseur XML-RPC ATC pour le plaisir et le profit.


Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/925

Fichiers joints |
database.txt (1.33 KB)
laplacianlab.zip (467.5 KB)
Comment accéder à la base de données MySQL à partir de MQL5 (MQL4) Comment accéder à la base de données MySQL à partir de MQL5 (MQL4)
L'article décrit le développement d'une interface entre MQL et la base de données MySQL. Il traite des solutions pratiques existantes et offre un moyen plus pratique d'implémenter une bibliothèque pour travailler avec des bases de données. L'article contient une description détaillée des fonctions, la structure de l'interface, des exemples et certaines des fonctionnalités spécifiques de l'utilisation de MySQL. Comme pour les solutions logicielles, les pièces jointes des articles incluent les fichiers de bibliothèques dynamiques, de la documentation et des exemples de scripts pour les langages MQL4 et MQL5.
Récits de Robots de Trading : Est-ce moins plus que ca ? Récits de Robots de Trading : Est-ce moins plus que ca ?
Il y a deux ans, dans « La Dernière Croisade », nous avons passé en revue une méthode intéressante mais actuellement peu utilisée pour afficher des informations sur le marché - des graphiques de points et de figures. Maintenant, je vous suggère d’essayer d’écrire un robot de trading basé sur les modèles détectés sur le graphique de points et de figures.
Assistant MQL5 : Exécuter des ordres, des stop-loss et des prises de bénéfices sur les prix calculés. Extension de la bibliothèque standard Assistant MQL5 : Exécuter des ordres, des stop-loss et des prises de bénéfices sur les prix calculés. Extension de la bibliothèque standard
Cet article décrit l'extension MQL5 Standard Library, qui permet de créer des Expert Advisors, de passer des ordres, des Stop Loss et des Take Profits à l'aide de l'assistant MQL5 en fonction des prix reçus des modules inclus. Cette approche n'applique aucune restriction supplémentaire sur le nombre de modules et ne provoque pas de conflits dans leur travail commun.
Indicateur de construction d'un graphique à trois sauts de ligne Indicateur de construction d'un graphique à trois sauts de ligne
Cet article est consacré au tableau des trois sauts de ligne, suggéré par Steve Nison dans son livre « Beyond Candlesticks ». Le plus grand avantage de ce graphique est qu’il permet de filtrer les fluctuations mineures d’un prix par rapport au mouvement précédent. Nous allons discuter du principe de la construction graphique, du code de l’indicateur et de quelques exemples de stratégies de trading basées sur celui-ci.