package jforex.requests;

import java.util.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

import com.dukascopy.api.*;
import com.dukascopy.api.drawings.IOhlcChartObject;
import com.dukascopy.api.feed.*;
import com.dukascopy.api.IIndicators.AppliedPrice;
import com.dukascopy.api.indicators.IIndicator;

@RequiresFullAccess
public class Strategia_Renko1 implements IStrategy {
    private IConsole console;
    private IHistory history;
    private IIndicators indicators;

    public Instrument instrument = Instrument.EURUSD;
    public Filter filter = Filter.NO_FILTER;
    public OfferSide side = OfferSide.BID;
    public IFeedDescriptor feedDescriptor;
    private PriceRange priceRange;

    public int priceRenkoPips = 3;
    private double[] sum;
    private int timePeriod_sum = 10;

    private long tBar, tBar_p;

    public void onStart(IContext context) throws JFException {
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.indicators = context.getIndicators();

        priceRange = PriceRange.valueOf(priceRenkoPips);
        feedDescriptor = new FeedDescriptor();
        feedDescriptor.setDataType(DataType.RENKO);
        feedDescriptor.setOfferSide(side);
        feedDescriptor.setFilter(filter);
        feedDescriptor.setInstrument(this.instrument);
        feedDescriptor.setPriceRange(priceRange);
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {
        if (instrument != this.instrument) return;

        IRenkoBar lastRenkoBar = history.getRenkoBar(instrument, side, priceRange, 0);
        tBar=lastRenkoBar.getTime(); 

        if(tBar_p!=tBar) {
            tBar_p=tBar;

            //calculate SUM
            Object[] sumFeed = indicators.calculateIndicator(feedDescriptor, new OfferSide[] { OfferSide.BID }, "SUM",
                    new AppliedPrice[] { AppliedPrice.OPEN }, new Object[] { timePeriod_sum }, 2, tBar, 0);
            sum = (double[]) sumFeed[0];

            print( "SUM: " + toStr(tBar)  + "    " + (new DecimalFormat("#.####")).format(sum[0]) + ", " +     (new DecimalFormat("#.####")).format(sum[1]));

        }
    }

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }

    private void print(Object o) {
         console.getOut().println(o);
    }

    public String toStr(Long time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") {
            {
                setTimeZone(TimeZone.getTimeZone("GMT"));
            }
        };
        return sdf.format(time);
    }
}