English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
소셜 테크놀로지 스타트업을 구축하기, 1부: MetaTrader 5 신호를 트윗하세요

소셜 테크놀로지 스타트업을 구축하기, 1부: MetaTrader 5 신호를 트윗하세요

MetaTrader 5트레이딩 시스템 | 12 10월 2021, 14:16
94 0
laplacianlab
[삭제]

소개

본 기사는 실제 사례를 통해 MetaTrader 5 터미널과 외부 웹 서비스를 통신할 수 있는 방법을 설명하는 것을 목표로 합니다. 우리는 Expert Advisor에 의해 생성된 거래 신호를 트윗하고 있습니다.

이 아이디어는 컴퓨터 지원 거래라고 불리는 자동 거래의 특별한 개념에서 나온 것입니다. 간단히 말해서, XXI세기의 컴퓨터는 인지 능력이 없지만, 정보를 처리하고 데이터를 실행하는 데는 매우 뛰어납니다. 그렇다면 왜 우리는 결정을 내리기 위한 필터로서 인간의 뇌를 사용하여 컴퓨터 시스템을 만들지 않는 걸까요? 이 접근 방식은 휴먼 베이스 컴퓨테이션 (HBC) 패러다임에서 영감을 받았습니다, 따라서 코딩 의사 결정자 알고리즘보다는 의사 결정 지원 도구 구축에 초점을 맞춥니다.

