English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Bir Sosyal Teknoloji Girişimi Kurmak, Bölüm I: MetaTrader 5 Sinyallerinizi Tweetleyin

Bir Sosyal Teknoloji Girişimi Kurmak, Bölüm I: MetaTrader 5 Sinyallerinizi Tweetleyin

MetaTrader 5Ticaret sistemleri | 14 Ocak 2022, 10:53
63 0
laplacianlab
[Silindi]

Giriş

Bu makale, bir MetaTrader 5 terminalini harici bir web servisi ile nasıl iletişim kurabileceğinizi pratik bir örnek üzerinden göstermeyi amaçlamaktadır. Bir Expert Advisor tarafından oluşturulan alım satım sinyallerini tweetliyoruz.

Bu fikir, bilgisayar destekli alım satım adı verilen belirli bir otomatik alım satım anlayışından gelmektedir. Özetle, XXI yüzyılın bilgisayarları bilişsel yeteneklere sahip değildir, ancak bilgi işlemede ve veri yürütmede çok iyidirler. Öyleyse neden karar vermek için insan beynini filtre olarak kullanan bilgisayar sistemleri inşa etmiyoruz? Bu yaklaşım, İnsan tabanlı hesaplama (HBC) paradigmasından esinlenmiştir, dolayısıyla karar verici algoritmaları kodlamak yerine karar destek araçları oluşturmaya odaklanır.

Başlangıçta EA'larım tarafından üretilen alım satım sinyalleriyle bir RSS beslemesi oluşturmayı düşündüm (orta veya uzun vadeli bir alım satım sisteminin altında olduğu varsayılıyor, bu fikir otomatik scalping sistemleri için geçerli değil). Yeme erişimi olan bir insan, robotik sinyallerimi piyasaya sürmeden hemen önce o anın koşullarına göre doğrulamalıdır. Ancak kısa süre sonra her şeyin daha sosyal olabileceğini fark ettim ve kendi kendime düşündüm, 'Neden alım satım sinyallerimi Twitter'da yayınlamıyorum?' Bu, beni bu Sosyal Karar Destek Sistemini geliştirmeye yöneltti.

Şekil 1. SDSS Mimarisi

Şekil 1. SDSS Mimarisi

Bu arada, FX alım satımı ile ilgili bir teknoloji girişimi kurmayı planlıyorsanız bu makale fikir edinmenize yardımcı olabilir. SDSS'ye dayalı ticari bir SaaS (Hizmet olarak Yazılım) oluşturmak için teknik bir kılavuz olarak görülebilir.

Bu metin uzun, bu yüzden iki bölüme ayırmaya karar verdim. İlki web servis mimarisine, MetaTrader 5 terminali ile Twitter uygulaması arasında kullanılan iletişim protokolüne ve son olarak web uygulamasının Twitter ile entegrasyonuna odaklanmaktadır. İkinci bölüm, Sosyal Karar Destek Sistemimizin RESTful web hizmetini tüketmesi amaçlanan, yukarıda gösterilen ağ diyagramının MQL5 katmanını kapsayacaktır. Spesifik olarak, bir MQL5-RESTful çerçevesini MQL5-RPC makalesinde açıklandığı şekilde kodlayacağız. MQL5'ten Uzaktan Prosedür Çağrıları: Eğlence ve Kar için Web Hizmeti Erişimi ve XML-RPC ATC Analizör.

Bu makale aynı zamanda sosyaldir, bu yüzden ikinci bölüme devam etmenize yardımcı olmak için yorumlarınızı yazmanızı tavsiye ederim.


1. SDSS Mimarisi Üzerine Bazı Notlar

1.1. Bir sunucuda MetaTrader 5

