The JForex API is not perfect. Like any application programming
interface (API), some parts of the JForex API is better designed than
others. One of the most gripping problems with JForex is its use of
technical analysis (TA) indicators. Here's an example of using an
exponential moving average, one of the most simplest indicators.
ema(instrument, Period.TEN_SECS, OfferSide.BID, IIndicators.AppliedPrice.MEDIAN_PRICE, 14, 0);
And the corresponding javadoc explaining the parameters,
Parameters: instrument instrument of the bar period period of the bar side bid or ask side of the bar appliedPrice type of input data timePeriod time period value shift number of candle back in time staring from current bar. 0 - current bar (currently generated from ticks), 1 - previous bar (last formed bar), 2 - current bar minus 2 bars and so on
It's not intuitive but it's usable. Recall that in my JForex
programming tutorial, I suggested using the JForex API javadoc to
find out information about the API. However, for the case of
IIndicators, if you take a look at its javadoc, you will only be led
to more confusion by the hundred or so mysterious indicator methods with
cryptic parameter names. In JForex API, if you want to calculate an
indicator, you need to look through a long list of abbreviated method
names in the javadoc. Many of which are not easy to decipher. Secondly,
you need to figure out the generic parameters and set them correctly,
which is different for almost every indicator. Lastly, as there is no
standard interface for indicators, you need to hardcode these into your
strategy with little flexibility. In contrast, here's the same call
using JFUtil 2.1.0 to get an EMA value. It has notably more lines of
code. It is designed deliberately so using an object oriented approach
by encapsulating the indicator parameters into a bean object and
abstracting the calculation into a single generic function call. [java]
// get an EMA indicator value by building an indicator bean
MovingAverage maBean = IndicatorBeanFactory.getMovingAverage(); // then
sets its parameters with obvious method names
maBean.setAppliedPrice(IIndicators.AppliedPrice.MEDIAN_PRICE)
.setMAType(IIndicators.MaType.EMA) .setWidth(14); // all of these are
optional parameters // feed the bean into a generic calculation method
to get the result double ema = Indicating.calculate(instrument,
Period.ONE_MIN, maBean); [/java] With JFUtil, to calculate an
indicator, you create an indicator bean with the intuitive bean name
that corresponds with the full name of an indicator. For example, a
moving average will be MovingAverage. Then you set the
indicator-specific parameters using clearly defined methods with useful
javadoc descriptions. One method for one parameter. Lastly, you feed
this indicator bean into a generic calculation function to get your
value. It took some thinking to abstract and generalize such a rigidly
structured API. I am quite pleased with this new design as the current
JFUtil opens up a lot of design flexibility. Such as
dynamic indicator selection with genetic algorithm and interchangeable
indicators use for runtime adaptive algorithms.