MT4를 Linux에서 실행하기 [Debian9, MT4DLL]

개요



MT4를 WindowsVPS 스타일로 리눅스로 움직였습니다.
드디어 DLL의 동작 확인이라고 했습니다.

우선 코드



htps : // 기주 b. 코 m/쟈코 b327/ぃぬ xMT4

개요 · 동기 같은



별도로 특별한 일은 없습니다. Windows에서 움직일 수 있는 것이 리눅스에서 움직이지 않는 이유가 없기 때문에 움직일 수 있도록 한 비망록입니다.
다만, MT4라고 하는 2005년 릴리스의 소프트가 아직도 사용되고 있고(MT5가 상당히 릴리스되었음에도 불구하고!), 아직도 요구도 있는 것 같기 때문에, 일단 움직이는 것의 히나타타를 만들었습니다.

※서버는 메모리 2GB 이상 권장합니다. 0.6GB로 실험하면 apt install조차 할 수 없게 되었습니다.
덧붙여서 MT4 1대당 메모리 상한은 2GB입니다.

코드



mql4



5초마다 TestMessage를 DLL에 전달하고 DLL에서 ::from DLL를 추가하여 반환하도록 하는 프로그램입니다.

TestAlert.mq4
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#import "MT4DllTester.dll"
    string TestFunction(string);
#import

int OnInit() {
    EventSetTimer(5);
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {
    EventKillTimer();
}

int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) {
    return(rates_total);
}

void OnTimer() {
    Alert(TestFunction("TestMessage "));
}

DLL



MT4의 string은 WCHAR* 형으로 건네주지 않으면 잘 해석해 주지 않기 때문에 WCHAR* 로 하고 있습니다.
다만, 이번 프로그램은 랜덤으로 문자 깨짐이 발생합니다. 이것은 메모리 운명의 이야기일 것입니다만, 이번은 할애합니다. 캐릭터 라인을 정확하게 건네주고 싶은 경우는 솔직하게 char 가 좋을지도 모릅니다.
이 근처의 사정은 포럼

MT4DllTester.cpp
#include "pch.h"
#include "MT4DllTester.h"
#include <codecvt>

MT4_EXPFUNC const WCHAR* __stdcall TestFunction(WCHAR* input)
{
        std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv;

        std::wstring w_inp(input);
        std::string s_out = cv.to_bytes(w_inp);

        s_out.append("::from DLL");

        std::wstring w_out = cv.from_bytes(s_out);

        const WCHAR* ret = w_out.c_str();
        return ret;
}

내보낼 함수를 알려줍니다.

Source.def
LIBRARY MT4DllTest
EXPORTS
        TestFunction

VSC++에서 처음부터 프로젝트를 만들려면 x86 , release 모드로 전환하는 것을 잊지 마십시오.
ref) htps //w w. mql5. 코m/엔/후우루m/96970

(※C++는 잘 모르기 때문에 코드 이상이라면 가르쳐 주세요(´・ω・`))

서버측



debian 9(CUI만)를 설치한 단계를 전제로 합니다.

MT4를 움직이기 위한 wine와 xfce4(데스크탑 환경·xfce는 가벼운 것 같기 때문에),
원격으로 연결하기 위해 vnc 주변을 설치합니다.
root로 실행

init.sh
#!/usr/bin/env bash

dpkg --add-architecture i386 &&\
apt install -y software-properties-common apt-transport-https &&\
wget -qO - https://dl.winehq.org/wine-builds/winehq.key|apt-key add - &&\
apt-add-repository https://dl.winehq.org/wine-builds/debian/ &&\
apt update &&\
apt install -y --install-recommends winehq-stable winbind &&\
DEBIAN_FRONTEND=noninteractive apt install -y keyboard-configuration &&\
#apt install -y task-xfce-desktop &&\
apt install -y xfce4 xfce4-goodies gnome-icon-theme &&\
apt install tightvncserver &&\
echo '[ALL DONE]

설치가 끝나면 다음 명령으로 vnc 서버가 시작됩니다.
여러가지 듣기 때문에 패스워드등을 설정합시다.

start.sh
vncserver :1 -geometry 800x600 -depth 24

멈출 때는 이쪽입니다.

stop.sh
vncserver -kill :1

클라이언트측



VNC 클라이언트로 연결합니다.
krdc라면{ユーザ名}@{IP_OR_HOST名}:{ポート名}입니다.
예) [email protected]:5901 (5901: VNC의 기본 포트)

이런 느낌





※ 오른쪽 절반은 dstat의 출력입니다. 메모리 1.7GB의 서버로 이 정도였습니다.

확인한 것


  • DLL을 읽을 수 있습니다
  • VNC 연결을 끊어도 계속 작동합니다
  • VNC 서버를 떨어 뜨리면 함께 떨어집니다.

    상용 이용시 신경이 쓰이는 것


  • wine (친숙한) 대량의 warning
  • localhost에서 DB에 연결할 수 있습니까
  • localhost에서 WebSocket 통신 할 수 있습니까
  • 좋은 웹페이지 즐겨찾기