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;
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");
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();
}
}