バックテスト

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);
        //18:00以降のデータをロードしているかチェックします
        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) {}

    //18:00を過ぎたらストラテジーを停止します
    @Override
    public boolean stopJob() {
        return past18;
    }
   
});









GUIモードでのバックテスト

JForex外でチャート操作する為のスタンドアローンAPIインターフェースを提供しています。
GUIモードでのストラテジーをテストする例は、サンプルソースコードを参照して下さい。

サンプルソースコード:TesterMainGUIMode.java

このセクションでは、サンプルの機能拡張の紹介をします。
例えば、チャート期間を変更したり、複数チャート追加したり、インジケータを追加する等…


チャートタイプ変更

チャートフィードデータはIFeedDescriptorで定義され、タイプはDataTypeで定義されています。
以下のタイプが定義されています。
  • ローソク足(標準およびカスタム期間)
  • ティック
  • ティックバー
  • レンジバー
  • ポイントアンドフィギュア
  • 蓮子バー(レンガ)

ベースサンプルに、フィードデータとユーザーがチャート更新出来るようにツールバーを追加します。




サンプルソースコード:GUIModeChartTypes.java

注意:ローソク足とティック以外のタイプは、初めてフィードを取得する時はある程度時間がかかります。
その為、読み込み時間を短縮するには、下にある横軸を操作して水平スケールを縮めて(チャート上のバー数を減らして)ください。


残高、有効証拠金、損益を追加

チャートに残高、有効証拠金、損益を追加します。
追加する為には以下3ステップを実行します。
  • インジケータ表示選択するITesterIndicatorsParametersを実装します。
  • 特定の通貨ペアにインジケータ設定をバインドするITesterVisualModeParametersを実装します。
  • ITesterVisualModeParametersパラメータを持っているITesterClient.startStrategyを呼び出します。



 // IndicatorParameterBeanの実装
    final class IndicatorParameterBean implements ITesterIndicatorsParameters {
        @Override
        public boolean isEquityIndicatorEnabled() {
            return true;
        }
        @Override
        public boolean isProfitLossIndicatorEnabled() {
            return true;
        }
        @Override
        public boolean isBalanceIndicatorEnabled() {
            return true;
        }
    }
    // TesterVisualModeParametersBeanの実装
    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作成
    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());

            // EURUSDの10分足とティックチャート表示
            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);





スポンサーリンク

スポンサーリンク
検索
リファレンスツリー


Copyright ©2016 JForexAPIで自動売買させ隊! All Rights Reserved.


Top

inserted by FC2 system