Bu, günde 24 saat kullanılabilen bir makinede çalışan bir MetaTrader 5 terminalidir. Bu bilgisayar, Sanal Özel Sunucu (VPS) veya Özel Sunucu (DS) olabilir. Bir sunucuda MetaTrader 5, Twitter uygulamasıyla bir RESTful web hizmeti aracılığıyla iletişim kurar. Veri alışverişi formatı JSON'dur. Bu makalenin ikinci bölümünde, bu metinde daha sonra tanımlayacağımız iletişim protokolüne göre web servisini kullanan MQL5 katmanını konuşlandıracağız.

1.2. Twitter uygulaması

Girişte de söylediğimiz gibi bu yazının ilk bölümünde SDSS'nin Twitter uygulamasını geliştiriyoruz. Bu, temel olarak MetaTrader 5 terminalinden sinyal alan, bunları bir MySQL veritabanında saklayan ve ardından tweet'leyen bir PHP web uygulamasıdır. Bununla birlikte, bu uygulama, insan yeteneklerinin çözülmesini gerektiren birçok sorunu çözmek için genişletilebilir.

Örneğin bilgi toplamak ve EA'nızın insan perspektifinden ne kadar güvenilir olduğunu görmek için insanlar tarafından filtrelenen "MetaTrader 5'ten alınan bir sunucuda" alınan sinyallerle bir web ontolojisi oluşturmak istersiniz. Belirli bir sinyalin (bir tweet) güvenilirliğini, onunla ilişkili retweetlerden ve favorilerden hesaplayabiliriz. Bu, elbette bu makalede ele alınamayacak bir fikirdir ve ancak teoride mümkündür. Bu sadece İnsan tabanlı hesaplama (HBC) paradigmasına dayanan pratik bir uygulamadır.

1.3. Twitter

Wikipedia'da dendiği gibi, Twitter, kullanıcıların 140 karakterlik tweet adı verilen metin mesajları göndermelerini ve okumalarını sağlayan ünlü çevrimiçi sosyal ağ ve mikroblog hizmetidir.



2. RESTful Web Hizmeti Spesifikasyonu

2.1. REST'e Genel Bakış

REST, SOAP ve XML-RPC bir web hizmeti oluşturmak için en çok kullanılan üç mimari formasyondur. Çoğu modern Web 2.0 uygulaması hizmetlerini geliştirmek için bu formasyonu kullandığından, SDSS'lerimizi de REST'te kodlayacağız. Twitter REST API adlı belgeyi okuyarak bu konu hakkında daha fazla bilgi edinmenizi tavsiye ederim. Kısaca REST, veri alışverişi formatı olarak JSON veya XML ile HTTP çağrılarının değişimidir.

SOAP ve XML-RPC'den farklı olarak, REST'in uygulanması çok kolaydır ve aynı zamanda en hızlısıdır. Bu en basitidir çünkü XML-RPC ve SOAP içindekiyle aynı anlamda bir protokol spesifikasyonu yoktur. Bu, geliştiricinin web hizmetini dağıtmak için herhangi bir XML sözde dilini öğrenmesi gerekmediği anlamına gelir. Öte yandan, REST, istemci ve sunucu arasındaki veri alışverişi formatı olarak JSON'u kullanabilir ve bu da daha hızlı yanıt vermeyi sağlar. Gerçekten de, JSON'da temsil edilen herhangi bir nesne, XML'de temsil edilenden her zaman daha az bayt yer tutar. Bunun nedeni, JSON'un daha semantik olması veya başka bir deyişle, JSON'un bilgileri temsil etmek için XML'den daha az sözdizimsel öğeye sahip olmasıdır.

2.2. SDSS API Referansı

