FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

Xvfbでヘッドレス MT4環境を構築

Xvfb (X virtual framebuffer) は X11の仮想ディスプレイを作るソフトウェアです。これを使うとMT4のように画面が必要なソフトをGUIなしで起動することが可能です。

【参考リンク】 http://www.tsukune.org/skk/memo/index.php?Xvfb 

この前の isokinetic チャートを検証するには、ヒストリカルデータやチャートソフトも自前で用意した方がよさそうだと思い至り、とりあえずMT4のTickをZMQ経由で扱いPythonなどの言語に流すような方向で環境を作ることにしました。

MT4のTerminal.exe を Wineで動かすと結構 CPU負荷が高かったので、負荷を軽減する方法について調べていると以下のロシア語の記事に行き当たりました。

起動スクリプトもあってなかなかよさげです。

Trader向けの安価なVPS

今はWINNERvpsというWindows 向けのVPSを借りているのですが、Linux用のプランも一応あったので、選択できるOSを一通り試した結果「Debian7.8 Wheezy 64bit」を選択しました。(Debian8やUbuntu16はない)

 初期設定

最初にパッケージリストとシステムの更新を行い、FWとMT4起動用のユーザーの作成を行ないます。

apt-get update
sudo apt-get upgrade
sudo apt-get install ufw
sudo ufw default DENY
sudo ufw allow from x.x.x.x to any proto tcp port 22
sudo ufw allow from x.x.x.x to any proto tcp port 5900
sudo ufw enable
sudo adduser mt4

続いてLxde、Xvfb、x11vncをインストールします。LxdeはMT4のセットアップ作業に使用します。

sudo apt-get install lxde
sudo apt-get install xvfb x11vnc x11-xkb-utils x11-apps
sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic

Wine2.01のインストール

WheezyのリポジトリにあるWineは古かったので本家から最新版を入手します。

sudo dpkg --add-architecture i386
wget -nc https://dl.winehq.org/wine-builds/Release.key
sudo apt-key add Release.key

ここで /etc/apt/sources.listに 以下の行を追記
「deb https://dl.winehq.org/wine-builds/debian/ wheezy main」
sudo apt-get update
sudo apt-get install --install-recommends winehq-stable

https://wiki.winehq.org/Debian の説明だとリポジトリに「oldstable main」 も含める必要があるとされているのですが他のパッケージと競合するので外しました。

x11vncの起動スクリプト

x11vncを起動スクリプトを作成します。

▼/etc/init.d/x11vnc の内容

#! /bin/sh
### BEGIN INIT INFO
# Provides:          X11VNC
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: X11VNC init script
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

USER=mt4
X11_VNC=/usr/bin/x11vnc
X11_VNC_ARGS=" -ncache 10 -rfbport 5900 -display :1 -forever "
PIDFILE=/var/run/x11vnc.pid



. /lib/lsb/init-functions

case "$1" in
  start)
    log_daemon_msg "Starting" "X11 VNC server"
    start-stop-daemon --start --user $USER --chuid $USER --pidfile $PIDFILE --make-pidfile --background --exec $X11_VNC -- $X11_VNC_ARGS
    log_end_msg 0
    ;;
  stop)
    log_daemon_msg "Stopping" "X11 VNC server"
    start-stop-daemon --stop -u $USER --quiet --pidfile $PIDFILE
    log_end_msg 0
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)

  echo "Usage: /etc/init.d/x11vnc {start|stop|restart}"
  exit 1
esac
exit 0

MT4のインストール

【事前準備】 WinSSHなどで mt4 ユーザーに接続し、ホームディレクトリ直下に MT4のインストーラをアップします。

mt4ユーザーになり、LXDEを起動します。

sudo su - mt4
export WINEARCH=win32
export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x24 &
openbox &

先ほど作ったスクリプトで x11vnc を起動します。

sudo +x /etc/init.d/x11vnc
sudo /etc/init.d/x11vnc start

クライアントからUltraVNCで接続すると真っ暗な画面が表示されますが、右クリックからファイルマネージャーのPCManFMを起動できます。

f:id:fxborg:20170703124514p:plain

さらに、ファイルマネージャを立ち上げるとセットアップファイルが入っているので起動します。

f:id:fxborg:20170704011649p:plain

そして、セットアップを起動するとMonoパッケージとGekkoパッケージを促されるのでそのまま進めるとMT4のセットアップが始まります。

f:id:fxborg:20170703130318p:plain

英語版ですが、通常通りセットアップを進めます。これでMT4が起動されました。

f:id:fxborg:20170703130149p:plain

最後にmt4を自動起動するスクリプトを作ります。

▼/etc/init.d/mt4の内容

#! /bin/sh
### BEGIN INIT INFO
# Provides:          metatrader
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: MetaTrader init script
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

export WINEDEBUG=-all
export DISPLAY=:1
export WINEARCH=win32
USER="mt4"
NAME=$USER
TERMINAL="/usr/bin/wine /home/$USER/.wine/drive_c/metatrader/terminal.exe"
SCRIPTNAME=/etc/init.d/$NAME
XVFB=/usr/bin/Xvfb
XVFB_ARGS="$DISPLAY -screen 0 1360x768x16 -nolisten tcp"
XVFB_PIDFILE=/var/run/xvfb.$NAME.pid

[ -x "$XVFB" ] || exit 0

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
        log_daemon_msg "Starting" "XVFB"

        start-stop-daemon --start --quiet \
            --make-pidfile --chuid $USER \
            --pidfile $XVFB_PIDFILE --exec $XVFB -- \
            $XVFB_ARGS > /dev/null 2>&1 &
        log_end_msg 0

        log_daemon_msg "Starting" "MetaTrader"
        start-stop-daemon --start --quiet \
                        --chuid $USER  --exec $TERMINAL > /dev/null 2>&1 &
        log_end_msg 0
}


do_stop()
{
        log_daemon_msg "Stoping" "MetaTrader"
        start-stop-daemon --stop --retry 5 --quiet \
            --pidfile $XVFB_PIDFILE --name Xvfb
        rm $XVFB_PIDFILE > /dev/null 2>&1 &
        log_end_msg 0
}
case "$1" in
  start)
        do_start
        ;;
  stop)
        do_stop
        ;;
  restart)
        do_stop
        do_start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac
exit 0

使い方

 以下のコマンドで起動します。

sudo /etc/init.d/mt4 start
sudo /etc/init.d/x11vnc start

 以下のコマンドで停止します。

sudo /etc/init.d/mt4 stop
sudo /etc/init.d/x11vnc stop

最後に

Xvfbを使用してデスクトップを介せずにWineを起動してみました。とりあえず動いているのですが CPUの使用量はあまり変わらない印象です。もうすこし様子を見ながら調整してみようと思います。(cgroupsで制限してみるかな・・・)