MT5でC#が使える・・・だと?
先日ツイッターでこんなツイートを見かけました。
MQL5はC♯使えるのいいな
— Archon (@fxxx_yuki) January 30, 2021
んんん?MQL5はMQL5でしょ?C#つかえるの?とおもいながらちょろっと調べたら・・・
https://www.mql5.com/ja/articles/5563
確かに2018年10月以降C#で作成されたDLLが簡単に使えるようになってるみたいです。
もちろん今までもMT4でも他言語で作られたDLLは使用可能でしたが、やりとりのため型に気を使ったり、そのための宣言しないといけなかったりなにかと面倒だったんですよね。
それが今回の(2年以上前ですけど)アップデートではC#のDLLがimport一つで簡単に使えるようになってるじゃないですか。全然知りませんでした。これは試さないわけにはいかないな、と。
ちなみに上記リンク先はMT5から(すでに作成済みのDLLを利用して)C#のフォームを利用するサンプルみたいです。どちらかというとVSのフォーム作成機能でMT5用のGUIを作りたいけどC#はあんまり書きたくないという人向けかと。ここで説明する内容とは異なります。ajinoriはC#が書きたいんです。
早速試してみよう
ここではDLLなんて作ったことないぞ!という方でもできるよう、画像をまじえて説明していきます。
VisualStudioを導入する
cTraderでcBot作ってる方は導入済みだと思いますが、まだ入ってない方はインストールしてください。
検索して適当にインストールで行けると思いますが、こっちの記事でも説明してます。
-
cAlgo (cTrader Automate) 開発環境の設定(Visual Studio2019版)
実はVisual Studio2019も使えます 開発環境の設定では公式ガイドにしたがって、Visual Studio2017を利用する方法を紹介しました。 でも実はVisual Studio2019 ...
続きを見る
以下はVS2019の画像ですが、VS2017でもたぶんだいたい同じです。
C#でDLLを作成する
まずVisual Studioを開き新しいプロジェクトの作成を選びます。
続いてクラスライブラリ(.Net Framework)を選択します。見つかりにくければ左上を「すべての言語」から「C#」に変更して探してみてください。
続いての画面ではプロジェクト名をつけて進みます。ここでは「MT5Test」にしました。
プロジェクト作った場所は覚えといてくださいね。デフォルトだとc:\Users\ユーザー名\source\reposだと思います。作成が完了するとこんなコードが表示されます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MT5Test
{
public class Class1
{
}
}
今回はわかりやすくメッセージボックスを表示させるだけのメソッドをここに追加してMT5から呼び出してみましょう。
ここはMT5とは関係ないんですがメッセージボックスを使うためにSystem.Windows.Formsを参照に追加する必要があります。
右側のソリューションエクスプローラの参照を右クリックして「参照の追加」
表示される参照マネージャーで「アセンブリ」で検索「System.Windows.Forms」でチェック入れてOKを押します。
これであとはusing行加えて、MT5から呼び出してあげるためのメッセージボックス表示メソッドを追加してあげるだけです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MT5Test
{
public class Class1
{
public static void ShowMessage(string msg) {
MessageBox.Show(msg);
}
}
}
追加したのは6行目と12~14行目だけです。追加したらCtrl+Shift+Bを押してビルドします。これだけでDLL側は作成完了です。
[DllExport]とかいらないの?と思う方もいるかもしれませんが、いりません。MT5は単純にビルドで作成した.Netのライブラリをそのまま読み込めるのです。
MT5のライブラリフォルダにdllを移動する
実際に開発するときはリアルタイムで更新を反映させるため、MT5からの読み込み方法を変えた方がいいでしょうが、今回は作ったdllをMT5のLibralyフォルダに直接移動します。
さっき作ったdllファイルはプロジェクトのフォルダ>プロジェクト名>bin>Debugに入ってます。MT5test.dllみたいな名前がついてるはずです。
これをMT5データフォルダのライブラリに移動します。MT5起動してShift+Ctrl+Dでデータフォルダ開いて、MQL5>Librariesの中に移動します。
MT5から呼び出してみる
ここからはMT5に移って呼び出すEA側を作成します。まずはMT5を起動して、F4キーでMetaEditorを開きます。
左上の新規作成で出てきたウィンドウでエキスパートアドバイザーを選択して次へ。
あとは適当な名前つけて次へ次へ完了。でてきたコードには2行だけ追記します。
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#import "MT5Test.dll"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
MT5Test::Class1::ShowMessage("Hello C#!");
//---
return(INIT_SUCCEEDED);
}
4行目でimportして11行目でメソッド呼び出ししてるだけですね。MT4でDLLを使ったことがある方からしたらこれだけで使えるなんて驚きではないでしょうか。本当にこれだけでOKなんです。
F7押してコンパイルしたら、MT5に戻って適当なチャートに今作ったEAを貼り付けてみてください。(DLL使用を許可するか問われたらOK押す)
でました!
本当に簡単にできちゃった
思った以上に簡単にできてしまいました。
もちろん売買ロジックをすべてC#で作るためにはMT5が持ってるデータをC#側に送ったり、C#のDLLから発注命令受け取ったりするための仕組みは作らないといけないのでcTraderのcBot作るほど簡単にはいきませんが、これまでに比べれば劇的にやりやすくなりました。
C#使ってMT5のEAづくりも再開しようかなぁ・・・