package jforex.orders.sl;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import com.dukascopy.api.*;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IMessage.Reason;
public class TrailingStepTest implements IStrategy {
@Configurable("通貨ペア")
public Instrument instrument = Instrument.EURUSD;
@Configurable("トレーリングステップ")
public int trailingStep = 10;
private IConsole console;
private IEngine engine;
private IHistory history;
private Map<IOrder, Integer> slMoves = new HashMap<IOrder, Integer>();
@Override
public void onStart(IContext context) throws JFException {
console = context.getConsole();
engine = context.getEngine();
history = context.getHistory();
context.setSubscribedInstruments(new HashSet<Instrument>(Arrays.asList(new Instrument[]{instrument})), true);
ITick tick = history.getLastTick(instrument);
IOrder order = engine.submitOrder("buyWithTrailing_"+tick.getTime(), instrument, OrderCommand.BUY, 0.001);
order.waitForUpdate(2000, IOrder.State.FILLED);
slMoves.put(order, 0);
order.setStopLossPrice(tick.getBid() - instrument.getPipValue() * 10, OfferSide.BID, trailingStep);
order = engine.submitOrder("sellWithTrailing_"+tick.getTime(), instrument, OrderCommand.SELL, 0.001);
order.waitForUpdate(2000, IOrder.State.FILLED);
slMoves.put(order, 0);
order.setStopLossPrice(tick.getAsk() + instrument.getPipValue() * 10, OfferSide.ASK, trailingStep);
}
@Override
public void onMessage(IMessage message) throws JFException {
IOrder order = message.getOrder();
if (order == null || !slMoves.containsKey(order)) {
return;
}
console.getOut().println(message);
if (message.getType() == IMessage.Type.ORDER_CHANGED_OK && message.getReasons().contains(Reason.ORDER_CHANGED_SL)) {
slMoves.put(order, slMoves.get(order) + 1);
console.getInfo().format("%sラベルのオーダーのストップロスを%.5fに更新\n ストップロスを移動: %s",
order.getLabel(), order.getStopLossPrice(), slMoves).println();
} else if (message.getType() == IMessage.Type.ORDER_CLOSE_OK){
slMoves.remove(order);
}
}
@Override
public void onTick(Instrument instrument, ITick tick) throws JFException {
if(instrument != this.instrument){
return;
}
for(Map.Entry<IOrder, Integer> tsMove : slMoves.entrySet()){
IOrder order = tsMove.getKey();
int moveCount = tsMove.getValue();
if(order.getProfitLossInPips() > trailingStep && moveCount < 2){
console.getErr().format("%sラベルのオーダーの含み益は%.1%f pipsですが、ストップロスが移動されていません。 ",
order.getLabel(), order.getProfitLossInPips()).println();
}
}
}
@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 {
}
}