忍者ブログ

forex tester2のインディケーターを自作

fx(外国為替証拠金取引)のトレードの練習やルールの検証をForex Tester 2というソフトでしてみます。 Meta Trader4(MT4)のインディケーター(indicator)をForex Tester2用に移植できたらしてみます。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


とりあえずMicrosoft Visual C++ 2010 Expressで基本形を作ってみる 

今までは無料のDelphiみたいなlazarusでインディケーター作っていましたが
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でも動作するか試しておきたいところです。





 

PR

トラックバック

トラックバックURL:

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字(絵文字)


forex tester2 販売
Forex Tester 2の購入はこちらから。
カレンダー
02 2024/03 04
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
31
カテゴリー
フリーエリア



最新記事
最新CM
最新TB
RSS
ブログ内検索
アーカイブ
最古記事
プロフィール
HN:
fx練習生
年齢:
48
性別:
男性
誕生日:
1975/04/03
職業:
夢は専業トレーダー
趣味:
fx
自己紹介:
fxの専業トレーダーになって経済的自由と時間的自由を手に入れたいです。
自分で売買ルールを作成してテストして自信をもってリアルトレードしたいです。
P R