2012-04-18 5 views
0

NCalcを理解するのに苦労しています。NCalcの "if"文を無効にする

1)「if(CLOSE < 2.3、ROC(OPEN)、HIGH)」のような式があり、ROCがカスタム関数です。条件 "CLOSE < 2.3"が評価されているときに "ROC(OPEN)"の結果が利用可能ですか?

2)「If」ステートメントをどのように上書きするのですか?以下のケースでは、 "listOpen"の各要素の条件付きチェックを行いたいと思います。条件がTRUEと評価された場合、条件が評価されたindexの値を "listROC"から返す必要があり、そうでない場合はlistHighから同じインデックスの値を返します。

例:

List<double> listResult = new List<double>(); 
for(int index = 0; index< listClose.count;index++) 
{ 
    if(listClose[index]<2.3) 
     listResult.Add(listROC[index]); 
    else 
     listResult.Add(listHigh[index]); 

} 

return listResult; 

これは、私は式の評価を取得しようとしているサンプルコードです。カスタムif文をオーバーライド/定義することに固執しています。

private List<double> listOpen = new List<double>(); 
    private List<double> listClose = new List<double>(); 
    private List<double> listHigh = new List<double>(); 
    public void PrepareData() 
    { 
     for (int index = 0; index < 10; index++) 
     { 
      Random rnd = new Random(); 
      double open = rnd.NextDouble() * (2.5 - 2.0) + 2.0; 
      listOpen.Add(open); 
      double close = rnd.NextDouble() * (2.5 - 2.0) + 2.0; 
      listClose.Add(close); 
      double high = rnd.NextDouble() * (2.5 - 2.0) + 2.0; 
      listHigh.Add(high); 

     } 
    } 
    private void EvaluateExpression() 
    { 
     PrepareData(); 

     Expression ex = new Expression("if(CLOSE<2.3,ROC(OPEN),HIGH)"); 
     ex.EvaluateFunction += delegate(string name, FunctionArgs args) 
     { 
      if (name == "ROC") 
      { 
       List<double> listROC = new List<double>(); 
       string argument = args.Parameters[0].Evaluate().ToString(); 
       List<double> listParam = new List<double>(); 
       switch (argument) 
       { 
        case "OPEN": 
         listParam = listOpen; 
         break; 
        case "CLOSE": 
         listParam = listClose; 
         break; 
        case "HIGH": 
         listParam = listHigh; 
         break; 
       } 
       foreach (double dbl in listParam) 
       { 
        double result = dbl * 2; 
        listROC.Add(result); 
       } 
       args.Result = listROC; 
      } 
      if (name == "if") 
      { 
       //Override the if function 
      } 
     }; 

     object ob = ex.Evaluate(); 
    } 

ご協力いただきまして誠にありがとうございます。

答えて

0

カントーは何を達成しようとしているのか、あなたがもっと説明することができれば、あなたをより良く助けることができるかもしれません。あなたが行動をいただきました作り付けの使用のようなIF(のようないくつかの他の言葉であることを場合たくない包み、「もし」上書き)または式に)(フィルターカント

0

私の理解では、次のとおりです。

1)式が解析されすべて一緒に、しかしその後、深さに応じて評価。したがってif述語CLOSE<2.3は真理のために評価され、真ならばROC(OPEN)が評価されます。 MAP(arg_array, callback([i]))というカスタムを書いた場合のように、パラメータ[i]が存在することを期待してcallback([i])を解析すると、評価の最初からが存在すると解釈されます。これは、宣言される前にパラメータを使用しようとすると問題になります。

2)関数名を処理して結果を設定する限り、発生したネイティブ処理を上書きする必要があります。私は、認識されないifステートメントで例外をスローした結果を常に設定する(または関数を認識しなかった場合は例外を投げた)便利なハンドラを作るのを間違えました。 IF(大文字と小文字を区別)で独自のif文を定義することもできます。


は、しかし、私はあなたの問題はCLOSEOPENは、静的な値であるために仮定されており、その代わりに'CLOSE''OPEN'のような文字列のようにエスケープしなければならないということだと思います。または、パラメータとして宣言し、それに従って処理します。 https://ncalc.codeplex.com/wikipage?title=parameters

関連する問題