ITesterClient機能
ITesterClientインターフェースはIClient機能拡張したものです。
ITesterClientインターフェースはヒストリカルデータを操作する為、排他的に使用されます。
このページでは主なITesterClient機能のサンプルを紹介します。
サンプルプログラムはJForex-SDKプロジェクトのTesterMain.javaをベースにしています。
Thus in order to test attachment-less snippets one should simply integrate them in the TesterMain.java example program.
特定のヒストリカル期間でのテスト
デフォルトではストラテジーは前日からの期間に対してテストを行います。
ユーザーは以下の方法でテスト期間を変更する事が出来ます。
final SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Date dateFrom = dateFormat.parse("05/25/2011 12:00:00");
Date dateTo = dateFormat.parse("05/26/2011 00:00:00");
client.setDataInterval(DataLoadingMethod.ALL_TICKS, dateFrom.getTime(), dateTo.getTime());
DataLoadingMethodの引数はストラテジーに渡されるティック集を渡します。
アカウントデータ変更
ITesterClientインターフェースはヒストリカルデータの為にアカウントデータを変更するメソッド集が含まれています。
これはJForexクライアントで使われているもの([Historical_Tester#Account|Historical Tester])に似ています。
例えば、以下のようにデフォルトアカウントパラメータ値を変更します。
client.setInitialDeposit( Instrument.EURUSD.getSecondaryCurrency(), 150000);
client.setLeverage( 80 );
client.setMarginCutLevel( 150);
レポート設定
レポートでテスト結果を見たい場合は、ISystemListenerのonStopメソッドに以下ロジックを追加します。
@Override
public void onStop(long processId) {
LOGGER.info("ストラテジー停止: " + processId);
File reportFile = new File("C:\\temp\\report.html");
try {
client.createReport(processId, reportFile);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
if (client.getStartedStrategies().size() == 0) {
System.exit(0);
}
}
レポート用に2つのオプションがあります(デフォルトでは両方共有効になっています)。
- setProcessingStatsEnabledは、コールバックメソッド([Overview#IStrategy_interface|IStrategy])や、インジケータ算出や、ティック/バー処理等それぞれに費やされた合計時間等の処理情報を追加します。
- setEventLogEnabledは、全てのオーダー状態の変化がログに追加されます。
この2つのメソッドはIClientの認証成功後に適用しなければなりません。
Note that the method setGatherReportData leaves no effect on the report content and effectively is deprecated.
レポートファイルのカスタマイズ
レポートはHTMLファイルで出力され、これはテキストファイル(HTMLフォーマットルールに従います)のように編集可能です。
サンプルプログラムでは、結果テーブルに行を挿入します。
サンプルソースコード:
TesterMainCustomReport.java
各ストラテジー毎のレポート
レポートファイル名にプロセスIDを含めることで、各ストラテジー毎のレポート作成する事が出来ます。
@Override
public void onStop(long processId) {
LOGGER.info("ストラテジー停止: " + processId);
File reportFile = new File("C:\\temp\\report"+processId+".html");
try {
client.createReport(processId, reportFile);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
if (client.getStartedStrategies().size() == 0) {
System.exit(0);
}
}
ストラテジープログレスリスナー
LoadingProgressListenerインターフェースはプログレスバーとして機能します。
dataLoadedメソッドで30分毎に現在のポジションをユーザーにアナウンスします。
ユーザーはstopJobコールバックメソッドからtrueを返す事で、実行中のストラテジーをキャンセルする事が出来ます。
18:00過ぎたらストラテジーを停止させます。
client.startStrategy(new BarPrinter(), new LoadingProgressListener() {
@SuppressWarnings("serial")
private SimpleDateFormat sdf = new SimpleDateFormat(" MM/dd/yyyy HH:mm:ss,") {{
setTimeZone(TimeZone.getTimeZone("GMT"));
}};
private boolean past18 = false;
@Override
public void dataLoaded(long start, long end, long currentPosition, java.lang.String information) {
LOGGER.info(information + sdf.format(start) + sdf.format(end) + sdf.format(currentPosition ));
sdf.getCalendar().setTimeInMillis(currentPosition);
if (sdf.getCalendar().get(Calendar.HOUR_OF_DAY) >= 18){
LOGGER.info(" > 18");
past18 = true;
}
}
@Override
public void loadingFinished(boolean allDataLoaded, long start, long end, long currentPosition) {}
@Override
public boolean stopJob() {
return past18;
}
});
GUIモードでのバックテスト
JForex外でチャート操作する為のスタンドアローンAPIインターフェースを提供しています。
GUIモードでのストラテジーをテストする例は、サンプルソースコードを参照して下さい。
サンプルソースコード:
TesterMainGUIMode.java
このセクションでは、サンプルの機能拡張の紹介をします。
例えば、チャート期間を変更したり、複数チャート追加したり、インジケータを追加する等…
チャートタイプ変更
チャートフィードデータはIFeedDescriptorで定義され、タイプはDataTypeで定義されています。
以下のタイプが定義されています。
- ローソク足(標準およびカスタム期間)
- ティック
- ティックバー
- レンジバー
- ポイントアンドフィギュア
- 蓮子バー(レンガ)
ベースサンプルに、フィードデータとユーザーがチャート更新出来るようにツールバーを追加します。
サンプルソースコード:
GUIModeChartTypes.java
注意:ローソク足とティック以外のタイプは、初めてフィードを取得する時はある程度時間がかかります。
その為、読み込み時間を短縮するには、下にある横軸を操作して水平スケールを縮めて(チャート上のバー数を減らして)ください。
残高、有効証拠金、損益を追加
チャートに残高、有効証拠金、損益を追加します。
追加する為には以下3ステップを実行します。
- インジケータ表示選択するITesterIndicatorsParametersを実装します。
- 特定の通貨ペアにインジケータ設定をバインドするITesterVisualModeParametersを実装します。
- ITesterVisualModeParametersパラメータを持っているITesterClient.startStrategyを呼び出します。
final class IndicatorParameterBean implements ITesterIndicatorsParameters {
@Override
public boolean isEquityIndicatorEnabled() {
return true;
}
@Override
public boolean isProfitLossIndicatorEnabled() {
return true;
}
@Override
public boolean isBalanceIndicatorEnabled() {
return true;
}
}
final class TesterVisualModeParametersBean implements ITesterVisualModeParameters {
@Override
public Map<Instrument, ITesterIndicatorsParameters> getTesterIndicatorsParameters() {
Map<Instrument, ITesterIndicatorsParameters> indicatorParameters = new HashMap<Instrument, ITesterIndicatorsParameters>();
IndicatorParameterBean indicatorParameterBean = new IndicatorParameterBean();
indicatorParameters.put(Instrument.EURUSD, indicatorParameterBean);
return indicatorParameters;
}
}
TesterVisualModeParametersBean visualModeParametersBean = new TesterVisualModeParametersBean();
client.startStrategy(
new MA_Play(),
new LoadingProgressListener() {
@Override
public void dataLoaded(long startTime, long endTime, long currentTime, String information) {
LOGGER.info(information);
}
@Override
public void loadingFinished(boolean allDataLoaded, long startTime, long endTime, long currentTime) {
}
@Override
public boolean stopJob() {
return false;
}
},
visualModeParametersBean,
this,
this
);
サンプルソースコード:
GUIModePlBalanceEquity.java
複数チャート追加
登録した通貨ペアのチャートを追加する事が出来ます。
追加したチャートは異なる時間軸にする事も可能です。
チャートはsetChartPanelsメソッドで追加出来ます。
以下サンプルでは、事前にEURUSDの登録処理を行っていて、EURUSDの10分足チャートとティックチャートを表示します。
public void setChartPanels(Map<IChart, ITesterGui> chartPanels) {
if (chartPanels != null && chartPanels.size() > 0) {
for (IChart chart : chartPanels.keySet()) {
LOGGER.debug("Chart for instrument" + chart.getInstrument().toString());
Instrument instrument = chart.getInstrument();
setTitle(instrument.toString() + " "+ chart.getSelectedOfferSide() + " "+ chart.getSelectedPeriod());
if (chart.getInstrument().equals(Instrument.EURUSD)) {
IFeedDescriptor feedDescriptor = new FeedDescriptor();
feedDescriptor.setDataType(DataType.TICKS);
feedDescriptor.setInstrument(Instrument.EURUSD);
chartPanels.get(chart).getTesterChartController().setFeedDescriptor(feedDescriptor);
} else {
IFeedDescriptor feedDescriptor = new FeedDescriptor();
feedDescriptor.setDataType(DataType.TIME_PERIOD_AGGREGATION);
feedDescriptor.setOfferSide(OfferSide.BID);
feedDescriptor.setInstrument(Instrument.EURUSD);
feedDescriptor.setPeriod(Period.TEN_MINS);
chartPanels.get(chart).getTesterChartController().setFeedDescriptor(feedDescriptor);
}
JPanel chartPanel = chartPanels.get(chart).getChartPanel();
addChartPanel(chartPanel);
}
}
}
注意:ベースのGUIサンプルから変更する場合、addChartPanelメソッドからremovecurrentChartPanelの呼び出しを削除して下さい。
サンプルソースコード:
GUIModeMultiChart.java
チャート制御追加
ITesterChartControllerインターフェースで、バックテスト中のチャートの上に以下のものを追加出来ます。
- 時間軸とAsk/Bidチャートの切り替え
- インジケータ追加
- チャートオブジェクト追加
- チャートのズーム
サンプルソースコード:
GUIModeChartControls.java
チャート時間軸変更
チャートの時間軸を変更するコンボボックスの作成例です。
class JPeriodComboBox extends JComboBox implements ItemListener {
private JFrame mainFrame = null;
private Map<IChart, ITesterGui> chartPanels = null;
private Map<Period, DataType> periods = new LinkedHashMap<Period, DataType>();
public void setChartPanels(Map<IChart, ITesterGui> chartPanels) {
this.chartPanels = chartPanels;
IChart chart = chartPanels.keySet().iterator().next();
this.setSelectedItem(chart.getSelectedPeriod());
}
public JPeriodComboBox(JFrame mainFrame){
this.mainFrame = mainFrame;
this.addItemListener(this);
periods.put(Period.THIRTY_SECS, DataType.TIME_PERIOD_AGGREGATION);
periods.put(Period.FIVE_MINS, DataType.TIME_PERIOD_AGGREGATION);
periods.put(Period.TEN_MINS, DataType.TIME_PERIOD_AGGREGATION);
periods.put(Period.THIRTY_MINS, DataType.TIME_PERIOD_AGGREGATION);
for(Period period: periods.keySet()){
this.addItem(period);
}
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if(chartPanels != null && chartPanels.size() > 0){
IChart chart = chartPanels.keySet().iterator().next();
ITesterGui gui = chartPanels.get(chart);
ITesterChartController chartController = gui.getTesterChartController();
Period period = (Period)e.getItem();
DataType dataType = periods.get(period);
chartController.changePeriod(dataType, period);
mainFrame.setTitle(chart.getInstrument().toString() + " " + chart.getSelectedOfferSide() + " " + chart.getSelectedPeriod());
}
}
}
}
サンプルソースコード:
GUIModeChartControls.java
注意:コンボボックスはITesterUserInterface.setChartPanelsメソッドから作成され、addControlPanelメソッドとsetChartPanelsの呼び出しで初期化されます。
インジケータとチャートオブジェクト追加
以下例で、インジケータを追加するボタンと、チャートに水平線を追加するボタンを作成します。
JButton addIndicatorsButton = new JButton("Add Indicators");
addIndicatorsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getChartController().addIndicators();
}
});
controlPanel.add(addIndicatorsButton);
JButton addVerticalLineButton = new JButton("Add Vertical Line");
addVerticalLineButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getChartController().activateVerticalLine();
}
});
controlPanel.add(addVerticalLineButton);
ズーム変更
以下例は、チャートのズームを変更する為のボタンを作成します。
JButton zoomInButton = new JButton("Zoom In");
zoomInButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getChartController().zoomIn();
}
});
controlPanel.add(zoomInButton);
JButton zoomOutButton = new JButton("Zoom Out");
zoomOutButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getChartController().zoomOut();
}
});
controlPanel.add(zoomOutButton);