MT5自動売買ソフトの作成2 DLLを作る

初めてプログラミングをする人や経験の少ない人は「DLLって難しいのでは?」と思いますよね。少しだけ不便なことはありますが、難しいことはありません。

基本的に自分でプログラムを作るといっても、ほとんどはライブラリを呼び出すだけです。

例えば、初めてのC言語ではこんな感じに

printf("Hello world\n");

書くのが定番です。"Hello world\n"という文字列を「printf」という、ライブラリ関数を呼び出して画面に表示しています。

DLLとは「ダイナミックリンクライブラリ」、動的にリンクするライブラリです。

「printf」というライブラリ関数を作る感じですね。

「動的にリンク」とはプログラム実行にメモリにロードして呼び出される仕組みです。

少し手伝う程度の手間でWindowsが勝手にやることなので気にしなくても大丈夫です。

VS 2022でプロジェクトを作成する

VS 2022を立ち上げましょう。

まず「新しいプロジェクトの作成」を選びます。

C++ / Windows / ライブラリ」を右上で選択します。

「ダイナミックリンクライブラリ(DLL)」を選んで「次へ」をクリックします。

プロジェクト名は「 Dll_text」にします。

「作成」をクリックするとプロジェクトが作成されます。

DLLのプログラム

今回のプログラムは単純移動平均を作ってみます。

まずはチャートに表示されるインジケータを作ってみましょう。

// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) void dllSmaArray(const int size, const int period, double* close, double* out)
{
    for (int i=0; i <= size - period; i++) {
        double  total = 0.0;
        for (int n = 0; n < period; n++) {
            total += close[i+n];
        }
        out[i+period-1] = total / period;
    }
}

C++というより、ほとんどC言語ですが、少し解説します。

プロジェクトを作成すると、DllMainまでは自動で生成されています。

初めに「extern "C" __declspec(dllexport)」とは、これがDLLライブラリだよ、呼び出せるよ、という「おまじない」です。定型なので覚える必要もありません。(コピペで十分)

「dllSmaArray」が今回作成したプログラムですね。SMA=単純な平均を移動しながら計算するので「単純移動平均」です。

(次回にデータの受け渡しについて調べますので、今回はさっくりと説明します)

下図をプログラミングしたのが dllSmaArray関数です。MQL5から渡されるclose(終値)のデータを1つずつずらして、period(期間)分合計しperiodで割って平均値を算出していきます。

「dllSmaArray」を作成したら CTRL+Shift+B でビルドします。

次はMQL5でMT5のインジケータを作って「dllSmaArray」を呼び出します。

MetaEditorでインジケータ作成

MT5のインジケータをMetaQuotes言語エディタ(MetaEditor)で作成します。

MT5の「ツール」→「MetaQuotes言語エディタ」で立ち上げます。

「ファイル」→「新しいファイル」でカスタムインジケータを選択し、次へ進みます。

名前に「Dll_test.mq5」を追加します。

今回はパラメータなどは追加しませんので、次へ進みます。

「OnCliculate(...open,high,low,close)」を選択して次に進みます。

プロットに「chart」を追加して「完了」すると、スケルトンが生成されます。

VSCodeでインジケータの編集とMT5で実行

VSCodeでMQL5のディレクトリ("C:\Users\[ユーザ名]\AppData\Roaming\MetaQuotes\Terminal\[シリアル番号のような英数字]\MQL5)を開きます。

VSCodeエクスプローラーで「Dll_test.mq5」を開き下記のように変更します。

//+------------------------------------------------------------------+
//|                                                     Dll_test.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

#property indicator_label1  "dll_test"
#property indicator_type1    DRAW_LINE
#property indicator_color1  Orange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         chartBuffer[];

#import  "D:\\Projects\\Dll_test\\x64\\Debug\\Dll_test.dll"
      void dllSmaArray(const int size, const int period, const double& close[], double& out[]);
#import  

#define barCount    10000

double  closeBuffer[barCount+1];
double  smaBuffer[barCount+1];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, chartBuffer, INDICATOR_DATA);
    ArraySetAsSeries(chartBuffer, true);
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
    ArraySetAsSeries(close, true);

    int size = rates_total - prev_calculated;
    size = (size > barCount) ? barCount : size;
    ArrayCopy(closeBuffer, close, 0, 0, size);

    dllSmaArray(size, 200, closeBuffer, smaBuffer);
    ArrayCopy(chartBuffer, smaBuffer, 0, 0, size);
//--- return value of prev_calculated for next call
    return(rates_total);
  }
//+------------------------------------------------------------------+

DLLを使うときに必要なのは、DLLのインポート文です。

