package jforex.orders;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import com.dukascopy.api.*;
import static com.dukascopy.api.Instrument.*;
import static com.dukascopy.api.IEngine.OrderCommand.*;
public class OrderManagementPL implements IStrategy {
@Configurable("アクティブオーダーを全てクローズする")
public boolean closeAllActive = false;
@Configurable("保留中オーダーを全てクローズする")
public boolean closeAllPending = false;
@Configurable("含み益オーダーを全てクローズする")
public boolean closeAllProfit = false;
@Configurable("含み損オーダーを全てクローズする")
public boolean closeAllLoss = false;
private IConsole console;
private IEngine engine;
private Set<Instrument> instruments = new HashSet<Instrument>(Arrays.asList(new Instrument[] {EURUSD, USDCAD}));
@Override
public void onStart(IContext context) throws JFException {
console = context.getConsole();
engine = context.getEngine();
context.setSubscribedInstruments(instruments, true);
engine.submitOrder("Order_BUY_EURUSD" , EURUSD, BUY , 0.001);
engine.submitOrder("Order_SELL_EURUSD", EURUSD, SELL, 0.002);
engine.submitOrder("Order_BUY_USDCAD" , USDCAD, BUY , 0.001);
engine.submitOrder("Order_SELL_USDCAD", USDCAD, SELL, 0.002);
}
private List<IOrder> getProfitOrders() throws JFException{
List<IOrder> orders = new ArrayList<IOrder>();
for(IOrder o : engine.getOrders()){
if(o.getProfitLossInUSD() >= 0){
orders.add(o);
}
}
return orders;
}
private List<IOrder> getLossOrders() throws JFException{
List<IOrder> orders = engine.getOrders();
orders.removeAll(getProfitOrders());
return orders;
}
private List<IOrder> getPendingOrders() throws JFException{
List<IOrder> orders = engine.getOrders();
for(IOrder o : engine.getOrders()){
if(o.getState() == IOrder.State.OPENED){
orders.add(o);
}
}
return orders;
}
public void onTick(Instrument instrument, ITick tick) throws JFException {}
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();
}
}
}
public void onMessage(IMessage message) throws JFException {}
public void onAccount(IAccount account) throws JFException {}
@Override
public void onStop() throws JFException {
for(IOrder o : engine.getOrders()){
o.close();
}
}
}