0

使用 C# 我确定这是一个基本问题。我收到错误消息。“当前上下文中不存在名称'_stocks'”。我知道这是因为我在 Initialize 方法中声明了 _stocks 字典。这使得 _stocks 变量成为局部变量,并且只能在 Initialize 方法中访问。我需要将 _stocks 变量声明为类的一个字段(因此它可以被类的任何方法访问)。您将在下面看到的另一种方法是 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]' 的最佳重载方法匹配有一些无效参数 Argument '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

与您声明的方式相同,variable1并且variable2....

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()您最近添加的错误,您需要切换到foreach循环并使用KeyValuePair<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 回答
0

您需要_stocks在类级别范围内声明。由于您已在 Initialize 方法中声明它,因此它的可见性成为该方法的本地。variable1所以你应该和variable2喜欢一起声明它

private int variable1 = 0;
private int variable2 = 0;
private Dictionary<string, StockEntry> _stocks;

您可能需要查看访问修饰符以及变量和方法范围以更好地理解

于 2013-09-19T03:22:45.473 回答