Dukascopy
 
 
Wiki JStore Search Login

STORAGE-104 TickBarsSize(10) with getTickBars() causes IllegalArgumentException on lastKnownTime < lastTickTime
 Post subject: STORAGE-104 TickBarsSize(10) with getTickBars() causes IllegalArgumentException on lastKnownTime < lastTickTime Post rating: 0   New post Posted: Fri 01 Jun, 2012, 16:02 

User rating: 1
Joined: Tue 20 Mar, 2012, 09:03
Posts: 41
With this sample:
package de.invesdwin.forextrading.sample.tickbars;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.annotation.concurrent.NotThreadSafe;

import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.OfferSide;
import com.dukascopy.api.Period;
import com.dukascopy.api.TickBarSize;
import com.dukascopy.api.feed.ITickBar;
import com.dukascopy.api.system.ISystemListener;
import com.dukascopy.api.system.ITesterClient;
import com.dukascopy.api.system.TesterFactory;

import de.invesdwin.common.log.Log;
import de.invesdwin.common.log.error.Err;
import de.invesdwin.forextrading.ForexProperties;

/**
 * This small program demonstrates how to initialize Dukascopy client and start a strategy
 */
@NotThreadSafe
public final class TickBarsSample {

    //url of the DEMO jnlp

    private static final Log LOGGER = new Log(TickBarsSample.class);

    private TickBarsSample() {}

    //CHECKSTYLE:OFF
    public static void main(final String[] args) throws Exception {
        //CHECKSTYLE:ON
        //get the instance of the IClient interface
        final ITesterClient client = TesterFactory.getDefaultInstance();
        //set the listener that will receive system events
        client.setSystemListener(new ISystemListener() {
            private int lightReconnects = 3;

            @Override
            public void onStart(final long processId) {
                LOGGER.info("Strategy started: " + processId);
            }

            @Override
            public void onStop(final long processId) {
                LOGGER.info("Strategy stopped: " + processId);
                if (client.getStartedStrategies().size() == 0) {
                    System.exit(0);
                }
            }

            @Override
            public void onConnect() {
                LOGGER.info("Connected");
                lightReconnects = 3;
            }

            @Override
            public void onDisconnect() {
                LOGGER.warn("Disconnected");
                if (lightReconnects > 0) {
                    client.reconnect();
                    --lightReconnects;
                } else {
                    try {
                        //sleep for 10 seconds before attempting to reconnect
                        Thread.sleep(10000);
                    } catch (final InterruptedException e) {
                        Err.process(e);
                    }
                    try {
                        client.connect(ForexProperties.JFOREX_JNLP_URL.toString(),
                                ForexProperties.JFOREX_JNLP_USERNAME, ForexProperties.JFOREX_JNLP_PASSWORD);
                    } catch (final Exception e) {
                        LOGGER.error(e.getMessage(), e);
                    }
                }
            }
        });

        LOGGER.info("Connecting...");
        //connect to the server using jnlp, user name and password
        client.connect(ForexProperties.JFOREX_JNLP_URL.toString(), ForexProperties.JFOREX_JNLP_USERNAME,
                ForexProperties.JFOREX_JNLP_PASSWORD);

        //wait for it to connect
        int i = 10; //wait max ten seconds
        while (i > 0 && !client.isConnected()) {
            Thread.sleep(1000);
            i--;
        }
        if (!client.isConnected()) {
            LOGGER.error("Failed to connect Dukascopy servers");
            System.exit(1);
        }

        //subscribe to the instruments
        final Set<Instrument> instruments = new HashSet<Instrument>();
        instruments.add(Instrument.EURUSD);
        LOGGER.info("Subscribing instruments...");
        client.setSubscribedInstruments(instruments);
        //start the strategy
        Thread.sleep(1000);

        LOGGER.info("Starting strategy");
        client.startStrategy(new IStrategy() {
            private IContext context;

            @Override
            public void onTick(final Instrument instrument, final ITick tick) throws JFException {
                if (instrument == Instrument.EURUSD) {
                    final IBar lastBar = context.getHistory().getTickBar(Instrument.EURUSD, OfferSide.ASK,
                            TickBarSize.valueOf(10), 0);

                    long timeTo = tick.getTime();
                    if (lastBar != null && lastBar.getTime() < timeTo) {
                        timeTo = lastBar.getTime();
                    }
                    final long timeFrom = timeTo - TimeUnit.MINUTES.toMillis(5);

                    final List<ITickBar> previousBars = context.getHistory().getTickBars(Instrument.EURUSD,
                            OfferSide.ASK, TickBarSize.valueOf(10), timeFrom, timeTo);
                    LOGGER.info("" + lastBar);
                    LOGGER.info("" + previousBars);
                }
            }

            @Override
            public void onStop() throws JFException {}

            @Override
            public void onStart(final IContext context) throws JFException {
                this.context = context;
            }

            @Override
            public void onMessage(final IMessage message) throws JFException {}

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

            @Override
            public void onAccount(final IAccount account) throws JFException {}
        });
        //now it's running
    }
}



