我正在编写一个java程序来尝试识别股票市场的趋势,我想确定以下模式:
EMA
值低于SMA
的值超过约{。}} 0.7%(第1天),您可以在接下来的2-3天内查找两者之间0.2%-0.5%的波动(SMA
和EMA
之间或之间的关系变化)。这表明卖出信号。
我有EMA
和SMA
的浮点值数组,然后我有一个名为percentDif
的单独浮点数组,其中包含EMA和SMA之间的百分比差异。例如,这些是EMA
,SMA
和percentDif
数组的前两组值
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语句,但它没有这样做。
答案 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