English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
ソーシャルテクノロジースタートアップの構築 パート1: MetaTrader 5 シグナルをツイートする

ソーシャルテクノロジースタートアップの構築 パート1: MetaTrader 5 シグナルをツイートする

MetaTrader 5トレーディングシステム | 24 12月 2015, 13:34
611 0
laplacianlab
削除済み

はじめに

本稿の狙いは実用例を挙げて MetaTrader 5 が外部ウェブサービスと通信する方法を説明することです。われわれは Expert Advisor によって生成されるトレードシグナルをツイートしています。

この考えはコンピュータ援用取引と呼ばれる自動トレーディングの特定の概念からきています。簡単に言えば、21世紀のコンピュータには認知能力はありませんが、情報処理とデータ実行には長けています。人間の脳をフィルターとして意思決定に利用するコンピュータシステムを構築してはいかがでしょうか?この方法はヒューマンベースト・コンピュテーション (HBC) パラダイムにヒントを得、それ故意思決定コード化アルゴリズムではなく意思決定支援ツールを構築することに重点を置いています。

私は最初に自分の EA によって生成されるトレードシグナルを持つ RSS フィードを作成することを考えました(中長期の基本となるトレードシステムがあると過程します。この考えは自動スキャルプシステムには有効ではありません)。フィードにアクセスする人間はその時の状況に従い、直前にマーケットに入れることで私のロボットによるシグナルを有効にします。ただしすべてをもっとソーシャルにできるのではないかと気づきました。そして心の中で思ったのです。「Twitterでトレードシグナルを公表したらどうなんだろう?」と。これで私はこの「ソーシャル意思決定支援システム」を開発しようとしたきっかけです。

図1 SDSS アーキテクチャ

図1 SDSS アーキテクチャ

ところで、FX取引に関連したテクノロジースタートアップを作成しようとしているなら、本稿がアイデアを得るのに役立つでしょう。SDSS に基づく商用 SaaS (サービスとしてのソフトウェア)を構築するテクニカルガイドのように映るかもしれません。

このテキストは長いので二分割することにしました。最初の部分はウェブサービスのアーキテクチャ、MetaTrader 5 ターミナルと Twitter アプリの間で使用される通信プロトコル、最終的にTwitter でのウェブアプリの統合に着目します。次の部分は上に示されるネットワークダイアグラムの MQL5 層を取り上げます。それはソーシャル意思決定支援システムの RESTful ウェブサービスを使用します。特に、記事MQL5-RPC Remote Procedure Calls from MQL5: Web Service Access and XML-RPC ATC Analyzer for Fun and Profitで説明されているのと同じ方法で MQL5-RESTful フレームワークをコード化します。

本稿はソーシャルであるため、パート2を続ける助けとなるようコメントを書いていただけることを奨励します。


1. SDSS アーキテクチャについてのいくつかの注意事項

1.1. サーバー上での MetaTrader 5

これは24時間利用可能なマシンで動作している MetaTrader 5 ターミナルです。このコンピュータは仮想専用サーバー(VPS)や専用サーバー(DS)です。サーバー上の MetaTrader 5 は RESTfulウェブサービスを介して Twitter アプリケーションと通信します。データ交換フォーマットは JSON です。本稿の第二部でウェブサービスを使用して本稿でのちに決定する通信プロトコルに従いMQL5 層を展開します。

1.2. Twitter アプリ

はじめにでお話したように本稿の最初の部分では SDSS のTwitter アプリを作成します。これは基本的にMetaTrader 5 ターミナルからシグナルを受信し、 MySQL データベースに格納しそれらをツイートするPHP ウェブアプリケーションです。ただし、このアプリは解決するのに人間の能力が必要な数多くの問題を処理するために拡張することができます。

たとえば、知識を得たいと思います。そして人によってフィルターにかけられた「サーバー上の MetaTrader 5」から受信したシグナルを持つウェブ・オントロジーを構築し、人間の視点から自分の EA がいかに信頼できるか確認します。リツイートやそれに関連したお気に入りから与えられたシグナル(ツイート)の信頼性を計算することができます。これは本稿では取り上げていない単なる考えです。がもちろん理論的には可能です。それはヒューマンベースト・コンピュテーション(HBC)パラダイムに基づく実用的なアプリケーションです。

1.3. Twitter

ウィキペディアにあるように、Twitter は著名なオンラインソーシャルネットワークで、マイクロブログサービスです。それによりユーザーはツイートと称される短い140文字のテキストメッセージを送信し読むことができます。


