MT4 〜 C言語で作成したDLLをMQL4で使用する

色々なブログなどで紹介されているが、C言語で作成したプログラムをDLLとしてimportしてMQL4から呼び出す作業を自らしたのは初めてなのでメモ。

【大きな流れ】
1.MQL4から呼び出したいC言語のプログラムを作成する。
2.DLLを作成する。
3.DLLを呼び出すMQL4のプログラムを作成する。

【詳細】
1.MQL4から呼び出したいC言語のプログラムを作成する。
ポイントを纏める。

・「__declspec(dllexport)」を関数宣言の先頭に記述する。
・「extern "C"」を付ける。参考にしたページに「関数名は独自のシンボルに変換される。しかし、それではMQL4から呼び出すときの名前がわからなくなるので、「extern "C"」を付けて、関数名が変更されないようにしている。」とある。

ConvCharSet.cという名前で下記ソースを作成。

#include<stdio.h>
#define MT4_EXPFUNC __declspec(dllexport)

int main(){
	printf("Hello");
}

extern "C"
MT4_EXPFUNC double __stdcall movingAverages(double a, double b, double c, double d)
  {
   return((a+b+c+d)/4);
  }

2.DLLを作成する。
libConvCharSet.dllを作成する。
作成したDLLは、"/experts/libraries"にコピーする。

C:\dev\c\convCharSet\src>g++ -shared -o libConvCharSet.dll ConvCharSet.c -Wl,-k,--output-def,DllConvCharSet.def,--out-implib,libConvCharSet.a

3.DLLを呼び出すMQL4のプログラムを作成する。

//DLLをインポートする。
#import "libConvCharSet.dll"

//DLLで作成した関数を定義する。
double movingAverages(double,double,double,double);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
  //関数の実行
   double testNum = movingAverages(1,2,3,4);
   Print("**********Execute Result********:",testNum);


作成にあたり、「MetaTrader 練習帳」を参考に致しました。
3年前に既に試みられている。3年前はMT4でプログラミングなんて、存在すら知らなかった。