PlotEmaMacdWithOhlc.java

注意事項:
サンプルソースコードには実際にオーダーを発注するものがあります。
サンプルソースコードのストラテジーを起動する場合は、注意して下さい。



// Copyright (c) 2009 Dukascopy (Suisse) SA. All Rights Reserved.
package jforex.strategies.indicators;

import com.dukascopy.api.Configurable;
import com.dukascopy.api.Filter;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IChart;
import com.dukascopy.api.IChartObject;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IIndicators;
import com.dukascopy.api.IIndicators.AppliedPrice;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import com.dukascopy.api.drawings.IOhlcChartObject;
import com.dukascopy.api.feed.util.TimePeriodAggregationFeedDescriptor;
import com.dukascopy.api.util.DateUtils;

/**
 最後に確定したローソク足のMACD値とEMA値を算出してログ出力します。
 またチャート上にインジケータを追加し、OHLC情報にインジケータのオプション情報を追加します。
 */
public class PlotEmaMacdWithOhlc implements IStrategy {
    private IConsole console;
    private IIndicators indicators;
    
    @Configurable("通貨ペア")
    public Instrument instrument = Instrument.EURUSD;
    @Configurable("時間軸")
    public Period period = Period.TEN_SECS;
    @Configurable("フィルター")
    public Filter filter = Filter.NO_FILTER;
    @Configurable("オファーサイド")
    public OfferSide side = OfferSide.BID;
    @Configurable("EMA期間")
    public int emaTimePeriod = 12;
    @Configurable("MACDシグナル期間")
    public int macdSignalPeriod = 9;
    @Configurable("MACD短期期間")
    public int macdSlowPeriod = 26;
    @Configurable("MACD長期期間")
    public int macdFastPeriod = 12;
    
   
    public void onStart(IContext context) throws JFException {
        this.console = context.getConsole();
        this.indicators = context.getIndicators();
        
        IChart chart = null;
        for(IChart c : context.getCharts(instrument)){
            if(c.getSelectedOfferSide() == this.side
                    && c.getSelectedPeriod() == this.period
                    && c.getFilter() == this.filter){
                chart = c;
                break;
            }
            if(c.getFilter() != this.filter){
                console.getErr().println("プラットフォームとストラテジーのフィルターが一致していません。");
                context.stop();
            }
        }
        if(chart == null){
            chart = context.openChart(new TimePeriodAggregationFeedDescriptor(instrument, period, side, filter));
        }
        
        chart.add(indicators.getIndicator("EMA "), new Object[] { emaTimePeriod });
        chart.add(indicators.getIndicator("MACD"), new Object[] { macdFastPeriod, macdSlowPeriod, macdSignalPeriod });

        IOhlcChartObject ohlc = null;
        for (IChartObject obj : chart.getAll()) {
            if (obj instanceof IOhlcChartObject) {
                ohlc = (IOhlcChartObject) obj;
            }
        }
        if (ohlc == null) {
            ohlc = chart.getChartObjectFactory().createOhlcInformer();
            chart.add(ohlc);
        }
        ohlc.setShowIndicatorInfo(true);
        
        // calculate on the previous bar over candle interval such that the filters get used
        long time = context.getHistory().getBar(instrument, period, side, 1).getTime();

        double[][] macd = indicators.macd(
                                              instrument,
                                              period,
                                              side,
                                              AppliedPrice.CLOSE,
                                              macdFastPeriod,
                                              macdSlowPeriod,
                                              macdSignalPeriod,
                                              filter,
                                              1,
                                              time,
                                              0
                                             );

        double[]   ema  = indicators.ema(
                                              instrument,
                                              period,
                                              side,
                                              AppliedPrice.CLOSE,
                                              emaTimePeriod,
                                              filter,
                                              1,
                                              time,
                                              0
                                             );
        
        console.getOut().format("%s - ema=%s, macd=%s (by candle interval)",
                                DateUtils.format(time), arrayToString(ema), arrayToString(macd)).println();
    }
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        if(instrument != this.instrument || period != this.period){
            return;
        }

        // calculate by shift (Filter.NO_FILTER gets used at all times) for the bar that just finished
        double[] macd = indicators.macd(
                                              instrument,
                                              period,
                                              side,
                                              AppliedPrice.CLOSE,
                                              macdFastPeriod,
                                              macdSlowPeriod,
                                              macdSignalPeriod,
                                              1
                                            );

        double   ema = indicators.ema(
                                              instrument,
                                              period,
                                              side,
                                              AppliedPrice.CLOSE,
                                              emaTimePeriod,
                                              1
                                          );
        
        console.getOut().format("%s - ema=%.5f, macd=%s (by shift)",
                                DateUtils.format(bidBar.getTime()), ema, arrayToString(macd)).println();
    }

    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 {    }


    private static String arrayToString(double[] arr) {
        StringBuilder str = new StringBuilder();
        for (int r = 0; r < arr.length; r++) {
            str.append(String.format("[%s] %.5f; ", r, arr[r]));
        }
        return str.toString();
    }
    
    private static String arrayToString(double[][] arr) {
        StringBuilder sb = new StringBuilder();
        for (int r = 0; r < arr.length; r++) {
            for (int c = 0; c < arr[r].length; c++) {
                sb.append(String.format("[%s][%s] %.5f; ",r, c, arr[r][c]));
            }
            sb.append("; ");
        }
        return sb.toString();
    }
    
}







スポンサーリンク

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


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


Top

inserted by FC2 system