「"D:\Projects\Dll_test\x64\Debug\Dll_test.dll"」はVSで作成したDLLのフルパスにしてください。

#import  "D:\\Projects\\Dll_test\\x64\\Debug\\Dll_test.dll"
      void dllSmaArray(const int size, const int period, const double& close[], double& out[]);
#import  

そして次回詳しく解説しますが、DLLとの受け渡しバッファです。

#define   barCount    10000

double  closeBuffer[barCount+1];
double  smaBuffer[barCount+1];

チャートを表示するためのバッファは、DLLとの受け渡しバッファからコピーするので下準備をします。

int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, chartBuffer, INDICATOR_DATA);
    ArraySetAsSeries(chartBuffer, true);
//---

そしてチャートを表示する関数OnCalculateでは、DLLを呼び出します。

「dllSmaArray」の呼び出しは、(サイズ、期間、Close、SMA)です。期間はSMAの合計期間です。

今回は 200期間にしています。

  ArraySetAsSeries(close, true);

    int size = rates_total - prev_calculated;
    size = (size > barCount) ? barCount : size;
    ArrayCopy(closeBuffer, close, 0, 0, size);

    dllSmaArray(size, 200, closeBuffer, smaBuffer);
    ArrayCopy(chartBuffer, smaBuffer, 0, 0, size);

OnCalculateの解説

sizeは処理していないデータの数とbarCountの少ない方を計算しています。計算しなければいけない処理数ですね。

barCountを指定しない場合はsize = (size > barCount) ? barCount : size;が無くなります。

Dll_test.mq5の編集が終わったらビルドしましょう。

左から2番目の矢印アイコン(Compile MQL file)をクリックするとMQL5がビルドされて「ex5」ファイルが生成されます。

完成した「Dll_test」はMT5の指標を更新すると表示されます。

「Dll_test」をチャートにドラッグドロップすると、DLLの使用を許可するダイアログが表示されますので「OK」ボタンを押すと、SMAがチャートに表示されます。

どうでしょう、表示されましたか?簡単だったでしょうか、難しかったでしょうか?

環境の構築と作り方を覚えてしまえば後は作るだけです。ここまでの作業は繰り返しすることですので自然と覚えてしまうでしょう。

今回のプログラムでは、ArraySetAsSeries、ArrayCopyという関数を使用しています。

次回はこの関数を含めて、MQL5とC++のデータ受け渡しがどうなっているのか見てみます。

次回

DLLに受け渡されるデータを見てみましょう。

MT5自動売買ソフトの作成1 準備編

はじめに

プログラミングを覚えたいので、どの言語が良いかと聞かれることがあります。

どの言語も覚えるのは大差ありません。プログラミングを覚えるための最大の壁は「何を作りたいのか」です。プログラミングが覚えたいという人は、まず作りたいものを探しましょう。「興味のないことを覚える」のはただの苦行です。

「作りたいものがある」だから「プログラミングを覚えたい」だから「XX言語を覚える」が王道です。

まずは作りたいものを探しましょう。わたしのおすすめは、MT5自動売買ソフトの作成です。

いろいろ理由はありますが、グラフィカルなプログラム(インジケータ)が本当に簡単に作れる、複数の言語を経験できる=言語の敷居が低くなる、プログラミングだけでなく、FX・株式の勉強にもなるし、経済の動きにも興味が出てくる(かもしれない)、一石三鳥以上のお得感!

MT5のソフトウェアはMQL5という言語を使いますが、MQL5というマイナーな言語ではモチベーションが上がりにくいと思いますし、Web上の情報が非常に少ないためストレスになります。

そこでC++でDLLを作成します。

C++でメインの処理を行うことで、より情報が得られ簡単に作成することが可能になります。 簡単に作れる=楽しいです。

最低限のMQL5の知識は必要ですが、MQL5は入り口だけを作成して本体の処理はC++で作成するDLLで行います。

MQL5はMT5でしか使えませんが、C++を覚えればいろいろなアプリケーションが作れ、C言語C#、どちらにも理解が早まります。これもお得感がありますよね。(Javaなど他の言語もC++を覚えれば何となく解ってきます)

C++で作成したDLLを使ったインジケータの例】

DLLで作成したインジケータ例

インストールが必要なソフトウェア

MetaTrader5 (MT5)

各FXブローカーがカスタマイズしたMT5をインストールします。

各FXブローカーのデモ口座を使用しますので、デモ口座がずっと使えるような優しいブローカーのMT5をインストールします。

具体的には、日本のブローカーはデモ口座を長くても数か月で閉じられます。もしくは本口座を作成しないと継続して使わせてもらえません。

