ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード Twitter

忙しいです。ネタもないし・・・

2010-06-14

初めてのDLL(2)/関数作成篇

昨日に引き続き、DLL作成のお話です。

念のために書いておきますが、あくまでもDLL作成の雰囲気をつかむのが目的ですので、少し勉強したら高速処理できるDLLが作れる・・・なんてことは絶対ありません^^;

C言語や、VisualC++に相当詳しくならないと難しいです。

(その上、無料版では、本格的な高速化は出来なかったような気がしますし...orz



続きは、本当に興味のある人だけどうぞ..orz


昨日は、

・Release モードを選ぶ

・リビルドを行う

の2点を覚えました。これらは忘れずに実行しましょう..。


今日は、関数の作り方を紹介します。

(1) 秘密の関数 SecretFunc1 を作ります。

↓サンプルの ExpertSample.cpp から不要な部分を削除して SecretFunc1 のみにしたものです。

f:id:fai_fx:20100613213315p:image

MQL4 と比べると、MT4_EXPFUNC や __stdcall という余分な文字列が入りますが...そういう規則があるのだと諦めましょう^^;DllMain という関数はDLLが読み込まれたときや終了したときに呼ばれますが、気にしなくてOKです。

SecretFunc1 関数の内容は double 型の引数 a,b に対して 2*a+b を計算して返しているだけです。


(2) .def ファイルを書き換えます。

↓サンプルではDLL内の関数名が列挙されています。

f:id:fai_fx:20100613213314p:image

↓これを SecretFunc1 のみにします。

f:id:fai_fx:20100613221330p:image

この状態でリビルドすれば DLL が完成します。

(3) MQL4 側は、以下のように書きます。

f:id:fai_fx:20100613213313p:image

↓実行すると... 2*5+1 = 11 となります。

f:id:fai_fx:20100613213312p:image





関数から複数の計算結果を得る。


上記で紹介した関数の作り方では、return で返される1つの計算結果しか受け取ることができません。ロジックの隠ぺいが目的の場合は、これではちょっと不便なので、配列をデータの授受に使います。

(4) MQL4 側では、静的配列を用意し、配列要素0〜3 に計算に使うデータを代入します。計算結果の受取りには、配列要素4〜5 を使います。

f:id:fai_fx:20100613213310p:image

(5) DLL 側は以下のように書いて計算します。

f:id:fai_fx:20100613213309p:image

↓関数名 SecretFunc2 を def ファイルにも追加します。

f:id:fai_fx:20100613213308p:image

DLL内で使われている C言語は、MQL4 とは異なるのですが、四則演算のような簡単であれば MQL4 の知識だけでもプログラミングできると思いますので、いろいろ試してみてください。




プロジェクトの置き場所について

今日のプロジェクトはここからダウンロードできます。DLLSample と同じフォルダに置いてください。

f:id:fai_fx:20100613213307p:image


次回は、簡単なテクニカル指標をDLL内で計算する方法を紹介します。

CorgiCorgi 2010/06/14 01:44 faiさん、こんばんは。

むぅ・・・^^;
色々試す間はずうっとReleaseモードでいいですか^^;
homepage3.nifty.com/ishidate/vcpp.htm
で勉強を始めたんですが、faiさんおススメのサイトや書籍があれば
教えていただけますか。

おっしゃるように、手抜きしないでC言語やVisualC++の基本を学ばないと
いずれつまづくような気がします^^;
ライフワークとして取り組んでみたいと思います。

monmon 2010/06/14 16:03 いつも閲覧させて頂いております!

が、初めてのコメントですw

MQL4の定義済み関数(例えばMarketInfo等)をDLLで実行する事は出来るのでしょうか?

又はそれに近い様な事は出来るんですかね?

fai >monfai >mon 2010/06/15 19:00 http://purebeam.biz/forum/index.php?topic=37.0
この辺りの人に聞くと良いかも知れません。。^^;

fai >Corgifai >Corgi 2010/06/15 19:02 Corgiさん、こんばんは。

そうそうReleaseモードでOKです。
もうね、C++もVC++もあまりに複雑すぎて、さくっと学べるお勧めサイトや書籍はありません^^;

いろんなサイトで、少しずつ知識をためてゆくしかないと思ってます。

MUNK>faiMUNK>fai 2010/07/31 02:08 こんばんわです。

DLLを作成して実際に稼動させた所動作しましたが、複数のチャートに同じEA(同じDLL)を呼ぶと、異常?のウィンドウが表示されて、「送信」ボタンを押すとMT4が落ちてしまいます。
※時々発生するので原因が良く分からないのです。1つのチャートだけでは発生しません。

ちょっと情報が少ないかもしれませんが、何か原因と対策は思いつきますでしょうか?

fai >MUNKfai >MUNK 2010/07/31 06:08 DLLがマルチスレッドに対応していない感じでしょうかねぇ。。。
あるEAが、そのDLL内の関数を実行中に、別のEAがその関数を呼び出したときに問題がおきる構造か調べてみるとよいかもです。

対策としては、DLL内部に排他制御を導入するかな。。

MUNK > faiMUNK > fai 2010/07/31 22:27 > あるEAが、そのDLL内の関数を実行中に、別のEAがその関数を呼び出したときに問題がおきる構造か調べてみるとよいかもです。
→1点だけ。DLL内部で共有している変数へ書き込みがあるとダメですか?参照ならOKでしょうか。
 つまり、グローバル変数の書き込みをしてない関数は気にしなくても大丈夫でしょうか。

fai >MUNKfai >MUNK 2010/07/31 22:44 原因自体をはっきり確認できていない私に、こうすれば大丈夫と言えるはずもなく..^^;

案外、Build225 では問題が起きず、Build226固有の問題である可能性も捨てきれないのですよ..。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fai_fx/20100614/1276443053
Connection: close