You can produce the following exception:
2012-06-01 16:57:16,779 [ |StrategyRunner Thre] ERROR c.d.d.g.agent.strategy.tester.StrategyRunner.handleException - To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532
java.lang.IllegalArgumentException: To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532
   at com.dukascopy.charts.data.datacache.priceaggregation.AbstractLoadNumberOfPriceAggregationAction.validateFromToTime(AbstractLoadNumberOfPriceAggregationAction.java:948) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.tickbar.LoadTickBarTimeIntervalAction.<init>(LoadTickBarTimeIntervalAction.java:50) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeIntervalSynched(PriceAggregationDataProvider.java:874) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1011) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1628) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1625) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadBarsWithInProgressBarCheck(PriceAggregationDataProvider.java:1403) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1633) ~[greed-common-190.jar:190]
   at com.dukascopy.api.impl.History$20.run(History.java:954) ~[greed-common-190.jar:190]
   at com.dukascopy.api.impl.History$20.run(History.java:938) ~[greed-common-190.jar:190]
   at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_24]
   at com.dukascopy.api.impl.History.getTickBars(History.java:938) ~[greed-common-190.jar:190]
   at com.dukascopy.dds2.greed.agent.strategy.tester.TesterHistory.getTickBars(TesterHistory.java:1819) ~[greed-common-190.jar:190]
   at de.invesdwin.forextrading.sample.tickbars.TickBarsSample$2.onTick(TickBarsSample.java:157) ~[bin/:na]
   at com.dukascopy.dds2.greed.agent.strategy.tester.AbstractStrategyRunner.historicalTickReceived(AbstractStrategyRunner.java:609) ~[greed-common-190.jar:190]
   at com.dukascopy.dds2.greed.agent.strategy.tester.StrategyRunner.run(StrategyRunner.java:469) ~[greed-common-190.jar:190]
   at java.lang.Thread.run(Thread.java:679) [na:1.6.0_24]
Strategy tester: java.lang.IllegalArgumentException: To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532 @ de.invesdwin.forextrading.sample.tickbars.TickBarsSample$2.onTick(TickBarsSample.java:157)
To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532: java.lang.IllegalArgumentException: To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532
   at com.dukascopy.charts.data.datacache.priceaggregation.AbstractLoadNumberOfPriceAggregationAction.validateFromToTime(AbstractLoadNumberOfPriceAggregationAction.java:948)
   at com.dukascopy.charts.data.datacache.tickbar.LoadTickBarTimeIntervalAction.<init>(LoadTickBarTimeIntervalAction.java:50)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeIntervalSynched(PriceAggregationDataProvider.java:874)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1011)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1628)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1625)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadBarsWithInProgressBarCheck(PriceAggregationDataProvider.java:1403)
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1633)
   at com.dukascopy.api.impl.History$20.run(History.java:954)
   at com.dukascopy.api.impl.History$20.run(History.java:938)
   at java.security.AccessController.doPrivileged(Native Method)
   at com.dukascopy.api.impl.History.getTickBars(History.java:938)
   at com.dukascopy.dds2.greed.agent.strategy.tester.TesterHistory.getTickBars(TesterHistory.java:1819)
   at de.invesdwin.forextrading.sample.tickbars.TickBarsSample$2.onTick(TickBarsSample.java:157)
   at com.dukascopy.dds2.greed.agent.strategy.tester.AbstractStrategyRunner.historicalTickReceived(AbstractStrategyRunner.java:609)
   at com.dukascopy.dds2.greed.agent.strategy.tester.StrategyRunner.run(StrategyRunner.java:469)
   at java.lang.Thread.run(Thread.java:679)