저는 처음에 EA에 의해 생성된 거래 신호로 RSS 피드를 만드는 것에 대해 생각해 보았습니다. (중장기 기본 거래 시스템이 있다고 가정되며, 이 아이디어는 자동 스캘핑 시스템에는 유효하지 않습니다. 피드에 접근할 수 있는 사람은 제 로봇 신호를 시장에 내놓기 직전에 그 순간에 상황에 따라 검증해야 합니다. 하지만, 저는 곧 모든 것이 훨씬 더 사교적이 될 수 있다는 것을 깨달았고, '트위터에 내 거래 신호를 게시하는 것이 어떨까?'라고 생각했습니다. 이로 인해 저는 이 사회적 의사결정 지원 시스템을 개발하게 되었습니다.

그림 1. SDSS 아키텍처

그림 1. SDSS 아키텍처

참고로, FX 거래와 관련된 기술 스타트업을 만들 계획이라면 이 기사를 통해 아이디어를 얻을 수 있습니다. SDSS를 기반으로 상용 SaaS(Software as a Service)를 구축하는 기술 가이드로 볼 수 있습니다.

이 텍스트가 길어서 두 부분으로 나누기로 했어요. 첫 번째는 웹 서비스 아키텍처, MetaTrader 5 터미널과 Twitter 앱 사이에 사용되는 통신 프로토콜, 그리고 마지막으로 웹 앱과 Twitter의 통합에 초점을 맞추고 있습니다. 두 번째 파트에서는 사회적 의사결정 시스템의 RESTful 웹 서비스를 사용하기 위한 네트워크 다이어그램의 MQL5 계층에 대해 설명합니다. 특히, 우리는 기사 MQL5-RPC에서 설명한 것과 같은 방식으로 MQL5-RESTful의 프레임워크를 코드화할 것입니다. MQL5에서 원격 프로시저 호출: 재미와 이익을 위한 웹 서비스 액세스 및 XML-RPC ATC 분석기.

이 기사는 또한 사회적인 것이므로, 2부를 계속 진행하는데 도움이 되도록 여러분의 의견을 쓰기를 권합니다.


1. SDSS 아키텍처에 대한 몇 가지 참고 사항

1.1. 서버의 MetaTrader 5

이것은 24시간 사용할 수 있는 기계에서 실행되는 MetaTrader 5 터미널입니다. 이 컴퓨터는 VPS(가상 개인 서버) 또는 DS(전용 서버)일 수 있습니다. 서버의 MetaTrader 5는 RESTful 웹 서비스를 통해 트위터 애플리케이션과 통신합니다. 데이터 교환 형식은 JSON입니다. 이 글의 두 번째 부분에서는 이 텍스트 뒷부분에서 정의하는 통신 프로토콜에 따라 웹 서비스를 사용하는 MQL5 계층을 배포할 것입니다.

1.2. 트위터 앱

서론에서 말했듯이, 우리는 이 기사의 첫 부분에서 SDSS의 트위터 앱을 개발하고 있습니다. 이것은 기본적으로 MetaTrader 5 터미널에서 신호를 수신하여 MySQL 데이터베이스에 저장한 다음 트윗하는 PHP 웹 애플리케이션입니다. 하지만, 이 앱은 인간의 능력을 필요로 하는 많은 문제들을 다루기 위해 확장될 수 있습니다.

예를 들어, 지식을 수집하고 사람들에 의해 필터링된 '서버의 MetaTrader 5'로부터 수신된 신호로 (웹 온톨로지)web ontology 를 구축하여 EA가 인간의 관점에서 얼마나 신뢰할 수 있는지를 확인하고자 할 수 있습니다. 리트윗 및 즐겨찾기에서 주어진 신호(트윗)의 신뢰성을 계산할 수 있습니다. 물론 이것은 이 기사에서 다룰 수 없는 아이디어일 뿐이지만, 이론적으로는 가능합니다. HBC 패러다임에 기반한 실용적인 응용 프로그램일 뿐입니다.

1.3. 트위터

위키피디아에서 말하는 것처럼, 트위터는 사용자들이 트윗이라고 불리는 140자의 짧은 문자 메시지를 보내고 읽을 수 있는 유명한 온라인 소셜 네트워킹 및 마이크로블로깅 서비스입니다.



2. RESTful 웹 서비스 사양

2.1. REST 개요

REST, SOAP and XML-RPC는 웹 서비스 구축에 가장 많이 사용되는 세 가지 아키텍처 패턴입니다. 대부분의 최신 Web 2.0 애플리케이션은 이 패턴을 사용하여 서비스를 개발하므로 SDSS의 것도 REST에서 코드화할 것입니다. 저는 당신이 트위터 REST API라는 제목의 문서를 읽음으로써 이 주제에 대해 더 많이 알기를 바랍니다. 간단히 말해, REST는 데이터 교환 형식으로 JSON 또는 XML과 HTTP 호출의 교환입니다.

SOAP 및 XML-RPC와 달리 REST는 구현이 매우 쉽고 속도도 가장 빠릅니다. XML-RPCSOAP에 있는 것과 같은 의미에서 프로토콜 규격이 없기 때문에 가장 간단합니다. 즉, 웹 서비스를 배포하기 위해 개발자가 XML 유사 언어를 배울 필요가 없습니다. 반면 REST는 클라이언트와 서버 간의 데이터 교환 형식으로 JSON을 사용할 수 있으므로 더 빠른 응답을 제공할 수 있습니다. 실제로 JSON으로 표시되는 개체는 XML로 표시되는 개체보다 항상 더 적은 바이트를 차지합니다. 그 이유는 JSON이 더 의미적 또는 달리 말하면 JSON은 정보를 나타내는 데 XML보다 구문적 요소가 적기 때문입니다.

2.2. SDSS API 참조

트위터 REST API이라는 제목의 문서를 이미 읽으셨습니까? 이제, 말씀드린 것처럼, 트위터의 API 사양은 아이디어를 취하여 SDSS API 구축에 적용할 수 있습니다. 본 기사의 목표는 기술 스타트업이 구현할 수 있는 SDSS를 완전히 개발하는 것이 아니라 MetaTrader 5 터미널을 외부 웹 서비스와 연결할 수 있는 실제 응용 프로그램을 보여 주는 것이기 때문에 매우 간단하게 작업을 수행하고 있습니다. 따라서 이 섹션에서는 HTTP verb POST를 사용하는 단일 REST 메서드로 매우 간단한 API를 설계하고 있습니다. 이것은 주어진 EA의 거래 신호를 수신, 데이터베이스에 저장 및 트윗하기 위한 것입니다.

2.2.1. 일반

API는 http://api.sdss-your-startup.com에서 호스팅되어야 하며, HTTP 또는 HTTPS를 통해 액세스해야 합니다. POST 요청의 경우 파라미터는 POST 본문으로 JSON 형식으로 제출됩니다.

2.2.2. REST 리소스

 리소스 URL설명
POST 신호/추가http://api.sdss-your-startup.com /signal/add트위터 어플리케이션으로 EA 신호를 보냅니다. 이것은 SDSS가 거래신호를 저장 및 트윗하기 위해 MetaTrader 5 터미널에서 수행하는 요청입니다.

서론에서 설명한 바와 같이, 이 기사는 사회성이 있으므로 사회 결정 지원 시스템에서 구현하고자 하는 REST 방법을 여기에 나열해 두시기 바랍니다. 자유롭게 의견을 내고 MQL5.community 공유하십시오.

2.2.3. POST 신호/추가

 매개 변수설명
ea_id

새로운 신호를 보내는 EA의 ID입니다. 예제 값: 12345

기호

이 트랜잭션과 관련된 기호입니다. 예제 값: EURUSD

작업

수행할 작업입니다. 예제 값: 구매 또는 판매


트랜잭션 시점의 기호 값입니다. 예제 값: 1.3214

요청 예제:

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

이 예제를 보면, 주목해야 할 두 가지 중요한 사항이 있습니다. 한편으로, 현재 트위터 애플리케이션에 신호를 보내는 MetaTrader 5 터미널은 하나뿐이라고 가정해 보겠습니다. 이러한 이유로 터미널 ID가 필요하지 않습니다. 그런 다음 나중에 시스템을 확장하고 신생 회사를 더욱 발전시키기로 결정한다면, 여러 터미널을 트위터 앱과 연결하기를 원할 것입니다.

따라서 이 경우 MetaTrader 5 터미널을 식별하기 위해 mt5_id라는 필드를 추가할 것입니다. 한편, 위의 호출은 일부 인증 메커니즘(SSL상의 베이직 HTTP 인증, 토큰 기반 인증 또는 OAuth)으로 보호되어야 합니다. 그러나 이 부분은 생략하지만, 이 문제의 포인트를 잊지 마세요. MetaTrader 5 단말기와 트위터 앱 사이의 인증 메커니즘이 없다면, 통신 프로토콜을 아는 사람은 그림 1의 트위터 앱으로 거래 신호를 보낼 수 있습니다. 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

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

이 모든 것을 가지고 우리는 우리의 로컬 개발 기계에서 웹 서비스를 테스트할 수 있습니다. 참고로 (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>
--> 이제 RESTClient를 사용하여 첫 번째 REST 리소스를 테스트하고 있습니다. RESTful 웹 서비스를 디버깅하기 위한 파이어폭스 보완 기능입니다. 모든 것이 정상으로 돌아가면 웹 서비스는 위의 Slim 메서드로 코딩한 논리를 실행하고 JSON 응답과 함께 HTTP 200 결과를 반환해야 합니다.


그림 3. POST 신호/추가 요청하기 (http://api.laplacianlab.local)

그림 3. POST 신호/추가 요청하기 (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. MetaTrader 5와 트위터 앱이 RESTful 웹 서비스를 통해 서로 대화합니다.

그림 4. MetaTrader 5와 트위터 앱이 RESTful 웹 서비스를 통해 서로 대화합니다.


5. 웹 앱과 트위터의 통합

이제 슬림 PHP 트위터 앱에서 트위터로 신호를 교환하는 트윗의 네트워크 다이어그램에 대해 살펴보겠습니다.

그림 5. 트위터 앱에서 트위터로 신호를 거래하기

그림 5. 트위터 앱에서 트위터로 신호를 거래하기

다음에 할 일이 뭐죠? 다시 한 번, 당신은 추측했어요! 우선 트위터 어플리케이션이 필요합니다. 따라서 트위터 개발자로 이동하여 트위터 계정으로 로그인하고(트위터 앱을 만들려면 먼저 트위터 계정이 있어야 함), "내 애플리케이션"으로 이동한 후 "새 앱 만들기"를 클릭하십시오.


그림 6. 트위터 개발자(Twitter Developers)에서 새로운 앱 생성하기

그림 6. 트위터 개발자(Twitter Developers)에서 새로운 앱 생성하기

새 앱의 세부 정보를 작성하고 로드 개발자 규칙(Developer Rules of the Road)을 수락해야 합니다. 예를 들어 새 응용 프로그램의 세부 정보는 다음과 같습니다:

이름: Laplacianlab's SDSS

상세설명: 사회적 의사결정 지원 시스템

웹사이트: http://api.laplacianlab.local

호출(Callback) URL: http://api.laplacianlab.local/twitter/oauth_callback

이제 "권한" 탭으로 이동하여 "읽기 및 쓰기"로 권한을 업데이트하십시오. 마지막으로, 트위터 응용 프로그램을 만든 후 API 키, API 비밀 및 Oauth 콜백을 config\config.php 파일에 상수로 사용할 수 있도록 기록합니다.

// Twitter OAuth

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

이 시점에서 Slim PHP 마이크로 웹 앱과 Laplacianlab의 SDSS(위에서 만든 트위터 앱)를 통신하고 있습니다. 이렇게 하려면 OAuth 2.0 프로토콜의 기본 사항을 알아야 하므로, 공식 문서를 읽을 기회를 놓치지 마십시오. OAuth 플로우 다이어그램을 숙지해야 합니다.

그림 7. OAuth 플로우 다이어그램

그림 7. OAuth 플로우 다이어그램

따라서 이 다이어그램에 따르면 리소스 소유자(트위터링 신호를 트윗하려는 트위터러)를 저장할 다음 MySQL 테이블을 만들어야 합니다.

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를 사용하고 있습니다, 트위터의 OAuth API를 사용하기 위한 PHP 라이브러리입니다. 이전 섹션에서 첨부한 Composer.json 파일을 사용하여 컴포져(Composer)를 통해 Slim을 설치했다면 트위터 때문에 이 라이브러리를 설치할 필요가 없습니다. 왜냐하면, TwitterOAuth는 PHP 앱의 공급업체 폴더에 이미 복사되어 있습니다.

그렇지 않으면 언제든지 GitHub에서 이 PHP 구성 요소를 다운로드할 수 있습니다. OAuth 흐름을 볼 때 트위터를 사용하는 사람이 Laplacianlab의 SDSS 및 oauth 콜백에 권한을 적용하도록 방법을 프로그래밍하기만 하면 됩니다. 현재로서는 SDSS가 매우 간단하기 때문에 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();
-->

 

여기서 가장 중요한 것은 액세스 권한을 제공한 사용자를 대신하여 SDSS가 트위터에 인증된 호출을 할 수 있는 두 가지 데이터를 데이터베이스에 저장하는 것입니다. 이 두 가지는 액세스 토큰과 액세스 토큰 암호이며, 사용자가 취소할 때까지 영구적입니다. 따라서 사회 결정 지원 시스템은 사용자 자격 증명을 저장하지 않으며, 반면에 사용자는 취소를 통해 원할 때마다 액세스 권한을 제거할 수 있습니다.

PHP 기반 SDSS에는 올바른 액세스 토큰과 액세스 토큰 시크릿이 있지만 다음과 같이 트위터 호출을 수행할 수 있습니다:

// 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 터미널과 트위터를 연결하는 방법을 보여줍니다. 우리는 로봇의 처리 능력과 개인의 인지 능력을 결합한 컴퓨터 보조 시스템을 개발했습니다. 우리는 사람들이 로봇 거래 신호를 검증하기를 원합니다. 그렇지 않으면 Expert Advisors에 의해 자동으로 시장에 출시될 것입니다. 따라서, 우리는 새롭고 흥미로운 주제에 대한 문을 열었는데, 그것은 사람들이 리트윗하거나 거래 신호를 선호할 때 자동 거래 시스템에 대한 지식을 포착하는 것입니다. 이것은 인간 기반 연산(HBC) 패러다임에 기반한 실용적인 응용입니다.

완전한 사회 의사 결정 지원 시스템을 구축하는 것은 시간이 많이 걸리기 때문에, 이 연습은 기술 신생 기업을 구축하기 위한 아이디어로 볼 수 있습니다. 우리는 다음과 같은 세 가지 주요 부분으로 구성된 SDSS 개발을 시작했습니다:

  1. VPS 또는 DS에서 실행되는 MetaTrader 5 터미널;
  2. Slim 기반 PHP 트위터 웹 앱;
  3. 트위터(Twitter);

특히, 이 첫 번째 파트에서는 Slim PHP 웹 앱과 MetaTrader 5를 통신하는 RESTful 웹 서비스의 아키텍처를 구현했으며 OAuth 프로토콜을 통해 PHP 웹 앱을 트위터와 연결했습니다. 다음 파트에서는 MQL5-RPC 기사에서 설명한 것과 같은 방식으로 MQL5-RESTful 프레임워크를 코드화할 것입니다. MQL5에서 원격 프로시저 호출: 재미와 이익을 위한 웹 서비스 액세스 및 XML-RPC ATC 분석기.


MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/925

파일 첨부됨 |
database.txt (1.33 KB)
laplacianlab.zip (467.5 KB)
MQL5(MQL4)에서 MySQL 데이터베이스에 액세스하는 방법 MQL5(MQL4)에서 MySQL 데이터베이스에 액세스하는 방법
이 문서에서는 MQL과 MySQL 데이터베이스 간의 인터페이스 개발에 대해 설명합니다. 기존의 실용적인 솔루션에 대해 설명하고 데이터베이스 작업을 위한 라이브러리를 보다 편리하게 구현할 수 있는 방법을 제공합니다. 이 문서에는 기능, 인터페이스 구조, 예제 및 MySQL 사용 시 특정 기능에 대한 자세한 설명이 포함되어 있습니다. 소프트웨어 솔루션의 경우 문서 첨부 파일에는 동적 라이브러리 파일, MQL4 및 MQL5 언어의 설명서 및 스크립트 예가 포함됩니다.
거래 로봇 이야기: 더 적은 것이 더 많은 것인가요? 거래 로봇 이야기: 더 적은 것이 더 많은 것인가요?
2년 전 "마지막 십자군"에서 우리는 꽤 흥미롭지만 현재 널리 사용되지 않는 시장 정보 표시 방법인 포인트 및 피겨(point and figure) 차트를 검토했습니다. 이제 포인트 및 피겨 차트에서 감지된 패턴을 기반으로 거래 로봇을 작성해 보십시오.
MQL5 마법사: 주문, 손실 중지 및 계산된 가격에서 이익 취하기. 표준 라이브러리 확장 MQL5 마법사: 주문, 손실 중지 및 계산된 가격에서 이익 취하기. 표준 라이브러리 확장
이 문서에서는 MQL5 표준 라이브러리 확장을 설명합니다, 이로써, MQL5 마법사를 사용하여 Expert Advisor를 생성하고, 주문, 손실 중지 및 이익 취하기를 포함된 모듈에서 받은 가격으로 설명합니다. 이 접근 방식은 모듈 수에 대한 추가 제한을 적용하지 않으며 모듈 공동 작업에서 충돌을 일으키지 않습니다.
세줄 브레이크 차트(Three Line Break Chart)를 구성하기 위한 지시자 세줄 브레이크 차트(Three Line Break Chart)를 구성하기 위한 지시자
이 기사는 스티브 니슨이 그의 책 "캔들스틱 그 너머"에서 제안한 3행 브레이크 차트(Three Line Break Chart)에 관한 것입니다. 이 차트의 가장 큰 장점은 이전 이동과 관련하여 가격의 사소한 변동을 필터링할 수 있다는 것입니다. 우리는 차트 구성의 원칙, 지표의 코드, 그리고 그것을 기반으로 한 거래 전략의 몇 가지 예를 논의할 것입니다.