我想问一个关于如何处理因变量的问题。
C1=MA(X,10)
C2=MA(C1,10)
C3=C2.Minus(C1)
C4=MA(C3,10)
Final=C4.Minus(C3)
插图:Final = C4.Minus(C3),我保存了两个参数C4,C3。
C4(MA ok and firstTime in MA)--> C3(MA NotOK,not fstTime)---> C2(MA ok)--->C1(MA ok)
0-------------------> 10--------------> 10+10---->10+10+10=30
我首先创建了一个类来获取每行的所有信息
public class IndicatorInform
{
char[] parenthesis = new []{'(',')'};
char[] equal = new char[] { '=' };
char[] comma = new char[] { ';' };
char[] all = new char [] { '.','<'};
string text=null;
string funcname=null;
string[] args=null;
public void IndicatorInform (string expression, out string text,out string funcName,out string [] args)
{
string [] parts= expression.Split(equal);
text = parts[0];
if( parts[1].Contains(";"))
{
string[] subparts = parts[1].Split(parenthesis);
funcname = subparts[0];
args = subparts[1].Split(comma);
if(args.Count.equal(2))
{
funcarg = args[0];
period = Convert.ToDouble(args[1]);
}
}
else
{
if (parts[1].Contains("Plus"))
funcname = "Plus";
if (parts[1].Contains("Minus"))
funcname = "Minus";
if (parts[1].Contains("Multi"))
funcname = "Multi";
if (parts[1].Contains("Div"))
funcname = "Div";
parts[1] = parts[1].Replace(funcname, "");
args=parts[1].Split(all);
}
}
public double Shifts {get; set;}
public double period { get; set; }
public string Funcname { get; set; }
public string text { get; set; }
public string funcarg { get; set; }
}
然后我创建了一个Dictonary并开始处理因变量
Dictionary<string,SubIndicator> Dico=new Dictionary<string,SubIndicator> ;
foreach (var line in richTextBox1.Lines)
{
SubIndicator SubInc = new SubIndicator();
Dico.Add(SubInc.text,SubInc);
}
int incre=0;
double tempvalue=0;
foreach( string element in Dico.Keys)
{
string[] tempo=null;
if(Dico[element].text.Contains("Final"))
{
tempo=Dico[element].args;
}
else
{
if(tempo.Contains(Dico[element].text))
{
if(Dico[element].Funcname.Contains("MA") )
{
if (incre.Equals(0))
{tempvalue=Dico[element].period;
incre++;}
else
{
Dico[element].Shifts=tempvalue+Dico[element].period;
tempvalue =Dico[element].Shifts;
}
}
else
{
Dico[element].Shifts=tempvalue;
}
}
}
我的算法适用于上述情况。但是如何处理更复杂的情况,如
C1=MA(X,10)
C2=MA(X,20)
C3=MA(C1,5)
C4=MA(C2,10)
C5=MA(C3,15)
C6=MA(C4,10)
Final=C6.Minus(C5)
C6(fst Time)---->C4--->C2 C5(fst Time)--->C3--> C1
0-->10+10-->10+10+20 0--> 15+5-->15+5+10
感谢您的帮助。
答案 0 :(得分:0)
我想我需要写一个更长的答案。数学函数需要有一个带元素/节点的二叉树,这是一个包含左节点,右节点,值和数学运算符的类。元素通常是一个类对象,可以是字典中的值。叶子节点将包含值,而非叶子节点将具有左节点,右节点或左右节点的运算符。
数学函数是关联的,因此任何函数都可以分为左右分量,如a = b +(c + d + e + f)。 b是左侧分量,(c + d + e + f)是右侧分量。右侧组件可以进一步分为左侧和右侧。
你的代码需要两件。第一种是将输入解析为元素。第二部分是计算结果。递归函数将执行计算。递归检查以查看元素是否包含左节点和/或右节点,并一直调用递归函数,直到找到包含值的叶子。然后向上移动函数调用堆栈,用左右组件返回的值替换数学运算符。