2. RESTful ウェブサービス仕様

2.1. REST 概要

RESTSOAPXML-RPCはウェブサービスを構築するためにもっともよく使用されるアーキテクチャパターンです。最新のアプリケーション Web 2.0 はサービス開発にこのパターンを使用しており、われわれも REST で SDSS をコード化します。このテーマについてドキュメント The Twitter REST APIを読んでもっと知識を深めることを推奨します。端的に言えば、REST はデータ交換フォーマットとしてのJSON や XMLとの HTTP 呼び出し交換です。

SOAP や XML-RPCとは異なり、REST はひじょうに実装が簡単で最も高速です。それはもっともシンプルです。というのもXML-RPCSOAPと同じ意味でのプロトコル仕様がないからです。これは開発者がウェブサービスを展開するために XML の疑似言語を学習する必要がないことを意味します。一方、REST はクライアントとサーバー間のデータ交換フォーマットとして JSON を使用することができます。それによりより速い応答が可能となります。事実、JSON で表現されるオブジェクトはXMLで表示するのに比べつねに使用するバイト数がすくなくてすみます。これはがよりセマンティックまたは別の言い方をするならば、JSON は XML よりも情報を表示するための構文要素が少ないのです。

2.2. SDSS API 参照資料

The Twitter REST APIはすでにお読みになりましたか?ここでは申し上げたように、Twitter API の仕様をがなんらかの考えを出しそれをSDSS API構築に適用するのに役立つでしょう。シンプルなものを作るということを思い出してください。本稿の目標は SDSS の完全作成ではなく、テクノロジースタートアップによってそれを展開し、MetaTrader 5 ターミナルを外部ウェブサービスと接続することのできる現実での実用的アプリケーションを提示することなのですから。従って、このセクションは、HTTP の動詞 POST を用いた単一のメソッドを用いたじょうにシンプルな API を考案します。これは受信、データベースへの格納、与えられた EA のトレードシグナルをツイートするためのものです。

2.2.1. 一般

API はhttp://api.sdss-your-startup.com にまとめられており、HTTP または HTTPSを介してアクセスします。POST リクエストには JSON フォーマットで POST の本体にパラメータがサブミットされます。

2.2.2. REST リソース

リソース URL 説明
POST シグナル/追加 http://api.sdss-your-startup.com /signal/add EA シグナルを Twitter アプリケーションに送信します。これは SDSS がトレードシグナルを格納しツイートするよう、MetaTrader 5 ターミナルによって行われるリクエストです。

本稿のはじめでソーシャルであると示しているように、ここにご自身のソーシャル意思決定支援システムに実装したい REST メソッドをリストアップすることをお薦めします。遠慮なくコメントし、MQL5 コミュニティで共有してください。

2.2.3. POST シグナル/追加

パラメータ 説明
ea_id

新シグナルを送信する EA の ID 値の例:12345

symbol

本トランザクションで使用されるシンボル値の例:EURUSD

opeartion

行われる処理値の例:売りまたは買い

value

トランザクションの瞬間のシンボル値値の例:1.3214

リクエスト例

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

ビュー内のこの例では注意すべき重要点が2点あります。一方で、Twitter アプリケーションに対してシグナルを送信している MetaTrader 5 が1台しかない時を想定します。この理由でターミナルID は必要ありません。それからのちにシステムを拡張し、スタートアップをさらに発展させようと思ったら、おそらく Twitter アプリに複数のターミナルを接続したいと思うことでしょう。

その場合、 MetaTrader 5 ターミナルを見分けるために mt5_id という名前のフィールドを追加します。また一方で上記の呼び出しはなんらかの認証メカニズム(SSL によるBasic HTTP Authentication、トークンベースの認証、またはOAuth)によって保護される必要があることに注意してください。われわれはこの部分はスキップしますが、この問題をポイントするのをわすれないでください。MetaTrader 5 ターミナルと Twitter アプリの間の認証メカニズムなしでも、通信プロトコルを知る人はだれでも図1のTwitter アプリにトレードシグナルを送ることができることに留意が必要です。SDSS アーキテクチャ


3. ウェブアプリのデータベース設計

REST API 仕様はシステムがどのように動作するのか知るのに役立ちます。これでデータベース設計を理解することができます。

# 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 ウェブサービスのプログラミング

