Java趋势和模式查找器算法

时间:2013-01-02 12:22:18

标签: java algorithm design-patterns

我正在编写一个java程序来尝试识别股票市场的趋势,我想确定以下模式:

EMA值低于SMA的值超过约{。}} 0.7%(第1天),您可以在接下来的2-3天内查找两者之间0.2%-0.5%的波动(SMAEMA之间或之间的关系变化)。这表明卖出信号。

我有EMASMA的浮点值数组,然后我有一个名为percentDif的单独浮点数组,其中包含EMA和SMA之间的百分比差异。例如,这些是EMASMApercentDif数组的前两组值

EMA 314.395         SMA 314.9859884       percentDif -0.001876237
EMA 313.9476        SMA 314.4888908        percentDif -0.001721176

我已经编写了这种方法来识别我想要的模式,但它没有正常工作,有没有更好的方法可以做到这一点?

public void trend(){

    /*
     * Trend indicator pattern
     */
    float valueDrop = -0.7f;

    float minFluxPos = 0.2f;
    float maxFluxPos = 0.5f;

    float minFluxNeg = -0.2f;
    float maxFluxNeg = -0.5f;

    for(int i = 0; i< percentDif.length-2; i++)
    {
        //If the difference between EMA and SMA is greater or equal to -0.7 percent
        if(percentDif[i] >= valueDrop){
            //If the next day the percentage difference fluctuates between 0.2 or 0.5 either way
            if( ((percentDif[i+1] > minFluxPos) && (percentDif[i+1] < maxFluxPos))
                    || ((percentDif[i+1] > minFluxNeg) && (percentDif[i+1] < maxFluxNeg)) )
            {
                //Indicates price drop and therefore sell signal
                System.out.println("Trend Indicated - SELL");
            }
        }
    }
}

我在percentDif数组中输入了以下值: 五 -0.8 -0.3

这些值符合模式的描述,因此应该触发print语句,但它没有这样做。

2 个答案:

答案 0 :(得分:0)

到目前为止,此代码中效率最低的是写入控制台。鉴于你最有可能只有10年的日常数据,即2500个样本,这需要大约1毫秒来扫描。

我怀疑你的循环过早结束尝试

for(int i = 0; i < percentDif.length - 1; i++)

你的min / max是

的错误方法
float minFluxNeg = -0.5f;
float maxFluxNeg = -0.2f;

答案 1 :(得分:0)

对于负通量值,您的比较运算符的方法是错误的。 if语句应该是:

if( ((percentDif[i+1] > minFluxPos) && (percentDif[i+1] < maxFluxPos))
                || ((percentDif[i+1] < minFluxNeg) && (percentDif[i+1] > maxFluxNeg)) )

此外,鉴于您提供的数据和边界,条件永远不会成立。在第一次迭代中,外部条件成立(如5> -0.7),但内部条件不成立(因为-0.8既不在0.2和0.5之间也不在-0.2和-0.5之间)。在第二次也是最后一次迭代中,外部条件失败为-0.8&lt; -0.7