オーダー管理


IEngineインタフェースで提供されているメソッドを使って、既存のオーダーにアクセスする事が出来ます。
IEngineはアカウントの全アクティブオーダー(現在のストラテジーまたは他ストラテジーによるオーダーでも)で動作します。
getOrderメソッドはオーダーラベルで既存のオーダーを取得します。
getOrderByIdメソッドはIDで既存のオーダーを取得します。


IEngine engine       = context.getEngine();
IOrder  orderByLabel = engine.getOrder("label");
IOrder  orderById    = engine.getOrderById("id");


getOrdersメソッドはアクティブオーダー(オーダー状態がCREATED, OPENED, FILLEDのオーダー)のリストを返します。
以下例では、アクティブオーダーを全てログ出力します。


console.getOut().println("アクティブオーダー: " + engine.getOrders())


通貨ペアを指定してアクティブオーダーリストを取得する事が出来ます。


List<IOrder> instrumentOrders = engine.getOrders(Instrument.EURUSD);



全オーダーの含み益と含み損を取得する

以下例は、含み益中の全アクティブオーダーリストを選択します。


List<IOrder> orders = new ArrayList<IOrder>();
for(IOrder o : engine.getOrders()){
    if(o.getProfitLossInUSD() >= 0){
        orders.add(o);
    }
}



保留中のオーダーを全て取得する

以下例は、保留中の全オーダーリストを選択します。


List<IOrder> orders = new ArrayList<IOrder>();
for(IOrder o : engine.getOrders()){
    if(o.getState() == IOrder.State.OPENED){
        orders.add(o);
    }
}


オーダー状態についてはオーダー状態のページを参照して下さい。



特定のオーダーグループの情報をログ出力・クローズ

特定のグループの全オーダー情報をログ出力したり、特定のグループの全オーダーに対してクローズするストラテジーを作成例です。
ログ情報は10秒毎に出力されます。
グループは以下リストの通りです。
  1. アクティブオーダー
  2. 保留中オーダー
  3. 含み益オーダー
  4. 含み損オーダー

ストラテジーパラメータの設定に応じて、特定のグループのオーダーをクローズします。


public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    if(instrument != EURUSD || period != Period.TEN_SECS){
        return;
    }
    console.getOut().println("アクティブオーダー: " + engine.getOrders());
    console.getOut().println("保留中オーダー    : " + getPendingOrders());
    console.getOut().println("含み益オーダー    : " + getProfitOrders());
    console.getOut().println("含み損オーダー    : " + getLossOrders()); 
    
    if(closeAllActive ) closeOrders(engine.getOrders());
    if(closeAllPending) closeOrders(getPendingOrders());
    if(closeAllProfit ) closeOrders(getProfitOrders());
    if(closeAllLoss   ) closeOrders(getLossOrders());
}

private void closeOrders(List<IOrder> orders) throws JFException{
    for(IOrder o: orders){
        if(o.getState() == IOrder.State.FILLED || o.getState() == IOrder.State.OPENED){
            o.close();
        }
    }
}



サンプルソースコード:OrderManagementPL.java







ポジションの損益集計

以下例は、ポジションの損益集計結果を指定したログ出力間隔の時間経過毎にログ出力します。


public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    if(instrument != this.printInstrument || period != this.printPeriod)
        return;
    
    double profitLoss = 0;
    for (IOrder order : engine.getOrders()) {
        if (order.getState() == IOrder.State.FILLED){
            profitLoss += order.getProfitLossInUSD();
        }
    }
    console.getOut().format("%s 損益 = $%.5f ", DateUtils.format(askBar.getTime() + period.getInterval()),profitLoss).println();

}



サンプルソースコード:LogProfitLoss.java







各通貨ペア毎の損益とポジションの集計

以下例は、ストラテジー起動時に各通貨ペア毎の損益とポジションの集計結果をログ出力します。


@Override
public void onStart(IContext context) throws JFException {
    this.engine = context.getEngine();
    this.console = context.getConsole();
    for(Instrument instrument : context.getSubscribedInstruments()){
        double profitLoss = 0;
        double amount = 0;
        int filledOrders = 0;
        for (IOrder order : engine.getOrders(instrument)) {
            if (order.getState() == IOrder.State.FILLED){
                profitLoss += order.getProfitLossInUSD();
                amount += order.isLong() ? order.getAmount() : -order.getAmount();
                filledOrders++;
            }
        }
        if(filledOrders > 0){
            console.getOut().format("%s 損益合計 = $%.5f, ポジション合計 = %.5f", instrument ,profitLoss, amount).println();
        }
    }
    context.stop(); // ストラテジー停止
}



