0

C# の使用 これは基本的な質問だと思います。エラーが表示されます..「名前 '_stocks' は現在のコンテキストに存在しません」. これは、Initialize メソッド内で _stocks ディクショナリを宣言したためです。これにより、_stocks 変数がローカル変数になり、Initialize メソッド内でのみアクセスできるようになります。_stocks 変数をクラスのフィールドとして宣言する必要があります (そのため、クラスの任意のメソッドからアクセスできます)。以下に示すように、もう 1 つのメソッドは OnBarUpdate() です。_stocks 変数をクラスのフィールドとして宣言するにはどうすればよいですか?

public class MAcrossLong : Strategy
{
    //Variables
    private int variable1 = 0
    private int variable2 = 0

    public struct StockEntry
    {
        public string Name { get; set; }
        public PeriodType Period { get; set; }
        public int Value { get; set; }
        public int Count { get; set; }
    }

    protected override void Initialize()
    {                       
        Dictionary<string, StockEntry> _stocks = new Dictionary<string, StockEntry>();

        _stocks.Add("ABC", new StockEntry { Name = "ABC", Period = PeriodType.Minute, Value = 5, Count = 0 } );
    }

    protected override void OnBarUpdate()
    {
       //_stocks dictionary is used within the code in this method.  error is occurring         within this method
    }
}

* *追加部分....

他のエラーが発生しているため、おそらく OnBarUpdate() 内にコードを投稿する必要があります... 'System.Collections.Generic.Dictionary.this[string]' に一致する最適なオーバーロードされたメソッドには、無効な引数がいくつかあります引数 '1' : 'int' から 'string' に変換できません 演算子 '<' は、タイプ 'NinjaTrader.Strategy.MAcrossLong.StockEntry' および 'int' のオペランドには適用できません

protected override void OnBarUpdate()

        {  //for loop to iterate each instrument through
for (int series = 0; series < 5; series++)
if (BarsInProgress == series)
{  
var singleStockCount = _stocks[series];
bool enterTrade = false;
   if (singleStockCount < 1)
{
enterTrade = true;
}
else
{
enterTrade = BarsSinceEntry(series, "", 0) > 2; 
} 

                if (enterTrade)
 {  // Condition for Long Entry here


                  EnterLong(200);
{
 if(_stocks.ContainsKey(series))
{
_stocks[series]++;
}
}
 }
            } 
}
4

2 に答える 2

0

あなたが宣言したのと同じ方法variable1variable2....

public class MAcrossLong : Strategy
{
   private int variable1 = 0;
   private int variable2 = 0;
   private Dictionary<string, StockEntry> _stocks;

   protected override void Initialize()
   {
      _stocks.Add("ABC", new StockEntry { Name = "ABC", Period = PeriodType.Minute, Value = 5, Count = 0 } );
   }

   protected override void OnBarUpdate()
   {
      _stocks["ABC"].Name = "new name"; // Or some other code with _stocks
   }
}

最近追加した 内のエラーを修正するには、ループOnBarUpdate()に切り替えて反復子を使用する必要があります。詳細については、こちらこちら、およびこちらをご覧ください。foreachKeyValuePair<string, StockEntry>

次のようになります。

foreach(KeyValuePair<string, StockEntry> stock in _stocks)
{
   string ticker = stock.Key;
   StockEntry stockEntry = stock.Value;
   // Or some other actions with stock
}
于 2013-09-19T03:02:38.653 に答える