将变量声明为类的字段
本文关键字:字段 变量 声明 | 更新日期: 2023-09-27 18:31:48
Using 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]' 的最佳重载方法匹配有一些无效参数参数"1":无法从"int"转换为"字符串"运算符"<"不能应用于类型为"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]++;
}
}
}
}
}
在类级别范围内声明_stocks
。由于已在 Initialize 方法中声明了它,因此其可见性将成为该方法的本地可见性。所以你应该声明它与variable1
和variable2
类似
private int variable1 = 0;
private int variable2 = 0;
private Dictionary<string, StockEntry> _stocks;
您可能需要查看 Access 修饰符以及变量和方法范围,以便更好地理解
就像你声明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
}