トップ  >  リファレンス  >  サンプルソースコード  >  ストラテジーAPI  >  OrderFillAndCloseHistory.java
OrderFillAndCloseHistory.java

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



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

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

import com.dukascopy.api.*;
import com.dukascopy.api.IEngine.OrderCommand;
import static com.dukascopy.api.IMessage.Type.*;

/**
 このストラテジーはオーダーの約定とクローズ履歴を取得する方法のサンプルソースです。 
 */
public class OrderFillAndCloseHistory implements IStrategy {

    @Configurable("通貨ペア")
    public Instrument instrument = Instrument.EURUSD;
    @Configurable(value="取引数量", description ="Please adjust according to your account limits")
    public double maxAmount = 0.01;
    @Configurable("部分クローズの分割数")
    public int partialCloseIncrements = 5;
    
    private IConsole console;
    private IHistory history;
    private IEngine engine;
    private IOrder maxOrder;
    
    private static List<IMessage.Type> AMOUNT_CHANGE_TYPES = Arrays.asList(
                                           new IMessage.Type[] {ORDER_CHANGED_OK, ORDER_CLOSE_OK, ORDER_FILL_OK});
    
    @Override
    public void onStart(IContext context) throws JFException {
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.engine = context.getEngine();
        context.setSubscribedInstruments(new HashSet<Instrument>(Arrays.asList(new Instrument[] {instrument})), true);
        double price = history.getLastTick(instrument).getBid() - instrument.getPipValue();

        // 部分クローズ出来る取引数量でオーダー
        maxOrder = engine.submitOrder("maxOrder", instrument, OrderCommand.SELLLIMIT, maxAmount, price, 0, 0, 0);
    }

    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if(instrument != this.instrument ){
            return;
        }
        if(
               // 新規オーダーが約定されてから10秒経過後にクローズオーダーを行う
               maxOrder.getFillTime() + Period.TEN_SECS.getInterval() < tick.getTime() 
               // 1秒以内に連続してクローズする事は出来ないので、1秒間のインターバルを空ける
               && maxOrder.getCloseTime() + Period.ONE_SEC.getInterval() < tick.getTime()
               && maxOrder.getState() == IOrder.State.FILLED
          ){
            // 約定されていない部分はキャンセルする
            if(Double.compare(maxOrder.getRequestedAmount(), maxOrder.getAmount()) > 0){
                maxOrder.setRequestedAmount(0);
                maxOrder.waitForUpdate(2000);
            }
            maxOrder.close(Math.min(maxOrder.getOriginalAmount() / partialCloseIncrements, maxOrder.getAmount()));
        }
    }

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

    @Override
    public void onMessage(IMessage message) throws JFException {
        IOrder order = message.getOrder();
        if(order == null){
            return;
        }
        console.getOut().println(message);
        if(AMOUNT_CHANGE_TYPES.contains(message.getType())){
            printPartialOrders(order);
        }
    }
    
    private void printPartialOrders(IOrder order){
        for(IFillOrder pfOrder : order.getFillHistory()){
            console.getInfo().println("約定: " + order.getLabel() + " " + pfOrder);
        }
        for(ICloseOrder pfOrder : order.getCloseHistory()){
            console.getInfo().println("クローズ: " + order.getLabel() + " " + pfOrder);
        }
    }

    @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