Twitter Facebook github

FT2用インジケーターを作る(Pascal編)

こんにちは

わたしは為替のバックテストと検証に、ForexTester 2(以下FT2)という有料のソフトウェアを使っていて、
実際のトレードはMetaTrader 4(以下MT4)を使っています。

これらのソフトウェアは、プログラムの知識があれば、テクニカル分析に用いることのできるインジケーターや、自動売買用のプログラム(EA; Expert Advisor)を自作することができます。
MT4の場合は、本体インストール時にコンパイラも同時にインストールされ、プログラミング言語といっても習得が容易なオリジナル言語MQL4でより容易にプログラムすることができ、ソースコードが公開されていることも多いのですが、FT2の場合はC++またはPascalを使って、これらのdllを作る必要があります。

普段Mac使いなこともあって、数年ぶりにこれらの開発環境を整えるときに躓いたことがあったので、備忘録として手順を書き留めようと思います。

ちなみに、言語はPascalでもC++でもどちらでも良いと思います。C++は後で別に記事にするつもりです。プログラミング初学者で、どちらの言語も触れたことがない方であればPascalの方が私は楽だと思います。
ただし、DLLファイルの容量がC++でビルドした方が小さくなります。気になる方はC++が良いかもしれません。

環境

  • Windows 10 64 bit
  • Lazarus 1.6 RC1
  • ForexTester 2 v2.9.6

コンパイラのインストール

今回、コンパイラにはLazarusを使おうと思います。

http://sourceforge.net/projects/lazarus/files/

上のリンクから、自分のマシンに合うものをインストールしてきてください。

今回はWindows 10 64bit上でビルドを行いますので、 Lazarus Windows 64 bits / Lazarus 1.6RC1 にある lazarus-1.6RC1-fpc-3.0.0-win64.exe を使います。

また、FT2は32bit用のdllしか読み込めませんので、クロスビルド用の lazarus-1.6RC1-fpc-3.0.0-cross-i386-win32-win64.exe も必要になります。

これらを順番にインストールしてください。

注意として、インストール先のディレクトリパスに日本語やスペースが含まれているとビルドできないことがありますので、大人しくデフォルトのCドライブ直下に入れるのがお勧めです。

プログラムの準備

今回は環境構築を目指すので、インジケーターはFT2同梱のサンプルを用います。
FT2のインストールディレクトリ下のExamples/Indicators/Delphiにある、拡張子がpasのファイル2つと、IndicatorsSrcというディレクトリに入っているサンプルの中から一つファイルを選びます。
今回はRSIを使ってみることにします。

  • Examples/Indicators/Delphi/IndicatorInterfaceUnit.pas
  • Examples/Indicators/Delphi/TechnicalFunctions.pas
  • Examples/Indicators/Delphi/IndicatorsSrc/RSI.dpr

上の3つのファイルを、適当な場所にディレクトリを作ってコピーしてきてください。
今回はMyRSIというディレクトリを、Examples/Indicators/Delphiの中に作りました。
オリジナルのRSIと区別するために、RSI.dprをMyRSI.dprにリネームします。

  • MyRSI/IndicatorInterfaceUnit.pas
  • MyRSI/TechnicalFunctions.pas
  • MyRSI/MyRSI. deeper

プロジェクトの作成

次にインストールしておいたコンパイラのLazarusを起動します。

何かファイルが開かれている場合は、 File->Close All で閉じます。

File->Open を選んで、MyRSI.dprを選択して開きます。このとき、ファイルが表示されない場合は右下の拡張子フィルタを All files (*.*) に変更してください。

d7ef5fa030855cde8ae59b96a2f0cf55

Program detected というダイアログは Yes をクリックします。

15765420a451f5b63c2eb6142090a242

既存のプロジェクトを保存するか問われるダイアログでは、必要なければNoを選択します。

Create a new projectダイアログでは、プロジェクトの種類を選択します。今回はDLLですので、Libraryを選択してOKをクリックします。

f4fc846ed6e23e80014f69a8d817617f

コンパイルオプションの設定

Project->Project Options … を開きます。

Compiler OptionsのConfig and Targetを開いて、Target Platformを次の通り変更します。これは、Win32用のDLLを出力する設定です。

  • Target platform
    • Target OS (-T): Win32
    • Target CPU family (-P): i386
    • Target processor (-Cp): 386/486 (-Cp80386)

e50c6b019ca3940d53c73398053e2892

Parsingを開いて、Syntax modeを Delphi (-Mdelphi) に変更します。

de8d7048a38052aa703693a988f65d88

Compilation and Linkinを開いて、LinkingのLink smart (-XX) をチェックします。

2fa0b24277ad7a8513d89fa21874078b

Debuggingを開いて、次の2点を変更します。

  • Info for GDB
    • Display line numbers in run-time error backtraces (-gl): チェックを外す
  • Other debugging info
    • Strip symbols from executable (-Xs): チェックする

3899e9a623f381464b96dbc386b9f5eb

すべて終わったら、右下のOKで閉じます。

LCLライブラリを追加

Project->Project Inspector … を開きます。

左上の Add >> ボタンを押して、 New Requirement をクリックします。

Add to Projectウィンドウの Package Name に LCL を入力して、 Create New Requirement を押します。

f0fb81d17c12a63deb5d3793285cc7ce

Project Inspector の Required Packages に LCL が表示されていればOKです。

ソースコードの編集

今回はRSIのソースをビルドしていますので、特に変更を加えなくともビルドは可能です。

ただし、FT2はデフォルトでRSIのインジケーターが入っていますので、取り込んだときに同名のインジケーターが2つ表示されややこしいので、インジケーター名だけを変更することにします。

Source Editorウィンドウを開いて、24行目の IndicatorShortName 関数の引数を MyRSI に変更して保存します。

9ac13354e6916045c98875226287ee87

ビルドして使ってみる

いよいよコンパイルです。祈りながらRun->Buildをクリックしましょう。

成功すれば次のようなメッセージが表示されます。

588f7d613365658dee4139e38aea671e

もし Error: ppc386.exe can't be executed~ というエラーになった場合は、クロスコンパイル用の追加バイナリがインストールされていないので、エントリの最初の方を見直してインストールしてきてください。

ビルドが成功すれば、MyRSIのディレクトリの中に MyRSI.dll が作られているので、これをFT2のファイル->インストール->インジケーターをインストールから読み込めばFT2で使えるようになります。

b7a750c03fbac808b131fe5219149c8d

FT2で読み込むときにエラーが発生した場合は、Lazarusで設定した Target Platform 周りを再度確認してみてください。例えば、64bitでコンパイルされたDLLは読み込みに失敗します。

FT2で読み込んだインジケーターは、デフォルトのインジケーターと同じように使うことができます。
チャートを右クリックしてインジケーターの追加を選択すると、一番下にインストールしたインジケーターが表示されているので表示してみましょう。

df263b2d2d83d72313df0fdd7bf6f680

お疲れ様でした。この手順を踏むと、MT4のインジケーターやEA製作がとても楽で素晴らしい機能に思えてきます。
でも、折角FT2を持っているのであれば、MT4で実戦に入る前に同じインジケーターを使ってFT2で練習を重ねておきましょう。

是非挑戦してみてください。

所感

ここまで書きながら実際作っていたのですが、今回はFT2に移植したいMT4のソースがC++だったので、PascalよりもC++でビルドし直すことに決めました。

C++でFT2のインジケーターを作るための環境構築は次のエントリで書こうと思います。

コメントを残す

メールアドレスが公開されることはありません。