- 显示:
- 1526
- 等级:
- 已发布:
- 2014.02.06 07:47
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
本脚本含有一个类,能够用于处理由字符串定义的数学和逻辑表达式。
本脚本有两个类:cTokenBase 和 cToken (CTokenBase的一个成员)。cTokenBase类必须在使用前配置(如下)。
支持以下MQL5 数学函数:abs, arccos, arcsin, arctan, ceil, cos, exp, floor, log, log10, max, min, mod, pow, rand, round, sin, sqrt, tan.
逻辑和数学表达式: /, %, *, +, -, >, <, >=, <=, ==, !=, &&, ||。
表达式可能包含数字,包括双精度数字,用户变量和用户数组。如果你要使用用户变量和数组,你需要添加函数来返回这些变量和数组的值。函数要添加到cTokenBase类中。
用户变量和数组以字母命名(大小写无所谓),数组元素定义如下:e[0], e[1], f[0], f[1]。
例如:
如何配置cTokenBase类
需要注册用户变量和数组。必须在UsersVariables()函数中完成。用户变量/数组列表包含以";"分隔的名称。
void UsersVariables() { UserVariables="a;b;c;d"; // 用户变量列表 UserArrays="e;f"; // 用户数组列表 }
2. 你需要在UserFunc(string FuncName)函数中增加一次相应函数的调用:
string UserFunc(string FuncName) { if(FuncName=="a")return(a()); if(FuncName=="b")return(b()); if(FuncName=="c")return(c()); if(FuncName=="d")return(d()); Alert("Function for "+FuncName+" variable is not defined"); return("0"); }
3. 为所有用户变量添加函数:
string a() { return("1"); } string b() { return("2"); } string c() { return("3"); } string d() { return("4"); }
4. 添加相应函数(取决于ArrName)的调用到UserArray(string ArrName,int aIndex)函数中。数组元素的索引在aIndex变量中确定。
string UserArray(string ArrName,int aIndex){ if(ArrName=="e")return(e(aIndex)); if(ArrName=="f")return(f(aIndex)); Alert("Function for "+ArrName+" array is not defined"); return("0"); }
5. 为每个数组添加函数:
string e(int Index) { string v[]={"1","2","3","4","5","6","7","8","9"}; return(v[Index]); } string f(int Index) { string v[]={"10","20","30","40","50","60","70","80","90"}; return(v[Index]); }
使用类
1. 为表达式声明一个外部输入变量:
input string Expression="enter expression here";
2. 在全局范围声明一个cToken类的变量:
cToken token;
3. 用表达式初始化类。
token.Init(Expression);
4. 调用SolveExpression()方法
double Value=token.SolveExpression();
使用多个cTkoen类的实例,该类可以用于解释多个表达式:
cToken token1; cToken token2; cToken token3; cToken token4;
在这种情况下,所有类的实例将使用相同的用户变量和数组(在cTokenBase类中声明)
你可以添加你自己的函数。
添加新的功能到cTkoen类中
- 注册一个新的函数。这必须在Init()函数中完成。
- 将用于计算的代码添加到SolveFunc(string Func,string & aRes[])函数中。函数的单数在aRes[]数组中。参数的个数没有限制。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/303