Merge10WLimit .java

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



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

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

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

/**
 このストラテジーは起動時に8つの新規オーダーを行い、onBarメソッドが呼ばれる度にリスト内の2つのポジションをマージします。
ポジションマージのマージ回数上限は4回までです(ロングとショートでそれぞれ4回まで)。
 */
public class Merge10WLimit implements IStrategy {

    private IConsole console;
    private IEngine engine;

    private Instrument instrument = Instrument.EURUSD;
    
    private Map<IOrder, Integer> mergeCounts = new HashMap<IOrder, Integer>();  
    @Override
    public void onStart(IContext context) throws JFException {
        engine = context.getEngine();
        console = context.getConsole();
        context.setSubscribedInstruments(java.util.Collections.singleton(instrument), true);
        console.getOut().println("Start");

        // 4つの買いオーダーと、4つの売りオーダーを行います
        for (int i = 0; i < 8; i++) {
            IOrder order = engine.submitOrder('o' + String.valueOf((char)((int)'A' + i))
                                              , instrument, i % 2 == 1 ? OrderCommand.BUY : OrderCommand.SELL, 0.001 * (i + 1));
            order.waitForUpdate(IOrder.State.FILLED);
        }

        while (engine.getOrders().size() > 1){
            int previousMergeCountTotal = 0;
            String label = "";
            List<IOrder> mergeableOrders = Arrays.asList(engine.getOrders().get(0), engine.getOrders().get(1));
            for(IOrder mergeableOrder : mergeableOrders){
                Integer previousMergeCount = mergeCounts.get(mergeableOrder);
                if(previousMergeCount != null){
                    previousMergeCountTotal += previousMergeCount;
                }
                label += mergeableOrder.getLabel();
            }
            if(previousMergeCountTotal >= 4){
                console.getWarn().println("マージ回数は4回を超えて実施する事は出来ません!");
                break;
            } else {
                IOrder mergedOrder = engine.mergeOrders(label,mergeableOrders.toArray(new IOrder[]{}));
                IMessage message = mergedOrder.waitForUpdate(2, TimeUnit.SECONDS);
                if(message.getType() == IMessage.Type.ORDERS_MERGE_OK){
                    mergeCounts.put(mergedOrder, previousMergeCountTotal+1);
                }
                console.getInfo().println(mergeCounts);
            }
            
        }
    }
    
    @Override
    public void onMessage(IMessage message) throws JFException {
        // 全オーダーオーダーに関するメッセージをログ出力
        if (message.getOrder() != null)
            print(message);
    }

    private void print(Object o) {
        console.getOut().println(o);
    }

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

    @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 {
        for (IOrder o : engine.getOrders())
            o.close();
    }

}








スポンサーリンク

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


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


Top

inserted by FC2 system