今回は、前回解説した6つのコールバック関数内にコンソールに対してメッセージを表示する処理を記述し、実際に呼び出しタイミングを体験してみましょう。
実際にプログラミングをしていく前に、ストラテジーの作成、コンパイル、実行までの一連の流れをまずは押さえておいたほうがよいでしょう。
詳しい方法は、デューカスコピージャパン徹底検証(3)ストラテジー作成編にすでにまとめていますので、まずはそちらを習得してから次に進んでください。
コンソールにメッセージを表示する
JForexのコンソールに文字列を表示するには以下のコードを使用します。
1 |
console.getOut().println("ここに表示したい文字列を記入する"); |
onStart関数の動作
onStart関数はストラテジを開始したときに一度だけ呼ばれます。
onStart関数内でメッセージを表示させて、呼ばれるタイミングを実際に目で確認してみましょう。
まずはスケルトンコード内のonStart関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 6 7 8 9 10 |
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(); console.getOut().println("onStart Called"); } |
JForexにStorategyタブを表示させた状態で、左の「Workspace」内の「ストラテジー」から作成したストラテジーを右クリックして「ローカルで起動」をクリックします。
クリックした瞬間に、「Strategy」タブ内に「onStart Called」が表示されるはずです。
次に、ストラテジーを右クリックして「中止」をクリックしてください。
「Strategy」タブ内に新たなメッセージは表示されませんね。
これで、onStart関数が起動時に1回だけ呼ばれるということが分かったと思います。
onStop関数の動作
onStop関数はストラテジを終了する際に一度だけ呼ばれます。
先ほどonStart関数に追記したコードはそのままにして、onStop関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 |
public void onStop() throws JFException { console.getOut().println("onStop Called"); } |
JForexのStorategyタブ内の「メッセージを削除」ボタンを押して、前回のメッセージを削除しておきます。
そして、先ほどと同じように、ストラテジーを起動してください。
ストラテジーを実行した瞬間に「Strategy」タブ内に「onStart Called」が表示されます。
次に、ストラテジーを右クリックして「中止」をクリックしてください。
今度は、中止ボタンを押した瞬間に、「Strategy」タブ内に「onStop Called」が表示されました。
これで、onStop関数がストラテジーの終了時に1回だけ呼ばれるということが分かったと思います。
onTick関数の動作
onTick関数はティックの更新毎に呼び出されます。
今回はティックが更新される度に通貨ペア名と為替レートのBid値を表示させたいと思います。
通貨ペア名は、引数の「instrument」、レートのBid値は引数のtickオブジェクトのgetBid関数で取得できます。
onTick関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 |
public void onTick(Instrument instrument, ITick tick) throws JFException { console.getOut().println(instrument + ":" + tick.getBid()); } |
ストラテジーを起動すると、ストラテジーを停止するまでティックが更新される度に通貨ペア名とBid値が「Strategy」タブにずらずらと表示されていきます。
onTick関数で取得できる通貨ペアの情報は、左の銘柄リストに表示させている通貨ペアのみとなります。
onBar関数の動作
onBar関数はタイムフレームの足が確定する度に呼ばれます。
onTick関数と同様に、onBar関数で取得できる通貨ペアの情報は、銘柄リストに表示させている通貨ペアのみとなります。
今回は通貨ペアをドル円に限定し、タイムフレームと4本値を「Strategy」タブに表示させてみます。
onBar関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 6 7 8 |
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException { if(instrument.equals(Instrument.USDJPY)) { console.getOut().println(instrument + "(" + period + "):" + bidBar.getOpen() + "," + bidBar.getHigh() + "," + bidBar.getLow() + "," + bidBar.getClose()); } } |
ストラテジーを起動すると、ドル円のタイムフレームの足が確定する毎に「Strategy」タブにそれぞれの足の4本値の情報が表示されていきます。
onBar関数で取得できる最少のタイムフレームは見ての通り10秒足となります。
上の画像では、10秒、1分、5分、10分、15分、30分足の情報が表示されていることがわかります。
onAccount関数の動作
onAccount関数はアカウント情報が更新される度に呼び出されます。
onAccount関数内にequity情報(含み損益を)を取得するコードを記述して「Strategy」タブにequity情報を表示させてみます。
equity情報を表示させるには引数で渡されるaccountオブジェクトのgetEquityメソッドを呼び出します。
onAccount関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 |
public void onAccount(IAccount account) throws JFException { console.getOut().println("equity = " + account.getEquity()); } |
ストラテジーを起動してください。
ストラテジー起動直後に一度onAccount関数が呼ばれていますが、それ以降は反応がなくなります。
オープンポジションを保有していないためアカウント情報に変動がないので、このままではonAccount関数が呼ばれません。
そこで、どの通貨ペアでもいいので発注パネルから注文を行いオープンポジションを持ってみましょう。
ポジションを持つと、equityの変動が生じるので、変動を検知した際にonAccount関数が呼ばれます。
ただし、onAccount関数は最短でも5秒毎に呼び出される仕様のようで、リアルタイムの情報を取得することはできません。
あまり使う機会はないと思いますのでなんとなくそういう動作をするものだと理解しとけばいいと思います。
onMessage関数の動作
onMessage関数は、JForexシステムからメッセージを受信した際に呼び出される関数です。
ここでは、発注申請の成功、注文処理の成功、オーダーのクローズ成功メッセージを拾って表示してみます。
メッセージの種類を判定するには、onMessage関数の引数で渡されるImessageオブジェクトのgetType関数を使用します。
発注申請が成功した時は、ORDER_SUBMIT_OK、注文が正常に執行されるとORDER_FILL_OK、クローズが成功するとORDER_CLOSE_OKが送信されてきます。
onMessage関数に次の黄色くハイライトさせたコードを追記し、コンパイルしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public void onMessage(IMessage message) throws JFException { switch(message.getType()){ case ORDER_SUBMIT_OK : console.getOut().println("Order submitted: " + message.getOrder()); break; case ORDER_FILL_OK : console.getOut().println("Order filled: " + message.getOrder()); break; case ORDER_CLOSE_OK : console.getOut().println("Order closed: " + message.getOrder()); break; } } |
ストラテジーを起動し、発注パネルから注文してみましょう。
Order submitted、Order filledと表示され、注文が成功した際のメッセージを拾って表示できていることがわかります。
次に、ポジションをクローズしてみます。
ポジションをクローズすると、Order closedのメッセージが表示されました。
このように、onMessage関数ではJForexから送信されるメッセージを拾って処理を行うことができます。
まとめ
今回はストラテジーで利用可能な6つのコールバック関数の振る舞いをコンソールにメッセージを表示させることで確認しました。
それぞれのコールバック関数の役割をイメージできましたでしょうか?
ストラテジーを作成する際はこれらの関数内に処理を記述していくことになります。
コメント