開発者自身の言葉で Slim がシンプルでも力強いウェブアプリケーションとAPI を速く書くのに役立つPHP マイクロフレームワークです。はい、想像されてましたよね!われわれは Slim で RESTful API を書いていきます。コードに行はほとんどありません。われわれは合理性とシンプルさを学ぶため HTTP POSTメソッドをコード化していることを思い出してください。どのように動作するか詳細を知るため Slim の公式ドキュメンテーションをご一読ください。

図2 Slim に基づく PHP API のディレクトリ構造

図2 Slim に基づく PHP API のディレクトリ構造

config\config.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

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

// 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"
    }
}

これをすべて用いてローカル開発マシンでウェブサービスを検証することができます。ところで、以下を忘れないようにします。(1)Windows がローカルドメイン名 api.laplacianlab.local を転換することができるようにホストファイルに新規エントリを追加すること。(2)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>
これで最初の REST リソースを RESTClient で検証しています。これは RESTful ウェブサービスをデバッグするための Firefox の補足物です。すべてが問題なく行われると、ウェブサービスが上の Slim メソッドでコード化したロジックを実行し、JSON 応答とともに HTTP 200 結果を返信します。


図3 http://api.laplacianlab.local への POST シグナル/追加リクエスト送信

図3 http://api.laplacianlab.local への POST シグナル/追加リクエスト送信

上記のシグナル/追加リクエストに対する HTTP 応答ヘッダは以下のようなものです。

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
}

できました!下図に対応する「ソーシャル意思決定支援システム」部を実装したのです。 ただし思い出してください!実際のシナリオではそのような呼び出しを保護する認証層が必要なことを。

図6 RESTful ウェブサービスにより対話するMetaTrader 5 と Twitter アプリ

Figure 4. RESTful ウェブサービスにより対話するMetaTrader 5 と Twitter アプリ


5. ウェブアプリの Twitter との統合

ここで Slim P HP Twitter アプリからTwitter へトレードシグナルをツイートするネットワークダイアグラム部分に取り組みます。

図5 Twitter アプリから Twitter へのトレードシグナルのツイート

図5 Twitter アプリから Twitter へのトレードシグナルのツイート

では次は?また推測済みでしょう!まず Twitterアプリケーションが必要です。Twitter デベロッパーに行き、ご自身の Twitter アカウント(Twitter アプリを作成するにはまず Twitter アカウントが必要です)にサインインし、『マイアプリ』に行って『新規アプリ作成』をクリックします。


図6 Twitter デベロッパーで新規アプリを作成

図6 Twitter デベロッパーで新規アプリを作成

新しいアプリの詳細情報を記入し開発者利用規則に同意します。たとえば、私の新規アプリは以下のようなものです。

  • 名前:Laplacianlab's SDSS
  • 内容:ソーシャル意思決定システム
  • ウェブサイト:http://api.laplacianlab.local
  • コールバック URL:http://api.laplacianlab.local/twitter/oauth_callback

『許可』と名前のついたタブに行き、『読み出しと書き込み』許可をアップデートします。最後に、アプリケーション作成後、API キー、API シークレット、Oauth コールバックを書き、ご自身のファイルで定数として使用できるようにします。

// Twitter OAuth

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

この時点で Slim PHP マイクロウェブアプリとLaplacianlab の SDSS(上で作成した Twitter アプリ) の通信をしています。これには OAuth 2.0 プロトコル の基礎を知る必要があります。そのため公式ドキュメンテーションを読む機会をお見逃しなく。OAuth のフローチャートに慣れる必要があります。

図7 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 ライブラリです。前のセクションにアタッチしたcomposer.json ファイルを用いて Composer を介して Slim をインストールするなら、このライブラリのインストールに心配はいりません。なぜなら TwitterOAuth はすでに PHP アプリのベンダーフォルダにコピーされているからです。

そうでなければ、いつでも GitHub からこの PHP コンポーネントをダウンロードすることができます。ビューの OAuth フローを用いては、Twitter 利用者がLaplacianlab の SDSSに対する許可とコールバックを申し込むメソッドをプログラムする必要があるだけです。今のところわれわれの SDSS はひじょうにシンプルなので index.php ファイルになんでも書き込むことができます。

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

ここで一番重要なことは、データベースに SDSS が Twitter に対してアクセス許可を得たユーザーの代わりに認証済み呼び出しをすることができるようになる2つのデータを格納することです。これら2つはアクセストークンとアクセストークンシークレットです。それはユーザーが取り消すまで変わりません。ソーシャル意思決定支援システムはユーザーのを保管することはありません。また、ユーザーは取り消しによっていつでもアクセス許可を削除することができます。