2012-06-01 16:57:16,789 [ |StrategyRunner Thre] ERROR c.d.a.i.c.TesterClientImpl$DefaultStrategyExceptionHandler.o - Exception thrown while running onTick method: To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532
java.lang.IllegalArgumentException: To time could not be greater than latest known time 2012-05-29 00:00:01.41 > 2012-05-28 23:59:55.532
   at com.dukascopy.charts.data.datacache.priceaggregation.AbstractLoadNumberOfPriceAggregationAction.validateFromToTime(AbstractLoadNumberOfPriceAggregationAction.java:948) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.tickbar.LoadTickBarTimeIntervalAction.<init>(LoadTickBarTimeIntervalAction.java:50) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeIntervalSynched(PriceAggregationDataProvider.java:874) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1011) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1628) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider$39.load(PriceAggregationDataProvider.java:1625) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadBarsWithInProgressBarCheck(PriceAggregationDataProvider.java:1403) ~[greed-common-190.jar:190]
   at com.dukascopy.charts.data.datacache.priceaggregation.dataprovider.PriceAggregationDataProvider.loadTickBarTimeInterval(PriceAggregationDataProvider.java:1633) ~[greed-common-190.jar:190]
   at com.dukascopy.api.impl.History$20.run(History.java:954) ~[greed-common-190.jar:190]
   at com.dukascopy.api.impl.History$20.run(History.java:938) ~[greed-common-190.jar:190]
   at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_24]
   at com.dukascopy.api.impl.History.getTickBars(History.java:938) ~[greed-common-190.jar:190]
   at com.dukascopy.dds2.greed.agent.strategy.tester.TesterHistory.getTickBars(TesterHistory.java:1819) ~[greed-common-190.jar:190]
   at de.invesdwin.forextrading.sample.tickbars.TickBarsSample$2.onTick(TickBarsSample.java:157) ~[bin/:na]
   at com.dukascopy.dds2.greed.agent.strategy.tester.AbstractStrategyRunner.historicalTickReceived(AbstractStrategyRunner.java:609) ~[greed-common-190.jar:190]
   at com.dukascopy.dds2.greed.agent.strategy.tester.StrategyRunner.run(StrategyRunner.java:469) ~[greed-common-190.jar:190]
   at java.lang.Thread.run(Thread.java:679) [na:1.6.0_24]


With a TickBarSize of 2, this works properly, but with 10 this exception occurs. Maybe other TickBarSizes cause the same exception.

This has been tested with JForex 2.6.69.


 
 Post subject: Re: STORAGE-104 TickBarsSize(10) with getTickBars() causes IllegalArgumentException on lastKnownTime < lastTickTime Post rating: 0   New post Posted: Thu 14 Jun, 2012, 14:05 
User avatar

User rating:
Joined: Fri 31 Aug, 2007, 09:17
Posts: 6139
Please subscribe to Tick Bars in TickBarsSample.onStart() method (see context.subscribeToTickBarFeed(Instrument instrument, OfferSide offerSide, TickBarSize tickBarSize, ITickBarFeedListener listener)).
The strategy would work much faster.


 

Jump to:  

cron
  © 1998-2025 Dukascopy® Bank SA
On-line Currency forex trading with Swiss Forex Broker - ECN Forex Brokerage,
Managed Forex Accounts, introducing forex brokers, Currency Forex Data Feed and News
Currency Forex Trading Platform provided on-line by Dukascopy.com