Twitter REST API başlıklı belgeyi zaten okudunuz mu? Şimdi tüm bunlarla birlikte, Twitter'ın API spesifikasyonu, SDSS API'mizi oluştururken bazı fikirlerin alınmasına ve uygulanmasına hizmet edebilir. İşleri çok basit hale getirdiğimizi hatırlayın, çünkü bu makalenin amacı, bir teknoloji girişimi tarafından dağıtılabilecek SDSS'yi tam olarak geliştirmek değil, MetaTrader 5 terminalinizi harici bir web hizmetine bağlayabileceğiniz gerçek hayatta pratik bir uygulama göstermektir. Buna göre, bu bölümde HTTP fiili POST'u kullanan tek bir REST yöntemiyle son derece basit bir API tasarlıyoruz. Bu, belirli bir EA'nın ticaret sinyalini almak, veritabanına kaydetmek ve tweetlemek içindir.

2.2.1. Genel

API, http://api.sdss-your-startup.com adresinde barındırılmalı ve HTTP veya HTTPS aracılığıyla erişilmelidir. POST istekleri için parametreler POST gövdesinde JSON formatında gönderilir.

2.2.2. REST kaynakları

 Kaynak URLAçıklama
POST sinyali/eklehttp://api.sdss-your-startup.com /signal/addTwitter uygulamasına bir EA sinyali gönderir. Bu, SDSS'nin alım satım sinyalini depolaması ve tweetlemesi için MetaTrader 5 terminali tarafından gerçekleştirilen istektir.

Giriş bölümünde belirtildiği gibi bu makale sosyaldir, bu nedenle Sosyal Karar Destek Sisteminizde uygulamak isteyeceğiniz REST yöntemlerini burada listelemenizi tavsiye ederim. Yorumlarınızı yapmaktan ve MQL5 topluluğuyla paylaşmaktan çekinmeyin.

2.2.3. POST sinyali/ekle

 ParametreAçıklama
ea_id

Yeni sinyali gönderen EA'nın kimliği. Örnek değer: 12345

sembol

Bu işlemde yer alan sembol. Örnek değer: EURUSD

operasyon

Yapılacak işlem. Örnek değer: AL veya SAT

değer

İşlem anındaki sembol değeri. Örnek değer: 1.3214

Örnek istek:

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

Bu örnek göz önüne alındığında, dikkat edilmesi gereken iki önemli nokta vardır. Bir yandan, şimdilik Twitter uygulamasına sinyal gönderen yalnızca bir MetaTrader 5 terminali olduğunu varsayalım. Bu nedenle terminal kimliğine gerek yoktur. Daha sonra sistemi genişletmeye ve girişimimizi daha da geliştirmeye karar verirsek muhtemelen Twitter uygulamasıyla birden fazla terminali bağlamak isteyeceğiz.

