import com.dukascopy.api.*;

import java.util.HashSet;
import java.util.Set;

public class TestOrderLabel_X2 implements IStrategy {
    private IConsole myConsole;
    private IContext myContext;
    private IHistory myHistory;
    private IEngine myEngine;
    private IOrder SellOrder;
    private IOrder BuyOrder;
    private int SellOrderCounter=0;
    private int BuyOrderCounter=0;


    public Instrument myInstrument=Instrument.EURUSD;
    public Period myPeriod=Period.DAILY;

    

    @Configurable("Stop Loss Pips")
    public int stoplossPips = 60;
    
    @Configurable("Take Profit Pips")
    public int takeProfitPips = 120;

    @Configurable("Amount")
    public double amount = 0.1;


    @Override
    public void onStart(IContext context) throws JFException {
        myContext=context;
        myConsole=context.getConsole();
        setMyHistory(context.getHistory());
        myEngine=context.getEngine();


        Set<Instrument> instruments=new HashSet<Instrument>();
        instruments.add(myInstrument);
        myContext.setSubscribedInstruments(instruments,true);

    }

    @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==myInstrument && period==myPeriod){
            
            SellOrder=myEngine.submitOrder("SellOrder"+ ++SellOrderCounter,myInstrument,IEngine.OrderCommand.SELL,amount);
            SellOrder.waitForUpdate(1000);
            myConsole.getOut().println(SellOrder.getLabel()+" is opened and filled!");

            double myStopLossPrice=SellOrder.getOpenPrice()+stoplossPips*myInstrument.getPipValue();
            SellOrder.setStopLossPrice(myStopLossPrice);
            SellOrder.waitForUpdate(1000);
            myConsole.getOut().println(SellOrder+"stopLoss is setted!");

            double myTakeProfitPrice=SellOrder.getOpenPrice()-takeProfitPips*myInstrument.getPipValue();
            SellOrder.setTakeProfitPrice(myTakeProfitPrice);
            SellOrder.waitForUpdate(1000);
            myConsole.getOut().println(SellOrder+"takeProfit is setted!");

            
            BuyOrder=myEngine.submitOrder("BuyOrder"+ ++BuyOrderCounter,myInstrument,IEngine.OrderCommand.BUY,amount);
            BuyOrder.waitForUpdate(1000);
            myConsole.getOut().println(BuyOrder.getLabel()+" is opened and filled!");

            double myStopLossPrice1=BuyOrder.getOpenPrice()-stoplossPips*myInstrument.getPipValue();
            BuyOrder.setStopLossPrice(myStopLossPrice1);
            BuyOrder.waitForUpdate(1000);
            myConsole.getOut().println(BuyOrder+"stopLoss is setted!");

            double myTakeProfitPrice1=BuyOrder.getOpenPrice()+takeProfitPips*myInstrument.getPipValue();
            BuyOrder.setTakeProfitPrice(myTakeProfitPrice1);
            BuyOrder.waitForUpdate(1000);
            myConsole.getOut().println(BuyOrder+"takeProfit is setted!");

        }

    }

    @Override
    public void onMessage(IMessage message) throws JFException {
        
        if(message.getOrder()==SellOrder && message.getReasons().contains(IMessage.Reason.ORDER_CHANGED_SL)){
            boolean OrderLabelEqual=message.getOrder().getLabel().equals("SellOrder"+SellOrderCounter);
            myConsole.getInfo().println(SellOrder.getLabel()+"'s stop loss changed to: "
                    +SellOrder.getStopLossPrice()+"|| OrderLabelEqual: "+OrderLabelEqual);
        }

        if(message.getOrder()==SellOrder && message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_SL)){

            myConsole.getWarn().println(SellOrder.getLabel()+" is closed at: "
                    +SellOrder.getClosePrice()+"|| PL is: "+SellOrder.getProfitLossInPips());
        }

        if(message.getOrder()==BuyOrder && message.getReasons().contains(IMessage.Reason.ORDER_CHANGED_SL)){
            boolean OrderLabelEqual=message.getOrder().getLabel().equals("BuyOrder"+BuyOrderCounter);
            myConsole.getInfo().println(BuyOrder.getLabel()+"'s stop loss changed to: "
                    +BuyOrder.getStopLossPrice()+"|| OrderLabelEqual: "+OrderLabelEqual);
        }

        if(message.getOrder()==BuyOrder && message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_SL)){

            myConsole.getWarn().println(BuyOrder.getLabel()+" is closed at: "
                    +BuyOrder.getClosePrice()+"|| PL is: "+BuyOrder.getProfitLossInPips());
        }
        
        if(message.getOrder()==SellOrder && message.getReasons().contains(IMessage.Reason.ORDER_CHANGED_TP)){
            boolean OrderLabelEqual=message.getOrder().getLabel().equals("SellOrder"+SellOrderCounter);
            myConsole.getInfo().println(SellOrder.getLabel()+"'s stop loss changed to: "
                    +SellOrder.getStopLossPrice()+"|| OrderLabelEqual: "+OrderLabelEqual);
        }

        if(message.getOrder()==SellOrder && message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_TP)){

            myConsole.getWarn().println(SellOrder.getLabel()+" is closed at: "
                    +SellOrder.getClosePrice()+"|| PL is: "+SellOrder.getProfitLossInPips());
        }

        if(message.getOrder()==BuyOrder && message.getReasons().contains(IMessage.Reason.ORDER_CHANGED_TP)){
            boolean OrderLabelEqual=message.getOrder().getLabel().equals("BuyOrder"+BuyOrderCounter);
            myConsole.getInfo().println(BuyOrder.getLabel()+"'s stop loss changed to: "
                    +BuyOrder.getStopLossPrice()+"|| OrderLabelEqual: "+OrderLabelEqual);
        }

        if(message.getOrder()==BuyOrder && message.getReasons().contains(IMessage.Reason.ORDER_CLOSED_BY_TP)){

            myConsole.getWarn().println(BuyOrder.getLabel()+" is closed at: "
                    +BuyOrder.getClosePrice()+"|| PL is: "+BuyOrder.getProfitLossInPips());
        }


    }

    @Override
    public void onAccount(IAccount account) throws JFException {

    }

    @Override
    public void onStop() throws JFException {

    }

    public IHistory getMyHistory() {
        return myHistory;
    }

    public void setMyHistory(IHistory myHistory) {
        this.myHistory = myHistory;
    }
}
