3

C#の用語で質問する方法がよくわからないので、長い説明に耐えてください。

私は株式取引アルゴリズムを書いています。アルゴが開始すると、適用されている商品の種類(この場合は株式または先物)を確認し、商品に応じて「doublex」に値を割り当てます。

将来の商品の場合、割り当ては単純でフラットな値です(この場合、「double x = 5;」)。ただし、在庫の場合は、「x」を別の値に割り当てたいと思います。 object-オブジェクトを「Algo2」と値「y」と呼びましょう。したがって、私のスクリプトでは、割り当ては次のようになります:「doublex = Algo2.y」(注:これは、使用しているエディターの規則です)。このコードブロックは、アルゴリズムの開始時に1回だけ実行されます。

ここで達成しようとしているのは、「EntryValue = Price + x」などの式で「x」が使用されている場合は常に、「Algo2.y」の最新値を取得するようにアルゴリズムに指示することです。ただし、プログラムの開始時に「x」に「Algo2.y」の値が永続的に割り当てられ、そのブロックが再度実行されることはないため、全体を通してその定数値が維持されます。

誰かが構文を手伝って、「x」に値を割り当てる代わりに、呼び出されたときに「Algo2.y」の最新の値を取得するように指示することはできますか?

ありがとう!

4

8 に答える 8

2

'x'をプロパティにして、xを要求するたびに値をフェッチするようにします。

class StockInstrument
{
  public double Value //x isn't a good name, I'll use "Value"
  {
    get
    {
      if(...) return 5.0;
      else return Algo2.y;
    }
  }
}
于 2012-04-18T21:44:33.753 に答える
1

私はあなたの最新の値を返すためにメソッドを使用します

public double GetXValue()
{
  if (AlgoType == Algos.Futures)
  {
    return 5.0;
  }
  else if (AlgoType == Algos.Stock)
  {
    return Algo2.y;
  }
  //else
  throw new Exception("unknown algo type");
}

これは非常にハードコーディングされていますが、デリゲートとアルゴリズムのカプセル化を使用してクリーンアップできますが、低レベルでは、これがアイデアです。また、これにプロパティを使用することを好む人もいます-get変更の影響がある場合はプロパティを使用しないでください

public double X
{
  get
  {
    if (AlgoType == Algos.Futures)
    {
      return 5.0;
    }
    else if (AlgoType == Algos.Stock)
    {
      return Algo2.y;
    }
    //else
    throw new Exception("unknown algo type");
  }
}
于 2012-04-18T21:44:25.723 に答える
1

次のようなものを使用できます:

double X {
  get { 
        if(isStock()) 
           return Algo2.y; 
        else 
           return 5;
  }
}
于 2012-04-18T21:44:49.730 に答える
1

そのための関数を書いてください:

double getAlgo2YValue()
{
    return Algo2.y; // or Algo2.getY(), another function if you can't access it
}

メインのアルゴリズムで、次のように呼び出します。

x = getAlgo2YValue();

Xを更新します。

于 2012-04-18T21:44:53.663 に答える
1
Func<int> getX;

if(isFuture)
    getX = () => 5;
else
    getX = () => Algo.y;

// using getX() will always return the current value of Algo.y,
// in case it's a stock.
int xval = getX();
于 2012-04-18T21:47:58.607 に答える
0

Algo2にAlgoへの参照を指定して、「doubleX」コピーが不要になるようにします。その後、AlgoはいつでもAlgo2の実際の値を逆参照できます(スレッドセーフの問題ですか?)。

于 2012-04-18T21:45:37.180 に答える
0

intなどの値のデータ型は、参照としてではなく、常に値によってコピーされます。ただし、できることは、ソリューションを少し異なる方法で設計することです。そうすれば、適切な価値が提供されます。例えば:

 public class ValueContainer
 {
      protected Algo2 _reference = null;
      protected double _staticValue = 0;

      public double CurrentValue
      {
          get
          {
              if(_reference == null)
                 return _staticValue;

              return _reference.y;
          }
      }

      public ValueContainer(Algo2 reference)
      {
           _reference = reference;
      }

      public ValueContainer(double value)
      {
           _staticValue = value;
      }
 }

x次に、必要に応じてインスタンスをインスタンスに置き換え、プロパティをValueContainer使用して値を取得します。CurrentValue次に、異なるコンストラクターを使用して各バージョンを作成します。

 ValueContainer container = null;

 if(stock)
    container = new ValueContainer(5);
 else
    container = new ValueContainer(Algo2);
于 2012-04-18T21:45:39.637 に答える
0

必要なのはx、インストルメントタイプに基づいて返される値を制御するためのプロパティラッパーです。これが例です。これには、アプリに大幅な適応が必要になります。

public class Instrument
{
   // an example enum holding types
   public InstrumentType Type {get; set;}

   // x is not a great name, but following your question's convention...
   public double X
   {
      get
      {
         if(type == InstrumentType.Stock)
            return Algo2.y();
            // note that I changed this to be a method rather than a property
            // Algo2.y() should be static so it can be called without an instance
         else if(type == InstrumentType.Future)
            return 5.0;
         else 
            // return some default value here
      }
   }
}
于 2012-04-18T21:51:49.850 に答える