TrailingStepTest.java

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



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

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import com.dukascopy.api.*;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IMessage.Reason;

/**
 トレーリングステップに従ってストップロスを追跡します。
 このストラテジーはロングとショートの2つのポジションを持ち、
 どちらかのポジションがストップロスでクローズされ、もう一方のポジションはトレーリングステップによってストップロスが更新されます。
*/
public class TrailingStepTest implements IStrategy {

    @Configurable("通貨ペア")
    public Instrument instrument = Instrument.EURUSD;
    @Configurable("トレーリングステップ")
    public int trailingStep = 10;
    
    private IConsole console;
    private IEngine engine;
    private IHistory history;
    
    private Map<IOrder, Integer> slMoves = new HashMap<IOrder, Integer>();
    

    @Override
    public void onStart(IContext context) throws JFException {
        console = context.getConsole();
        engine = context.getEngine();
        history = context.getHistory();
        
        context.setSubscribedInstruments(new HashSet<Instrument>(Arrays.asList(new Instrument[]{instrument})), true);
        
        ITick tick = history.getLastTick(instrument);

        // ロングエントリー
        IOrder order = engine.submitOrder("buyWithTrailing_"+tick.getTime(), instrument, OrderCommand.BUY, 0.001);
        order.waitForUpdate(2000, IOrder.State.FILLED);     
        slMoves.put(order, 0);
        order.setStopLossPrice(tick.getBid() - instrument.getPipValue() * 10, OfferSide.BID, trailingStep);

        // ショートエントリー
        order = engine.submitOrder("sellWithTrailing_"+tick.getTime(), instrument, OrderCommand.SELL, 0.001);
        order.waitForUpdate(2000, IOrder.State.FILLED);
        slMoves.put(order, 0);
        order.setStopLossPrice(tick.getAsk() + instrument.getPipValue() * 10, OfferSide.ASK, trailingStep);

    }

    @Override
    public void onMessage(IMessage message) throws JFException {
        IOrder order = message.getOrder();
        if (order == null || !slMoves.containsKey(order)) {
            // 関係の無いメッセージは出力しない
            return;
        }
        console.getOut().println(message);
        if (message.getType() == IMessage.Type.ORDER_CHANGED_OK && message.getReasons().contains(Reason.ORDER_CHANGED_SL)) {
            slMoves.put(order, slMoves.get(order) + 1);
            console.getInfo().format("%sラベルのオーダーのストップロスを%.5fに更新\n ストップロスを移動: %s", 
                                     order.getLabel(), order.getStopLossPrice(), slMoves).println();
        } else if (message.getType() == IMessage.Type.ORDER_CLOSE_OK){
            slMoves.remove(order);
        }

    }
    

    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if(instrument != this.instrument){
            return;
        }
        for(Map.Entry<IOrder, Integer> tsMove : slMoves.entrySet()){
            IOrder order = tsMove.getKey();
            int moveCount = tsMove.getValue();
            // 最初のストップロスが正しく移動されるのは、オーダー約定後です。
            if(order.getProfitLossInPips() > trailingStep && moveCount < 2){
                console.getErr().format("%sラベルのオーダーの含み益は%.1%f pipsですが、ストップロスが移動されていません。 ",
                                        order.getLabel(), order.getProfitLossInPips()).println();
            }
        }
    }

    @Override
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }


    @Override
    public void onAccount(IAccount account) throws JFException {
    }

    @Override
    public void onStop() throws JFException {
    }
}







スポンサーリンク

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


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


Top

inserted by FC2 system