今回は、JForexストラテジーのスケルトンコードを使用してJForexストラテジーの骨格(構造)について解説していきます。
JForexストラテジーの骨格
以下は、JForexでストラテジーを新規追加した直後のスケルトンコードです。
このコードは正常にコンパイルでき、実行することもできますが、何も実装していないため実行しても何の機能も果たしません。
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 32 33 34 35 36 37 38 |
package jforex; import java.util.*; import com.dukascopy.api.*; public class Strategy implements IStrategy { private IEngine engine; private IConsole console; private IHistory history; private IContext context; private IIndicators indicators; private IUserInterface userInterface; public void onStart(IContext context) throws JFException { this.engine = context.getEngine(); this.console = context.getConsole(); this.history = context.getHistory(); this.context = context; this.indicators = context.getIndicators(); this.userInterface = context.getUserInterface(); } public void onAccount(IAccount account) throws JFException { } public void onMessage(IMessage message) throws JFException { } public void onStop() throws JFException { } public void onTick(Instrument instrument, ITick tick) throws JFException { } public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { } } |
JForexストラテジーは、IStrategyというインターフェースを使用して作成します。
スケルトンコード7行目で、作成するストラテジーのクラスに対して「IStrategy」インターフェースを適用しています。
1 |
public class Strategy implements IStrategy { |
そして、8~13行目でオブジェクトの参照を格納するためのメンバ変数の宣言を行っています。
1 2 3 4 5 6 |
private IEngine engine; private IConsole console; private IHistory history; private IContext context; private IIndicators indicators; private IUserInterface userInterface; |
それぞれのオブジェクトの役割はまたおいおい解説していきます。
「IStrategy」インターフェースには、以下の6つのコールバック関数が定義されており、プログラマはこの6つの関数をオーバーライドしてストラテジーを作成していくことになります。
- onStart
- onAccount
- onMessage
- onStop
- onTick
- onBar
スケルトンコードの15~37行目に上の各関数が定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public void onStart(IContext context) throws JFException { this.engine = context.getEngine(); this.console = context.getConsole(); this.history = context.getHistory(); this.context = context; this.indicators = context.getIndicators(); this.userInterface = context.getUserInterface(); } public void onAccount(IAccount account) throws JFException { } public void onMessage(IMessage message) throws JFException { } public void onStop() throws JFException { } public void onTick(Instrument instrument, ITick tick) throws JFException { } public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { } |
各コールバック関数の役割
先ほど説明した6つのコールバック関数は、それぞれ異なる特定のタイミングで自動的にシステムから呼び出されます。
ここでは、それぞれの関数についてどのような役割があるのかを説明します。
onStart
onStart関数はストラテジーを起動したときに最初に1度だけ呼ばれる関数です。
スケルトンコードの15~22行目に記述があります。
1 2 3 4 5 6 7 8 |
public void onStart(IContext context) throws JFException { this.engine = context.getEngine(); this.console = context.getConsole(); this.history = context.getHistory(); this.context = context; this.indicators = context.getIndicators(); this.userInterface = context.getUserInterface(); } |
一般的にこの関数内では変数の初期化処理等を行います。
onStart関数は、引数として「IContext」型のオブジェクトが渡されてきます。
IContextは、チャートやコンソール、ヒストリー、インジケーター、オーダーエンジン等のJForexシステムの様々なコンポーネントにアクセスできます。
スケルトンコードでは作成しているストラテジークラスに宣言した各メンバ変数にIContextから取得したオブジェクトへの参照をコピーしています。
onAccount
onAccount関数は、 Account Info(アカウント情報)の更新があった際に呼ばれる関数です。
例えば、オープンポジションを持っている場合は、レートが変動すればEquity(純資産)も変動しますが、その変動を検知すると呼ばれます。
スケルトンコードの24~25行目に記述されています。
1 2 |
public void onAccount(IAccount account) throws JFException { } |
引数に、IAccountオブジェクトが渡され、そのオブジェクトを通して純資産等のアカウント情報にアクセスできます。
ただし、取得できるEquity等の情報はリアルタイムの情報ではなく、Wikiによると約5秒毎に更新されるスナップショット情報となります。
この関数を使用して時刻を表示させてみましたが、実際は約10秒毎に呼び出されていました。
JForexツールの左下に表示されている純資産情報もonAcountの呼び出しと同じタイミングで更新されているようです。
onMessage
onMessage関数は、JForexシステムから新しいメッセージを受信した際に呼び出される関数です。
スケルトンコードの27~28行目に記述されています。
1 2 |
public void onMessage(IMessage message) throws JFException { } |
引数にImessageオブジェクトが渡され、メッセージの種類や内容にアクセスできます。
オーダーをオープンしたりクローズしたりした際にメールを送信するといった用途等で使えそうです。
onStop
onStop関数はストラテジーを停止する直前に1度だけ呼ばれる関数です。
スケルトンコードの30~31行目に記述されています。
1 2 |
public void onStop() throws JFException { } |
ロジックによりますが、チャート上に表示したオブジェクトを削除する等の後処理が必要な場合等に使用します。
onTick
onTick関数は、JForexアプリの銘柄リストに登録した全ての通貨ペアのティック更新毎に呼ばれます。
スケルトンコードの33~34行目に記述されています。
1 2 |
public void onTick(Instrument instrument, ITick tick) throws JFException { } |
引数には、通貨ペア名の列挙型である「Instrument」オブジェクトと最新のASK、BID値を取得できる「ITick」オブジェクトが渡されます。
通常はInstrumentオブジェクトで通貨ペアをフィルタリングし、価格変動があった際のロジックをここに記述していきます。
onBar
onBar関数は、JForexで利用できる一般的なタイムフレームの足が確定する度に呼び出されます。
例えば1分足が確定する度、5分足が確定する度に呼ばれます。
スケルトンコードの36~37行目に記述されています。
1 2 |
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { } |
引数には、onTick関数と同様に「Instrument」オブジェクト、どのタイムフレームのデータなのかを示すPeriodオブジェクト、最新のASKとBIDそれぞれの「IBar」オブジェクトが渡されます。
IBarオブジェクトにアクセスすることでレートの4本値(始値、高値、安値、終値)を取得することができます。
通常、これらのオブジェクトを使って不必要な通貨ペアやタイムフレームをフィルタリングして取引ロジックを記述していきます。
利用したいタイムフレームの足の確定をまって取引を行うようなストラテジを作成する場合は、OnTick関数よりもOnBarを使用すればよいでしょう。
コメント