(今のところ)ずっと使わせてくれる、海外の有名どころがおすすめです。XM、Titan FX、Axioryなどですね。

2か所作っておくと、後々役立ちます。1か所は開発用、1か所はテスト用です。

XMのMT4/MT5|XMTrading (エックスエム)

ダウンロード - Titan FXの各取引ツールを無料ダウンロード

https://www.axiory.com/jp/platforms/mt5

Visual Studio Code (VSCode)

万能テキストエディタです。まさに万能、なのに無料!

どんな言語 C, C++, C#, Python, Go, Rust, ........ MQL4, MQL5 の開発には欠かせません。

今回はMQL5ソフトウェアの開発に使用します。

Download Visual Studio Code - Mac, Linux, Windows

Visual Studio Community 2022 (VS)

Microsoft の開発ツールですね。

C#, C++, C, Python, F#, .... いろいろ開発できます。

購入しなくても使わせていただけます。個人利用ならば開発したアプリケーションを売ることさえ無料でできます。太っ腹!

今回はC++でのDLL開発に使用します。

Visual Studio 2022 コミュニティ エディション – 最新の無料バージョンをダウンロードする

※使い初めにMicrosoftアカウントを聞いてくるので、もしかしたらMicrosoftアカウントが必要かもしれません。

インストール

MT5

Titan FXを例にしますが、どのFXブローカーでも同様です。

ダウンロード - Titan FXの各取引ツールを無料ダウンロード

MetaTrader5のダウンロードをクリックします。

TitanFX MT5

インストーラは[次へ]で進みます。インストール後に「口座を開く」でTitanしか表示されていないので[次へ]を、「口座を開設する」の画面で「デモ口座を開いてリスクなしのバーチャルマネーで取引する」を選択して完了ボタンをクリックします。

TitanFX account demo

必要事項を入力してデータ保護ポリシーに同意をチェックして「次へ」でログイン情報が表示されます。

口座タイプは日本円-ブレード口座、デポジットは選択では10万円が最高なので100万円にしておきましょう。

ログイン情報は必ず控えてください!

TitanFX account

MQL5 communityにはMQL5サンプルソースや技術情報が盛りだくさんなので、登録しておくことをお勧めします。

MQL5: MetaTraderを使った自動FXトレーディング、ストラテジーテスターとカスタムインディケータ

ログインするとチャートの表示やトレードができるようになります。

全チャートを閉じて、まずはUSDJPYを全画面表示してみます。左の気配値表示のUSDJPYで右クリックして「チャートウィンドウ」を選択します。チャートの□で全画面表示しましょう。

TitanFX login

「ツール」「オプション」でオプション画面を開き、「エキスパートアドバイザ」タブの「DLLの使用を許可する」をチェックして有効にしましょう。

自動売買する場合には「アルゴリズム取引の許可」もチェックして有効にします。

option DLL

MQL5 communityに登録していたら、ログインIDを登録しておきます。

以上でMT5のインストールは完了です。

VSCode

Download Visual Studio Code - Mac, Linux, Windows

ダウンロードはWindows10/11であれば「x64」をインストールしましょう。

インストールすると英語になっていますので、まず日本語にします。

code japanese

インストール済みの画面ですみません。

拡張機能(□が四つ)のアイコンを選択して、「Search Extensions in Marketplace」テキストボックスに「japanese」と入力すると、「japanese Language Pack for Visual Studio Code」という拡張機能が表示され右下に「Install」と表示されているはずです。

「Install」をクリックしてインストールしてください。

Restartしてねというダイアログが表示されますので再起動します。再起動したら日本語になっています。

次にMQL5の拡張機能をインストールします。片っ端から入れていますが、重要なのは「MQL Tools」です。他構文ハイライト系を幾つかがあると良いと思います。

code MQL

VSCodeは、使いたい言語用の拡張機能をインストールすると構文ハイライトや、ビルド・デバッグもできるようになる万能エディタです。

例えばArduinoとか、Jupyter Notebookとか、純正の環境を使うよりも便利になります。

VS

Visual Studio 2022 コミュニティ エディション – 最新の無料バージョンをダウンロードする

インストールするワークロードは「C++によるデスクトップ開発」は必ず選択してください。

Vs2022

ワークロードには魅力的な開発内容が書いてありますが、開発するには「覚える」ことが必須です。そしてインストールすると少なくないSSD/HDD容量が消費されてしまいます。

後からも追加できますので、直近使ってみたい項目を選んでインストールしましょう。

次回

次回はMQL5からC++で作成したDLLを呼び出します。