Microsoft Visual C++ 2010 Expressで作ることにしました。
lazarusだとdllのサイズが大きすぎるのが1番の理由です。
c++のほうが自分の中ではポピュラーで情報が手に入れやすく
無料の開発環境が存在するのも乗り換える理由です。
cとc#が少しできるからc++も大丈夫かなと思っています。
製品のVisual C++ よりは劣るらしいですが
Forex Tester2から呼ばれる関数を作るだけならExpress Editionでも
全く問題ないと考えています。
では早速コンパイルしてみましょう。
スタートページで新しいプロジェクトを選択します。
Win32 コンソールアプリケーションを選択します。
今回はプロジェクト名とソリューション名をDemoIndiとします。
アプリケーションの種類をDLLとし空のプロジェクトをチェックします。
コードは適当につくってみました。
間違えているのは分かっていますがこのままで進めます。
ファイル名はDemoIndi.cppとしてプロジェクトのフォルダに作成します。
#include <windows.h> #include "IndicatorInterfaceUnit.h" #include "TechnicalFunctions.h" EXPORT void __stdcall Init() { IndicatorShortName("DemoStrategy"); SetOutputWindow(ow_SeparateWindow); AddLevel(0, psDot, 1, 0xFF0000); AddLevel(80, psDashDot, 1, 0x00FF00); AddLevel(-80, psDashDotDot, 1, 0x0000FF); Print("Hello, world! Init"); } EXPORT void __stdcall Done() { Print("Hello, world! Done"); } EXPORT void __stdcall Calculate() { Print("Hello, world! Calculate"); }
プロジェクトにDemoIndi.cppとIndicatorInterfaceUnit.hとTechnicalFunctions.hを追加します。
ヘッダファイルは C:\ForexTester2\Examples\Indicators\C++ にありました。
プロジェクトのフォルダ内は以下のようになっています。
この状態でビルドしたら成功してプロジェクトフォルダの下にReleaseフォルダができていました。
でもその中にはdllファイルがありませんでした。
いろいろやってみましたがどうしてもdllファイルが作成できませんでした。
諦めそうになりましたがソリューションフォルダの下にもReleaseフォルダができていて
その中にdllファイルが存在しました。
2つもReleaseフォルダができていることは知らなかったので悩んでしまいました。
dllをForexTester2のフォルダにコピーして起動してみました。
(TDllIndicator.create) Can not load indicator DemoIndi.dll, have error: Can not get "Init" proc address
というエラーが出て読み込めませんでした。
Initが無いようなのでVisual Studioに付属のdumpbinコマンドで調べてみました。
実行結果は以下です。
>dumpbin /EXPORTS DemoIndi.dll Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\ForexTester2\Indicators\DemoIndi.dll File Type: DLL Section contains the following exports for DemoIndi.dll 00000000 characteristics 4C3F194D time date stamp Thu Jul 15 23:21:01 2010 0.00 version 1 ordinal base 5 number of functions 5 number of names ordinal hint RVA name 1 0 00001140 ?Calculate@@YGXXZ = ?Calculate@@YGXXZ (void __stdcall Calculate(void)) 2 1 00001120 ?Done@@YGXXZ = ?Done@@YGXXZ (void __stdcall Done(void) ) 3 2 00001080 ?Init@@YGXXZ = ?Init@@YGXXZ (void __stdcall Init(void) ) 4 3 00003358 ?IntrfProcsRec@@3UTInterfaceProcRec@@A = ?IntrfProcsRe c@@3UTInterfaceProcRec@@A (struct TInterfaceProcRec IntrfProcsRec) 5 4 00001030 ?ReplaceStr@@YGXAAPADPAD@Z = ?ReplaceStr@@YGXAAPADPAD@ Z (void __stdcall ReplaceStr(char * &,char *)) Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text
Initの名前が変になっています。
調査した結果defファイルを使用しないと名前が変になるようなので作成しました。
DemoIndi.def という名前で以下の内容としました。
LIBRARY DEMOINDI EXPORTS Init Calculate ReplaceStr IntrfProcsRec
プロジェクトのプロパティでdefファイルを指定します。
これでビルドして同様にdumpbinで確認してみると以下のようになりました。Init となりました。
>dumpbin /EXPORTS DemoIndi.dll Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file C:\ForexTester2\Indicators\DemoIndi.dll File Type: DLL Section contains the following exports for DEMOINDI.dll 00000000 characteristics 4C3F29E5 time date stamp Fri Jul 16 00:31:49 2010 0.00 version 1 ordinal base 5 number of functions 5 number of names ordinal hint RVA name 2 0 00001120 ?Done@@YGXXZ = ?Done@@YGXXZ (void __stdcall Done(void) ) 1 1 00001140 Calculate = ?Calculate@@YGXXZ (void __stdcall Calculat e(void)) 3 2 00001080 Init = ?Init@@YGXXZ (void __stdcall Init(void)) 4 3 00003358 IntrfProcsRec = ?IntrfProcsRec@@3UTInterfaceProcRec@@A (struct TInterfaceProcRec IntrfProcsRec) 5 4 00001030 ReplaceStr = ?ReplaceStr@@YGXAAPADPAD@Z (void __stdcal l ReplaceStr(char * &,char *)) Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text
これでもう一度Forex Tester2を起動してみます。
エラーがなくなりました。
このままDemoIndiを表示させようとしたらForex Tester2が落ちました。
Init内で IndicatorBuffers(0); を実行していなかったからです。
バッファを使用しない場合は0を設定しましょう。
IndicatorBuffers(0);を追加することで無事に読み込むことができました。
わざとCalculateの引数を無しにしていましたがこちらは得に問題なしでした。
defファイルについて少し調査した結果
EXPORTS には以下の4つが必須ということが分かりました。
Init Calculate ReplaceStr IntrfProcsRec
以下の2つは存在すればcallされるようです。
Done OnParamsChange
ほかにも何かあるのかもしれません。
ストラテジーは別のものが必須だと予想されますがある程度レベルが上がってから挑戦します。
パラメータを変更するタイミングで OnParamsChangeがcallされます。
インディケーターを削除するタイミングでDoneがcallされます。
存在しなければcallされないだけです。そのタイミングで処理が必要なら作成しましょう。
この状態でのdllのサイズが8kbyteです。
lazarusで作成したものは1466kbyteくらいなので約180倍です。
配布とかする場合はlazarusで作成するより
Microsoft Visual C++ 2010 Expressで作成するほうが好ましいです。
Microsoft Visual C++ 2010 Expressをインストールしていない
PCでも動作するか試しておきたいところです。
トラックバック
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
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 |
自分で売買ルールを作成してテストして自信をもってリアルトレードしたいです。
コメント