Bu durumda MetaTrader 5 terminalini tanımlamak için mt5_id adında bir alan eklerdik. Öte yandan, yukarıdaki çağrının SSL, belirteç tabanlı kimlik doğrulama veya OAuth) üzerinden bazı kimlik doğrulama mekanizmaları (Basic HTTP Authentication ile güvence altına alınması gerektiğini unutmayın. Bununla birlikte bu kısmı atlıyoruz, fkat bu konuya değinmeyi unutmayın. Lütfen MetaTrader 5 terminali ile Twitter uygulaması arasında bir kimlik doğrulama mekanizması olmadan, iletişim protokolünü bilen herkesin Şekil 1'deki Twitter uygulamasına alım satım sinyalleri gönderebileceğini unutmayın. SDSS Mimarisi.


3. Web Uygulamasının Veritabanı Tasarımı

REST API spesifikasyonu, sistemin nasıl çalıştığını görmemize yardımcı oldu, bu nedenle artık veritabanı tasarımını anlayabiliyoruz:

# 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 Hizmetini Programlama

Kendi geliştiricilerinin sözleriyle, Slim, basit ama güçlü web uygulamaları ve API'lerini hızlı bir şekilde yazmanıza yardımcı olan bir PHP mikro çerçevesidir. Evet, doğru tahmin ettiniz! RESTful API'mizi Slim üzerinde çok az kod satırı ile yazacağız. Öğrenme nedenleri ve basitliği nedeniyle yalnızca bir HTTP POST yöntemini kodladığımızı unutmayın. Lütfen nasıl çalıştığını ayrıntılı olarak öğrenmek için Slim'in resmi belgelerini okuyun.

Şekil 2. Slim tabanlı PHP API'sinin dizin yapısı

Şekil 2. Slim tabanlı PHP API'sinin dizin yapısı

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

Tüm bunlarla web hizmetini yerel geliştirme makinemizde test edebiliriz. Bu arada, (1) Windows'unuzun api.laplacianlab.local yerel alan adını çözmesi için hosts dosyanıza yeni bir giriş eklemeyi ve (2) Apache'niz için yeni bir sanal ana bilgisayar oluşturmayı unutmayın.

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>
Şimdi ilk REST kaynağımızı, RESTful web hizmetlerinde hata ayıklamak için bir Firefox tamamlayıcısı olan RESTClient ile test ediyoruz. Her şey yolunda giderse web hizmetinin yukarıda Slim yönteminde kodladığımız mantığı çalıştırması ve bir JSON yanıtıyla birlikte bir HTTP 200 sonucu geri göndermesi gerekir.


Şekil 3. http://api.laplacianlab.local'a bir POST sinyali/ekleme isteği gönderme

Şekil 3. http://api.laplacianlab.local adresine POST sinyali/ekle talebi gönderme

Yukarıdaki POST sinyali/ekle talebi için HTTP yanıt başlığı şudur:

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

Ayrıca bu HTTP yanıt gövdesidir:

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

Bunu anladık! Sosyal Karar Destek Sistemimizin aşağıdaki şekle karşılık gelen kısmını henüz uygulamaya geçirdik. Ancak unutmayın!, bu tür çağrıları gerçek bir senaryoda korumak için bir kimlik doğrulama katmanı olmalıdır.

Şekil 6. MetaTrader 5 ve Twitter uygulaması, RESTful bir web servisi aracılığıyla birbirleriyle konuşuyor

Şekil 4. MetaTrader 5 ve Twitter uygulaması, RESTful bir web hizmeti aracılığıyla birbirleriyle konuşuyor


5. Web Uygulamasının Twitter ile Entegrasyonu

Şimdi, Slim PHP Twitter uygulamasından Twitter'a alım satım sinyallerini tweetleyen ağ diyagramının bu kısmıyla ilgilenelim.

Şekil 5. Twitter uygulamasından Twitter'a alım satım sinyallerini tweetleme

Şekil 5. Twitter uygulamasından Twitter'a alım satım sinyallerini tweetleme

Sıradaki nedir? Bir kez daha doğru tahmin ettiniz! Öncelikle bir Twitter uygulamasına ihtiyacınız var. Bu yüzden lütfen Twitter Developers'a gidin, Twitter hesabınızla oturum açın (bir Twitter uygulaması oluşturabilmeniz için önce bir Twitter hesabınızın olması gerekir), "Uygulamalarım"a gidin ve "Yeni Uygulama Oluştur"a tıklayın.


Şekil 6. Twitter Geliştiricilerinde Yeni Bir Uygulama Oluşturun

Şekil 6. Twitter Geliştiricilerinde Yeni Bir Uygulama Oluşturun

Yeni uygulamanızın ayrıntılarını doldurmanız ve Yolun Geliştirici Kurallarını kabul etmeniz gerekir. Örneğin yeni başvurumun detayları aşağıdaki gibidir:

Ad: Laplacianlab'ın SDSS'si

Açıklama: Sosyal Karar Destek Sistemi

Web sitesi: http://api.laplacianlab.local

Geri Arama URL'si: http://api.laplacianlab.local/twitter/oauth_callback

Lütfen şimdi "İzinler" adlı sekmeye gidin ve izinleri "Okuma ve Yazma" olarak güncelleyin. Son olarak, Twitter uygulamanızı oluşturduktan sonra, config\config.php dosyanızda sabitler olarak kullanabilmeniz için API anahtarınızı, API sırrınızı ve Oauth geri aramanızı not edin:

// Twitter OAuth

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

Bu noktada Slim PHP mikro web uygulamasını Laplacianlab'ın SDSS'si (yukarıda oluşturduğumuz Twitter uygulaması) ile iletişim kuruyoruz. Bunu yapmak için OAuth 2.0 protokolünün temellerini bilmeniz gerekir, bu nedenle lütfen resmi belgeleri okuma fırsatını kaçırmayın. OAuth akış diyagramına aşina olmalısınız.

Şekil 7. OAuth Akış Diyagramı

Şekil 7. OAuth Akış Diyagramı

Sonuç olarak bu diyagrama göre, şimdi kaynak sahiplerini (alım satım sinyallerini tweetlemek isteyen twitter'cılar) saklamak için aşağıdaki MySQL tablosunu oluşturmalıyız:

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;

Özellikle, Twitter'ın OAuth API'si ile çalışmak için bir PHP kitaplığı olan TwitterOAuth kullanıyoruz. Slim'i Composer aracılığıyla bir önceki bölümde eklediğim besteci.json dosyasını kullanarak yüklediyseniz bu kitaplığı yükleme konusunda endişelenmenize gerek yoktur çünkü TwitterOAuth zaten PHP uygulamanızın satıcı klasörüne kopyalanacaktır.

Aksi takdirde, bu PHP bileşenini her zaman GitHub'dan indirebilirsiniz. OAuth akışı göz önüne alındığında, tweeter'ların Laplacianlab'ın SDSS'sine ve oauth geri çağrısına izinleri uygulamak için yalnızca yöntemi programlamamız gerekiyor. Şimdilik SDSS'miz o kadar basit ki her şeyi index.php dosyasına yazabiliyoruz.

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

 

Buradaki en önemli şey, SDSS'nin erişim izinlerini sağlayan kullanıcılar adına Twitter'a kimliği doğrulanmış aramalar yapmasına izin veren iki veri parçasını veritabanında depolamaktır. Bu iki parça, kullanıcılar tarafından iptal edilene kadar kalıcı olan erişim belirteci ve erişim belirteci sırrıdır. Böylece Sosyal Karar Destek Sistemi, kullanıcı kimlik bilgilerini hiçbir zaman saklamamakta, diğer yandan kullanıcılar erişim izinlerini istedikleri zaman iptal yoluyla kaldırabilmektedir.

PHP tabanlı SDSS, doğru erişim belirtecine ve erişim belirteci sırrına sahip olsa da, aşağıdaki gibi Twitter aramaları gerçekleştirebilir:

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

Gerekli tüm malzemelere sahibiz. SDSS API'sinin 4'te kodlamaya başladığımız kaynak POST sinyali/ekle işlevini tamamlamak artık çok kolay. PHP RESTful Web Hizmetini programlamak, böylece bazı örnek verileri tweetlemek için gerekli PHP kodunu eklemeniz size bir alıştırma olarak bırakılmıştır.


Sonuç

Bu makale, EA'larınızın alım satım sinyallerini tweetleyebilmeniz için bir MetaTrader 5 terminalini Twitter'a nasıl bağlayacağınızı gösterdi. Robotların işlem gücü ile bireylerin bilişsel yeteneklerini birleştiren bilgisayar destekli bir sistem geliştirdik. İnsanların aksi otomatik Expert Advisor tarafından piyasaya arz edilecek robotik alım satım sinyallerini doğrulamasını istiyorum. Böylece, insanlar alım satım sinyallerini retweetlediğinde veya favladığında otomatik alım satım sistemleri hakkında bilgi edinmek olan yeni ve heyecan verici bir konuya kapı açtık. Bu İnsan tabanlı hesaplama (HBC) paradigmasına dayanan pratik bir uygulamadır.

Eksiksiz bir Sosyal Karar Destek Sistemi kurmak zaman alır, bu nedenle bu alıştırma, bir teknoloji başlangıcı oluşturma fikri olarak görülebilir. Üç ana bölümden oluşan bir SDSS geliştirmeye başladık:

  1. VPS veya DS üzerinde çalışan MetaTrader 5 terminali;
  2. Slim tabanlı PHP Twitter web uygulaması;
  3. Twitter;

Spesifik olarak, bu ilk bölümde MetaTrader 5'i Slim PHP web uygulamasıyla iletişim kuran RESTful web hizmetinin mimarisini uyguladık ve ayrıca PHP web uygulamasını OAuth protokolü aracılığıyla Twitter ile bağladık. Bir sonraki bölümde, MQL5-RPC makalesinde açıklandığı gibi bir MQL5-RESTful çerçevesi kodlayacağız. MQL5'ten Uzaktan Prosedür Çağrıları: Eğlence ve Kar için Web Hizmeti Erişimi ve XML-RPC ATC Analizör.


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/925

Ekli dosyalar |
database.txt (1.33 KB)
laplacianlab.zip (467.5 KB)
MQL5'ten (MQL4) MySQL Veritabanına Nasıl Erişilir MQL5'ten (MQL4) MySQL Veritabanına Nasıl Erişilir
Makale, MQL ve MySQL veritabanı arasında bir arayüzün geliştirilmesini açıklar. Mevcut pratik çözümleri tartışır ve veritabanlarıyla çalışmak için bir kitaplık uygulamanın daha uygun bir yolunu sunar. Makale, MySQL ile çalışmanın işlevleri, arayüz yapısı, örnekleri ve bazı belirli özelliklerinin ayrıntılı bir açıklamasını içerir. Yazılım çözümlerine gelince, makale ekleri, MQL4 ve MQL5 dilleri için dinamik kitaplıkların dosyalarını, dokümantasyonu ve script dosyası örneklerini içerir.
Alım Satım Robotlarının Hikayeleri: Daha Az mı Daha Fazla mı? Alım Satım Robotlarının Hikayeleri: Daha Az mı Daha Fazla mı?
İki yıl önce "Son Haçlı Seferi"nde piyasa bilgilerini görüntülemek için oldukça ilginç ancak şu anda yaygın olarak kullanılmayan bir yöntem olan nokta ve şekil grafiklerini inceledik. Şimdi nokta ve şekil grafiğinde tespit edilen formasyonlara göre bir alım satım robotu yazmaya çalışmanızı öneririm.
MQL5 Sihirbazı: Hesaplanan Fiyatlardan Talimatlar, Zarar Durdur ve Kar Al uygulama. Standart Kitaplık Uzantısı MQL5 Sihirbazı: Hesaplanan Fiyatlardan Talimatlar, Zarar Durdur ve Kar Al uygulama. Standart Kitaplık Uzantısı
Bu makale, MQL5 Sihirbazını kullanarak Expert Advisor'lar oluşturmanıza, talimat vermenize, Zarar Durdurmanıza ve dahil edilen modüllerden alınan fiyatlara göre Kar Almanıza olanak tanıyan MQL5 Standart Kitaplık uzantısını açıklar. Bu yaklaşım, modül sayısı üzerinde herhangi bir ek kısıtlama uygulamamakta ve ortak çalışmalarında çakışmalara neden olmamaktadır.
Üç Satır Kesme Grafiği Oluşturma Göstergesi Üç Satır Kesme Grafiği Oluşturma Göstergesi
Bu makale Steve Nison'ın "Candlesticks Ötesinde" adlı kitabında önerilen Üç Satır Arası tablosuna ayrılmıştır. Bu grafiğin en büyük avantajı, bir önceki harekete göre bir fiyattaki küçük dalgalanmaları filtrelemeye izin vermesidir. Grafik oluşturma ilkesini, gösterge kodunu ve buna dayalı bazı alım satım stratejileri örneklerini tartışacağız.