package luktom.biz;  // I invite you to our website http://en.luktom.biz/

import java.util.*;

import com.dukascopy.api.*;

public class trendEnvStrategySample implements IStrategy {
	private IEngine engine;
	private IConsole console;
	private IHistory history;
	private IContext context;
	private IIndicators indicators;
	private int counter = 0;
    private String mylabel = "myOrder";
    
    @Configurable("Instrument:") public Instrument instr = Instrument.EURUSD;
    @Configurable(value="Period:") public Period per = Period.FIVE_MINS;
    @Configurable(value="TE Time Period:", stepSize=1) public int TEtimePeriod = 14;
    @Configurable(value="TE Deviation:", stepSize=0.01) public double TEdeviation = 0.1;
	
	public void onStart(IContext context) throws JFException {
		this.engine = context.getEngine();
		this.console = context.getConsole();
		this.history = context.getHistory();
		this.context = context;
		this.indicators = context.getIndicators();
	}

	public void onAccount(IAccount account) throws JFException {
	}

	public void onMessage(IMessage message) throws JFException {
	}

	public void onStop() throws JFException {
	}

	public void onTick(Instrument instrument, ITick tick) throws JFException {
	}
	
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
         if(instrument == instr && period == per){
	         int lookBack = 4000;
	         double[][] TE = indicators.trendEnv(instr, per, OfferSide.BID, TEtimePeriod, TEdeviation, Filter.WEEKENDS, lookBack, bidBar.getTime(), 0);
             
              if(TE[0][lookBack-2] > 0 && Double.isNaN(TE[0][lookBack-1])){ // open SELL
                 CloseOrders(IEngine.OrderCommand.BUY);
                 console.getOut().println("open SELL");          
                 IOrder order = engine.submitOrder(mylabel+"Sell"+getLabel(), instr, IEngine.OrderCommand.SELL, 0.01, bidBar.getClose(), 5,0,0);
                 order.waitForUpdate(2000);
            }
            if(Double.isNaN(TE[0][lookBack-2]) && TE[0][lookBack-1] > 0){ // open BUY
                 CloseOrders(IEngine.OrderCommand.SELL);
                 console.getOut().println("open BUY");       
                 IOrder order = engine.submitOrder(mylabel+"Buy"+getLabel(), instr, IEngine.OrderCommand.BUY, 0.01, askBar.getClose(), 5,0,0);
                 order.waitForUpdate(2000);
            }
         }
         
    }
    void CloseOrders(IEngine.OrderCommand oc)throws JFException{
        for (IOrder order : engine.getOrders(instr)) {
           if(order.getLabel().substring(0,mylabel.length()).equals(mylabel)){
               if(order.getOrderCommand() == oc) order.close();
           }
        }
    }
    protected String getLabel() {
        String label = instr.name();
        label = label + (counter++);
        label = label.toUpperCase();
        return label;
    }
}