ChartUsage.java

注意事項:
サンプルソースコードには実際にオーダーを発注するものがあります。
サンプルソースコードのストラテジーを起動する場合は、必ずデモ口座で行ってください。



// Copyright (c) 2009 Dukascopy (Suisse) SA. All Rights Reserved.

package charts;

import com.dukascopy.api.*;
import java.util.HashSet;
import java.util.Set;

//1. インポート追加 
import com.dukascopy.api.drawings.IChartObjectFactory;
import com.dukascopy.api.drawings.IOhlcChartObject;
import com.dukascopy.api.indicators.OutputParameterInfo.DrawingStyle;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;



public class ChartUsage implements IStrategy { 
    private IEngine        engine;
    private IConsole       console;
    private IHistory       history;
    private IContext       context;
    private IIndicators    indicators;
    private IUserInterface userInterface;

    private IBar           previousBar;
    private IOrder         order;

    //2. インスタンス変数追加
    private IChart              openedChart;
    private IChartObjectFactory factory;
    private int                 signals;
                    
    private static final int PREV = 1;
    private static final int SECOND_TO_LAST = 0;
      
    // パラメータを定義します
    @Configurable( value = "通貨ペア" )
    public Instrument myInstrument = Instrument.EURGBP;
    @Configurable( value = "オーダータイプ", obligatory = true )
    public OfferSide myOfferSide = OfferSide.ASK;
    @Configurable( value = "時間軸" )
    public Period myPeriod = Period.TEN_MINS;
    @Configurable( "SMA期間" )
    public int smaTimePeriod = 30;

    //3. パラメータ追加 
    @Configurable("チャート上にOHLCインデックス表示")
    public boolean addOHLC = true;
    @Configurable("フィルター")
    public Filter filter = Filter.WEEKENDS;
    @Configurable("SMA描画")
    public boolean drawSMA = true;
    @Configurable("ストラテジー停止時にチャートを閉じる")
    public boolean closeChart;
    
   
    
    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();

        // 4.インスタンス変数の初期化
        this.openedChart = context.getChart(myInstrument);              
        this.factory     = openedChart.getChartObjectFactory();

        // 対象の通貨ペアを通貨ペアリストに登録します
        Set<Instrument> instruments = new HashSet<Instrument>();
        instruments.add(myInstrument);
        context.setSubscribedInstruments(instruments, true);

        // 5. SMAインジケータを表示させるかパラメータをチェックします。
        // Onの場合はaddToChartメソッドを実行し、チャートにインジケータを追加します。addToChartメソッドはブーリアン値を返します。
        // チャートにインジケータ追加出来ない場合は、エラーメッセージが出力されます。
    
