MergeRemoveSlTp.java

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



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

import java.util.concurrent.TimeUnit;

import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IEngine;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IHistory;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IOrder;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.Period;
import com.dukascopy.api.RequiresFullAccess;
import com.dukascopy.api.util.DateUtils;

/**
 このストラテジーは3つのオーダーを作成し、ストップロスやリミット設定を行います。
それから、ストップロスとリミット設定を解除します、この2つの条件は解除しなければなりません。
マージが完了したら、マージしたオーダーにストップロスの設定を行います。
 */
@RequiresFullAccess
public class MergeRemoveSlTp implements IStrategy {

    private IConsole console;
    private IEngine engine;
    private IHistory history;
    
    private int mergeCount;
                    
    @Override
    public void onStart(IContext context) throws JFException {
        engine = context.getEngine();
        console = context.getConsole();
        history = context.getHistory();
        context.setSubscribedInstruments(java.util.Collections.singleton(Instrument.EURUSD), true);
        console.getOut().println("Start");
        
        double price = history.getLastTick(Instrument.EURUSD).getBid();
        //order1 1千通貨で成行買い(ストップロスとリミットをそれぞれ10pips設定)
        IOrder order1 = engine.submitOrder("order1", Instrument.EURUSD, OrderCommand.BUY , 0.001, 0, 20, price - 0.0010, price + 0.0010);
        //order2 2千通貨で成行売り(ストップロスとリミットの設定は無し)
        IOrder order2 = engine.submitOrder("order2", Instrument.EURUSD, OrderCommand.SELL, 0.002, 0, 20, 0             , 0             );
        //order3 2千通貨で成行買い(ストップロス10pips設定)
        IOrder order3 = engine.submitOrder("order3", Instrument.EURUSD, OrderCommand.BUY , 0.002, 0, 20, price - 0.0010, 0             );
        
        // 成行オーダーのオーダー状態FILLED待ち
        order1.waitForUpdate(2000, IOrder.State.FILLED);
        order2.waitForUpdate(2000, IOrder.State.FILLED);
        order3.waitForUpdate(2000, IOrder.State.FILLED);
        
        // リミットとストップロスを削除
        removeSlTp(order1, order2, order3);
        
        IOrder mergedOrder = engine.mergeOrders("mergedOrder" + ++mergeCount, order1, order2, order3);
        IMessage message = mergedOrder.waitForUpdate(2, TimeUnit.SECONDS);
        // MESSAGE_MERGE_OK か MESSAGE_MERGE_REJECTED のいずれかを受信した。
        print("ポジションマージされました: " + message.getType() + " - " + message);
        // マージ完了したオーダーのオーダー状態がFILLEDだったら(マージした取引量が0以外である事)
        if(mergedOrder.getState() == IOrder.State.FILLED){
            double slPrice = mergedOrder.isLong() ? price - 0.0010 : price + 0.0010;
            mergedOrder.setStopLossPrice(slPrice);
        }
    }
    
    private void removeSlTp(IOrder... orders) throws JFException{

        // オーダーにストップロスとリミットが設定されていたら、設定を削除する
        for(IOrder o: orders){
            if(Double.compare(o.getStopLossPrice(),0) != 0){
                o.setStopLossPrice(0);
                print(o.getLabel() + " のストップロスを削除しました。");
                o.waitForUpdate(2000);                
            }
            if(Double.compare(o.getTakeProfitPrice(),0) != 0){
                o.setTakeProfitPrice(0);
                print(o.getLabel() + " のリミットを削除しました。");
                o.waitForUpdate(2000);                
            }
        }        
    }


    @Override
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
    
    @Override
    public void onMessage(IMessage message) throws JFException {
        // 全オーダーに関するメッセージをログ出力
        if (message.getOrder() != null)
            print("<html><font color=\"gray\">" + DateUtils.format(message.getCreationTime()) + " - "+ message+"</font>");
    }
    
    private void print(Object o) {
        console.getOut().println(o);
    }

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

    @Override
    public void onStop() throws JFException {
        for (IOrder o : engine.getOrders())
            o.close();
    }

    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {}

}





スポンサーリンク

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


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


Top

inserted by FC2 system