スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MT4EAに自作DLLを組み込む?その2

前回の記事では、DLLの開発環境に"Turbo C++"を使用した場合のプロジェクト設定について書いた。今回は、自作DLLの関数をMQL4で記述するEAから呼び出す方法をメモしておく。

EAに限らずDLLとしてリンクする関数を外部から呼び出す場合、その関数はエクスポートされていなければならない。またEAがDLLをロードするタイミングは、EAの記述でDLLの関数を始めて呼び出すときであるようだ。よってDLLとEAの関係として明示的リンク、遅延ロードされることが前提となる。いろいろな方法や流儀があると思うが、以下のような方法を用いている。

#define mDllExport extern "C" __declspec(dllexport)

上記マクロを定義してエクスポートする関数の宣言に使用することで、DLLのエクスポート関数であることを示すと同時にCリンケージを適用させる。C++でDLLを作成する場合、エクスポートする関数をCリンケージにしておかないと多重定義に対応できるように引数情報も含めたC++規約の内部関数名でエクスポートすることになり、EAからロードすることができない。

ヘッダ・ファイル等のエクスポート関数の宣言は以下のようにする。

mDllExport int WINAPI DllFunction( HWND hWnd );

WINAPIの指定は関数の呼び出し規約を__stdcallにすることと同等で、MetaEditorのヘルプにこの呼び出し規約を指定することが必要である旨が書かれている。
前回の記事では、プロジェクト・オプションで呼び出し規約を変更するように書いたが、それでは全ての関数が一括して変更されてしまう。プロジェクト・オプションをデフォルトのままにして、エクスポートする関数についてのみWINAPIまたは__stdcallを指定すればよく、それで動作確認済みである。

DLL関数を呼び出すEA側の記述は、includeフォルダにある"WinUser32.mqh"をまねすればよい。

#import "MyTest.dll"             // 自作DLLのファイル名
int DllFunction( int hWnd );       // 上記のエクスポート宣言した関数
#import

以上を記述したヘッダ・ファイルを作成してインクルードするか、EA記述の冒頭部分などに書くことで、DLLからインポートして呼び出す関数の宣言となる。

ここまでで自作DLLを作成してEAから呼び出すことができ、通常のWindowsプログラミング同様の処理をEAですることが可能になる。思ったより簡単で少ない手順で済むものだと思わないだろうか?

この他にもいろいろな引数(型の種類、配列、ポインタ、参照など)を渡す場合にどうするか
さらに同じDLLを使用するEAを複数動作させる場合はDLLのインスタンスが共有され、各EAはそれぞれ別スレッドで動作するのであるから、マルチスレッドの対応が必要になってくるなどクリアするべき問題が沢山あった。

記事に対する反響が大きければ、それに応じて続きを書くし、少なければ自分のメモとして気が向いたときに続きを書こうと思う。。。
スポンサーサイト

theme : システムトレード
genre : 株式・投資・マネー

tag : MT4EAに自作DLL EAからDLL DLL C++ エクスポート関数

comment

Secret

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

^^

Dr.ヘパさん、こんにちは。

私も、ちまちまとDLLを作っているので、この記事の続きが気になります。技術系のネタは、ほとんどの場合、反響が少ないのが寂しいですけどね。^^;

EAやscriptの場合の排他制御はどうにでもなるのですが、インジケータにDLLを組み込んだ場合には、セマフォしか効かない?のが今のところ謎です..。

Re: ^^

faiさん、コメントありがとうございます。
また、先日はそちらでお騒がせしてすみませんでした。
いろいろとフォローもありがとうございます。<(_ _)>

> 技術系のネタは、ほとんどの場合、反響が少ないのが寂しいですけどね。^^;

そのようですね。faiさんの技術ネタには、そうだったのか、なるほど、そうだそうだ、ビックリ!と私自身の中での反響は尋常ではないものがあります。
目に見えない部分も含めればその影響は計り知れないものがあると思います。

> EAやscriptの場合の排他制御はどうにでもなるのですが、

お恥ずかしながらEAでのDLLの組み込みを始めてから日が浅く、
自分にとって需要がなかったのでインジケータとDLLの場合については未経験です。
なのでセマフォしか効かない?という動作状況がどのようなものかがわからないです。

Indicatorの場合、EAやScriptの排他制御のようにはゆかないという件については、またまた驚かされつつも興味深いことだったので、簡単な実験を交えつつ少し調べてみました。
重要なことだと思うので分かったことをメモとして後で記事にしたいと思います。

自分なりの推測ですが、
インジケータの場合、マルチスレッドとしての排他制御は必要ないのではないか、
または排他制御をした場合としなかった場合で動作に違いは生じないのではないか、
ということが考えられるのですが、実際のところどうでしょうか?

No title

Dr.ヘパさん、こんにちは。

>実際のところどうでしょうか?

実際は、DLL内の処理が一瞬なので、排他制御が無いことによる問題に遭遇できていません^^;
一応、Semaphore での排他制御ができることは分かったので、必要になったら使う…って感じですねぇ。

メモ記事楽しみにしています。。^^

☆当ブログとFX取引に関するご注意☆

もし、当ブログを閲覧、参考にしていただいた上で、FXまたはその他取引に関心を持たれた方は、以下の点にご注意して下さい。

・FX取引(外国為替証拠金取引)は元本や利益が保証された商品ではなく、市場環境の変化や相場の変動により損失が発生する場合があること。

・FXおよびその他取引をする場合は、各種のリスクを理解し、十分に検討し、かつ慎重に行う必要があること。

・当ブログで掲載、紹介している情報は、FXおよびその他取引、投資に関する勧誘、助言等ではないこと。

・当ブログで掲載、紹介している取引手法、ソース・プログラム等を用いた結果、いかなる損害が生じても当方は一切の責任を負わないこと。

投資、取引をされる場合は、必ずご自身の責任で行って下さい。
よろしくお願いいたします。
プロフィール

Dr.ヘパ


Author:Dr.ヘパ

カテゴリ&検索
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
月別アーカイブ
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
つぶやき
★DailyImpact(有償版)★
リアル口座で運用できる有償版
販売開始しました!

ご購入、お申し込み等の詳細については、下記リンク先のブログ右上にショッピング・カート「ブーボーのトレーディングキット工房」へのリンクがありますので、お手数ですがそちらをご参照下さい。

ブーボーの
トレーディングキット

Ⅰ.経済指標トレード向けEA、DailyImpactは、経済指標発表による突発的な値動きを捉えることで、利益を得ることを目指したセミオートEAです。

Ⅱ.経済指標トレードは、「指標トレード」「News Trading(ニューストレード)」とも呼ばれ、最近注目されている手法です。

Ⅲ.経済指標発表によるトレードは、いつ大きく動く可能性があるかわかっているので有利です。

Ⅳ.一方、瞬時に大きな値動きが発生するので、手動での仕掛け、手仕舞いは難しいことが多いです。

Ⅴ.高速に計算・発注可能なEAであるDailyImpactにより、手動よりも素早く、同時に多くの通貨ペアで、しかもその場にいなくても経済指標トレードができます。
★DailyImpact(DL版)★
ダウンロード版
期間限定で試用できます!!

ダウンロード、使用方法の詳細は
以下のブログを参照して下さい。



DailyImpact(ダウンロード版):ブーボーのトレーディングキット

   ☆ブーボーの
トレーディングキット

↓↓↓アンケートにご協力お願いします。↓↓↓
ブログ・ランキング
リンク&ブロとも申請
アクセス・カウンタ
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。