        if( drawSMA )
            if( !addToChart(openedChart) ){
                printMeError("チャート上にインジケータをプロット出来ませんでした。チャートの設定値を確認して下さい。");
            }
    }

    public void onAccount(IAccount account) throws JFException {
    }

    
    // IMessagesからオーダー関連のメッセージをフィルタリングし、Strategyタブへログ出力します。
    public void onMessage(IMessage message) throws JFException {        
        if( message.getOrder() != null )
            console.getOut().println("オーダーラベル: " + message.getOrder().getLabel() + " || メッセージログ: " + message.getContent());
    }

    //6. パラメータ設定でストラテジー停止時にチャートを閉じる設定にしている場合に、チャートを閉じる
    public void onStop() throws JFException {
        if( closeChart )
            context.closeChart(openedChart);
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
    }
    
        
      
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {            

        // 通貨ペアと時間軸でフィルタリング
        if (!instrument.equals(myInstrument) || !period.equals(myPeriod)) {
            return; // 終了
        }

        int candlesBefore = 2, candlesAfter = 0;
        // SMAの最後の確定バーと、最後から2つ目の確定バーを取得
        previousBar = myOfferSide == OfferSide.ASK ? askBar : bidBar;
        long currBarTime = previousBar.getTime();
        double sma[] = indicators.sma(instrument, period, myOfferSide, IIndicators.AppliedPrice.CLOSE,
                smaTimePeriod, Filter.NO_FILTER, candlesBefore, currBarTime, candlesAfter);
    
        IEngine.OrderCommand myCommand = null;
        printMe( String.format("SMAの値: 2つ前 = %.5f; 1つ前 = %.5f", sma[SECOND_TO_LAST], sma[PREV]));        
        if( sma[PREV] > sma[SECOND_TO_LAST]){
            printMe("SMA上昇"); // インジケータが上昇している
            myCommand = IEngine.OrderCommand.BUY;
        } else if ( sma[PREV] < sma[SECOND_TO_LAST]){
            printMe("SMA下降"); // インジケータが下降している
            myCommand = IEngine.OrderCommand.SELL;
        } else {
            return;
        }
    
        order = engine.getOrder("MyStrategyOrder");                      
        if (order != null && engine.getOrders().contains(order) && order.getOrderCommand() != myCommand){
            order.close();
            order.waitForUpdate(IOrder.State.CLOSED); // ポジションがクローズされるまで待ちます
            console.getOut().println( order.getLabel() + " ラベルのポジションをクローズしました");            
        }

        if ( order == null || !engine.getOrders().contains(order) ){
            engine.submitOrder("MyStrategyOrder" , instrument, myCommand, 0.001);

            // 7.オーダー時に矢印を描画します。
            // その為、現在のバーの時間を取得する必要があります。確定したバー(previousBar)の時間に時間軸分の時間を加算します。
            long time = previousBar.getTime() + myPeriod.getInterval();
    
            // 8.IChartObjectを作成します。テキストラベル配列に上矢印または下矢印を追加します。
            // 最後に、チャートにIChartObjectオブジェクトを追加します
            IChartObject signal = myCommand.isLong() ?
                    factory.createSignalUp("signalUpKey" + signals++, time, previousBar.getLow() - instrument.getPipValue()*2)
                    : factory.createSignalDown("signalDownKey" + signals++, time, previousBar.getHigh() + instrument.getPipValue()*2);
    
            signal.setText(String.format("delta SMA %+.7f", sma[PREV] - sma[SECOND_TO_LAST]), new Font("Monospaced", Font.BOLD, 12));
            openedChart.addToMainChart(signal);
        }  

    } //onBarメソッド終了
    
    private void printMe(Object toPrint){
        console.getOut().println(toPrint);
    }

    //9. Strategy出力にエラーメッセージを出力するメソッドを追加
    private void printMeError(Object o){
        console.getErr().println(o);
    }
    
            
    // このメソッドは、パラメータの要求通りのチャートが開かれているからチェックします。
    // チャートが開かれていない場合は処理終了しfalseを返します。
    // チャートにインジケータ(SMA等)を追加します。  
    // OHLCを表示するパラメータ設定のチェックし、OHLC表示します。
    

    private boolean addToChart(IChart chart){
        if (chart == null){
            printMeError(myInstrument + " の通貨ペアチャートが開かれていません。");    
            return false;
        }
        if (chart.getSelectedOfferSide() != this.myOfferSide) {
            printMeError("チャートのオーダータイプ(アスク/ビッド)と一致していません:" + this.myOfferSide);
            return false;
        }  
        if (chart.getSelectedPeriod() != this.myPeriod) {
            printMeError(this.myPeriod + "の時間軸チャートが開かれていません。");
            return false;
        }
        if (chart.getFilter() != this.filter){
            printMeError("chart filter is not " + this.filter);
            return false;
        }
           
        chart.addIndicator(indicators.getIndicator("SMA"), new Object[] {smaTimePeriod},
                new Color[]{Color.GREEN}, new DrawingStyle[]{DrawingStyle.LINE}, new int[]{3});
       
        // ユーザーがOHLC表示選択をしていた場合にチャートに追加します。
        if(addOHLC){
    
            // 既存のOHLCオブジェクトを検出した場合、 ohlc変数に値を設定します。
            IOhlcChartObject ohlc = null;
            for (IChartObject obj : chart.getAll()) {
                if (obj instanceof IOhlcChartObject) {
                    ohlc = (IOhlcChartObject) obj;
                }
            }
    
            // OHLCオブジェクトが無い場合、 ohlc変数に値を設定し、新たにオブジェクトを作成します。
            if (ohlc == null) {
                ohlc = chart.getChartObjectFactory().createOhlcInformer();
                ohlc.setPreferredSize(new Dimension(100, 200));
                chart.addToMainChart(ohlc);
            }
    
            // OHLCインデックスを表示
            ohlc.setShowIndicatorInfo(true);
        }
        return true;
    }// addToChartメソッドの終了
    
    
}




スポンサーリンク

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


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


Top

inserted by FC2 system