Expression4J, 公式表达式计算引擎

前言

在我们的项目中,如果是做流程或者是一些涉及到计算的模块时,经常有动态进行计算的需求,或者是动态的编写一个计算公式进行计算的业务场景;比如:一个计算有关三角函数的业务模板 sin(A) + cos(B);如果是你单独去实现的话;虽然不难但是还要要花一番时间的;今天在这里给大家推荐一款这样的开源项目,expression4j专门就是来进行这样的动态公式计算的。

Expression4j

项目地址

github.com/gohutool/expression4j

Expression4js使用JAVA实现;是笔者专门针对金融公司的指标数据计算的一个量化跟踪引擎项目中进行抽象而来的一个子项目;项目是一个java的工具包项目,使用ANT进行构建;使用时引入相关的jar包即可;

通常对于公式计算的实现上来说,从最简单的四则运算的实现,或者用bsh,jython,jruby/groovy等脚本引擎,或者更高级的AST语法树规则的实现;或者更有甚者直接用sql执行,有许多中不同的解决方案的;等等方法多种多样。不过每种方法或多或少都有自己一定的局限。各自有着各自的适用场景;而这个Expression4j除了支持动态的 四则运算的实现, 更支持脚本化的公式;同时expression4j有金融项目诞生,所以其对金融产品的公式计算更为适用;

使用

实现公式计算模板;在量化计算的自编规则和自编指标的模块中定义出一个或者是一套计算公式,然后程序会根据你指定的公式进行计算,作为商业上的应用,这里的计算不仅仅局限于加减乘除,还包含标准偏差,平均线,移动平均线等指标的计算;

定义公式

String txt = "DIF:EMA(CLOSE,SHORT)-EMA(OPEN,LONG);"
                            + "DEA:EMA(DIF,MID);"
                            + "MACD:(DIF-DEA)*2::COLORSTICK;";

定义公式中的输入参数

String[] defs = new String[]
                       { "SHORT", "LONG", "MID" };

声明参数

声明一个Formula的变量,这里就是整个公式计算的entry

FormulaParameters fp = new FormulaParameters();
fp.addParameter("short", 12);
fp.addParameter("long", 26);
fp.addParameter("mid", 9);
fp.addParameter("CLOSE",  closeArray)
fp.addParameter("OPEN",  openArray)

调用公式

FormulaResult fr = f.eval(fp);
Map<String, Object> results = fr.getResult();

结果

{dea=[0.9358484784928137, 5.223248740604646, 9.484484720782131, 12.812405231923686, 17.625797032274512, 21.48934699188941, 24.338687429831023, 24.967767843873517, 23.713504323762475, 23.419514164728735, 22.735086398910138, 22.495512066265064, 22.42045061047972, 21.686444772033873, 20.699838512275377, 19.800386512274844, 20.637560544699593, 22.159859719130218, 24.403776610862046, 24.227408662528966, 22.137340048573154, 21.27741048836811, 20.240579387890197, 19.05695339586254, 16.70384447055847, 16.076128111445378, 14.878188371277464, 13.761807666795649,

更多例子 

可以参考项目中的test目录下的测试用例。

谢谢大家继续关注

猜你喜欢

转载自blog.csdn.net/inthirties/article/details/126728174