package sandbox;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IEngine;
import com.dukascopy.api.IEngine.OrderCommand;
import com.dukascopy.api.IHistory;
import com.dukascopy.api.IIndicators;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.ITimedData;
import com.dukascopy.api.IUserInterface;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.Period;
import com.dukascopy.api.feed.IFeedDescriptor;
import com.dukascopy.api.feed.IFeedListener;
import com.dukascopy.api.feed.util.TicksFeedDescriptor;

public class ExampleStrategy implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    private ArrayList<Period> periods;
    private Instrument instrument = Instrument.EURUSD;
    private FeedListener feedListener;
    
    private DateFormat dfm = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
    
    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();
        this.userInterface = context.getUserInterface();
        this.feedListener = new FeedListener();
        IFeedDescriptor fd = new TicksFeedDescriptor(instrument);
        this.context.subscribeToFeed(fd, feedListener);
        this.console.getOut().println("Subscribed");
    }

    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 {
       //double[] values = this.indicators.ma(instrument, Period.FOUR_HOURS, OfferSide.BID, AppliedPrice.CLOSE, 200, MaType.SMA, Filter.WEEKENDS, 2, tick.getTime(), 0);
       //values = this.indicators.ma(instrument, Period.DAILY, OfferSide.BID, AppliedPrice.CLOSE, 200, MaType.SMA, Filter.WEEKENDS, 2, tick.getTime(), 0);
    	this.console.getOut().println("Tick: "+tick);
    }
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        if (instrument.equals(this.instrument) && period.equals(Period.ONE_MIN) && this.engine.getOrders(instrument).size()==0) {
            this.console.getOut().println("Period: "+period+", Instrument: "+instrument+" Orders: "+this.engine.getOrders(instrument).size());
            this.engine.submitOrder("test",instrument, OrderCommand.BUY, 0.1);
            this.context.unsubscribeFromFeed(feedListener);
            this.console.getErr().println("Unsubscribed");
        }
    }
    
    
    private class FeedListener implements IFeedListener {

		@Override
		public void onFeedData(IFeedDescriptor arg0, ITimedData arg1) {
			console.getErr().println("IFeedDescriptor: " + arg0 + ", ITimedData: " + arg1);
		}
    }
}