PHP に基づくが正しいアクセストークンとアクセストークンシークレットを持っている限り、以下のように 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 ウェブサービスのプログラミングでコード化を開始したSDSS API のリソース POST シグナル/追加を完了するのはひじょうに簡単です。よっていくらかのサンプルデータをツイートするのに必要な PHP コード追加はみなさんの練習用に残しておきます。


おわりに

本稿では EA のトレードシグナルをツイートするために、MetaTrader 5 ターミナルを Twitter と接続する方法を示しました。個人の認知能力とロボットの処理力を組み合わせたコンピュータ支援システムを作成しました。Expert Advisors によってマーケットに自動的に出されるロボットによるトレードシグナルを人々に検証していただきたいと思います。こうしてわれわれは新しいわくわくする話題への扉を開きました。それはトレードシグナルを人々がリツイートしたりお気に入りにするときの自動売買システムに関する知識を得ることです。これはヒューマンベースト・コンピュテーション (HBC) パラダイムに基づく実用的なアプリケーションです。

ソーシャルディシジョン支援システムを展開するには時間がかかります。よってこの練習 はテクノロジースタートアップの構築アイデアとして見ることができます。われわれは3つの主要部分からなる SDSS を作成し始めました。

  1. VPS または DS 上で動作するMetaTrader 5 ターミナル
  2. Slim を基にしたPHP Twitter ウェブアプリ
  3. Twitter

特にこのパート1ではわれわれは MetaTrader 5 が Slim PHP ウェブアプリと通信する RESTfulウェブサービスのアーキテクチャを実装し、PHP ウェブアプリを OAuth プロトコルを使って Twitter とリンクしました。パート2では記事 MQL5-RPC. Remote Procedure Calls from MQL5: Web Service Access and XML-RPC ATC Analyzer for Fun and Profitで説明されているのと同じ方法で MQL5-RESTful フレームワークをコード化します。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/925

添付されたファイル |
database.txt (1.33 KB)
laplacianlab.zip (467.5 KB)
Johnpaul77 シグナル提供者:「われわれの戦略は3年以上利益をあげている。なぜ変えなくちゃならないんだ?」 Johnpaul77 シグナル提供者:「われわれの戦略は3年以上利益をあげている。なぜ変えなくちゃならないんだ?」
小さな秘密を明かします。:MQL5.com ウェブサイトのビジターはほとんどの時間をJohnpaul77 のシグナルページで費やします。それは実アカウントでトータル570万ドルの資金を有する、定期購読者約900人のわれわれのシグナルレーティングのリーダーです。シグナルの提供者にインタービューします。そこには4人の人物がいることがわかりました。チームメンバー間で任務はどのように割り当てされているのでしょうか?どのようなテクニカルツールを使用しているのでしょうか?なぜかれらは自分達を John Paul と呼ぶのでしょうか?そして最後にインドネシア出身の一般的なゲーマーが MQL5.comでトップシグナルの提供者になったのでしょうか?本稿ですべての答えを見つけてください。
ソーシャルテクノロジースタートアップの構築 パート2: MQL5 REST クライアントのプログラミング ソーシャルテクノロジースタートアップの構築 パート2: MQL5 REST クライアントのプログラミング
本稿パート1でご紹介した PHP ベースの Twitter の考え方を形にしましょう。の異なるパーツを SDSS 組み立てるのです。システムアーキテクチャのクライアント側において、HTTP を介してトレードシグナルを送信するために新しいMQL5 WebRequest() 関数に頼ります。
最適化数点のシンプルな考え 最適化数点のシンプルな考え
最適化のプロセスにはコンピュータや MQL5 クラウドネットワーク検証エージェントのリソースも大量に必要とします。本稿では作業の促進とMetaTrader 5 ストラテジーテスタの改良に利用する簡単な考えをいくつか取り上げます。こういったアイデアはドキュメンテーション、フォーラム、記事から得ました。
MQL5.com フリーランス:開発者の収入源(インフォグラフィック) MQL5.com フリーランス:開発者の収入源(インフォグラフィック)
「MQL5 フリーランスサービス」の4周年を記念して、これまでのサービス結果を示すインフォグラフィックを作成しました。数字は自らを語ります:現在まで合計約 $600,000 に相当する 10,000 を越える注文が実行されるかたわら、 3,000 人の顧客と 300 人の開発者がすでにこのサービスを利用しました。