2013-09-19 11 views
0

Использование C# Это основной вопрос, который я уверен. Я получаю сообщение об ошибке .. «Имя« _stocks »не существует в текущем контексте». Я знаю, это потому, что я объявил словарь _stocks в методе Initialize. Это делает переменную _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' в '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]++; 
} 
} 
} 
      } 
} 

ответ

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> итератор. Вы можете узнать больше о них here, here и here.

Это должно выглядеть примерно так:

foreach(KeyValuePair<string, StockEntry> stock in _stocks) 
{ 
    string ticker = stock.Key; 
    StockEntry stockEntry = stock.Value; 
    // Or some other actions with stock 
} 
+0

я добавил код OnBardUpdate() на мой оригинальный пост в нижней части должность. Я опубликовал другие ошибки, которые я получаю сейчас. Это простое решение? спасибо – zirjeo

+0

Ваша добавленная часть является отдельной проблемой и должна быть размещена как новый вопрос. Проблема заключается в том, что вы не получаете доступ к словарю с помощью индекса, такого как обычные массивы или списки. Вы получаете доступ через свой ключ, который вы определили как строку. Посмотрите в циклы foreach и используйте 'KeyValuePair ' как итератор. – awudoin

+0

Итак, используйте для каждого и замените серию KeyValuePair ? – zirjeo

0

Вы должны объявить _stocks в рамках уровня класса. Поскольку вы объявили его в методе Initialize, его видимость становится локальной для этого метода. Таким образом, вы должны объявить его вместе с variable1 и variable2 как

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

Вы, возможно, придется смотреть в Access modifiers и Variable and Method Scopes для лучшего понимания

+0

Я добавил код OnBardUpdate() в свое первоначальное сообщение в нижней части сообщения. Я опубликовал другие ошибки, которые я получаю сейчас. Это простое решение? благодаря – zirjeo

Смежные вопросы