サンプルソースコード:PositionPLandAmount.java







オーダーリスト更新

多くのストラテジーは、コメントかラベル接頭辞で対象のストラテジーによるオーダーであるかを識別します。
便利な方法としては、全ストラテジーオーダーのリストを保持する事です。

全ての新規オーダーをmyOrdersリストに追加し、オーダーがクローズされたりキャンセルされたらリストからオーダーを削除します。



private List<IOrder> myOrders = new ArrayList<IOrder>();

@Override
public void onStart(IContext context) throws JFException {
    engine = context.getEngine();
    console = context.getConsole();
    context.setSubscribedInstruments(java.util.Collections.singleton(Instrument.EURUSD), true);
    IOrder order = engine.submitOrder("myOrder", Instrument.EURUSD, OrderCommand.BUY, 0.001);
    myOrders.add(order);
}

@Override
public void onMessage(IMessage message) throws JFException {
    IOrder order = message.getOrder();
    if(order == null){
        return;
    }
    if(!myOrders.contains(order)){
        // 当ストラテジー以外によるオーダー用のログ出力
        console.getOut().println(message);
        List<IOrder> otherOrders = new ArrayList<IOrder>(engine.getOrders());
        otherOrders.removeAll(myOrders);
        console.getOut().println("このストラテジー以外によるオーダー: " + otherOrders);
    } else {
        // 当ストラテジーによるオーダー用のログ出力
        console.getWarn().println(message);
        console.getWarn().println("このストラテジーによるオーダー: " + myOrders);
        if(order.getState() == IOrder.State.CLOSED || order.getState() == IOrder.State.CANCELED){
            myOrders.remove(order);
        }
    }     
}



サンプルソースコード:MaintainOrderList.java







オーダーコマンド管理

以下例は、ストラテジー起動時に各OrderCommandのオーダーを行い、 その後OrderCommandに応じた情報をログ出力します。



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

/**
 このストラテジーは起動時に各オーダータイプのオーダーを行い、
その後オーダータイプに応じた情報をログ出力します。
 */

public class SwitchOrderCommand implements IStrategy {

    private IEngine engine;
    private IConsole console;
    private IHistory history;
    
    @Override
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();        
        this.history = context.getHistory();
        context.setSubscribedInstruments(java.util.Collections.singleton(Instrument.EURUSD), true);
        
        // 条件付きオーダーに使用する価格は最後に受信したBidレートを用います
        double price = history.getLastTick(Instrument.EURUSD).getBid();
        
        // 各オーダーコマンド毎のオーダーを作成する
        OrderCommand[] orderCommands = OrderCommand.values();
        for (int i = 0; i < orderCommands.length; i++){
            try{
                // 成行オーダー
                if (orderCommands[i] == BUY || orderCommands[i] == SELL){
                    engine.submitOrder("order"+i, Instrument.EURUSD, orderCommands[i], 0.001);
                // 条件付きオーダー
                } else { 
                    engine.submitOrder("order"+i, Instrument.EURUSD, orderCommands[i], 0.001, price);
                }
            } catch (JFException e) {
                console.getErr().println(orderCommands[i] + " " + e);
            }
        }
        
        // 全てのアクティブオーダーの情報をログ出力する
        for (IOrder order : engine.getOrders()) {
            switch (order.getOrderCommand()) {
            case BUY:
                print(order.getLabel() + " は成行ロングオーダーです。");
                break;
            case SELL:
                print(order.getLabel() + " は成行ショートオーダーです。");
                break;
            default:
                print(order.getLabel() + " は " + (order.isLong() ? "ロングの" : "ショートの") + " " + order.getOrderCommand()
                        + "条件付きオーダーです。");
            }
        }
        for (IOrder order : engine.getOrders()) {
            print(order.getLabel() + " " + order.getOrderCommand());
        }

    }
    
    // ストラテジー停止時に全アクティブオーダーをクローズする
    @Override
    public void onStop() throws JFException {
        for (IOrder o : engine.getOrders()){
            o.close();
        }
    }
    
    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 {
        if(instrument == Instrument.EURUSD && period == Period.TEN_SECS){
            for (IOrder order : engine.getOrders()) {
                print(order.getLabel() + " " + order.getOrderCommand());
            }
        }
    }
    @Override
    public void onMessage(IMessage message) throws JFException {}
    @Override
    public void onAccount(IAccount account) throws JFException {}

}



サンプルソースコード:SwitchOrderCommand.java





スポンサーリンク

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


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


Top

inserted by FC2 system