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秒毎に出力されます。
グループは以下リストの通りです。
- アクティブオーダー
- 保留中オーダー
- 含み益オーダー
- 含み損オーダー
ストラテジーパラメータの設定に応じて、特定のグループのオーダーをクローズします。
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);
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