2013-09-22 137 views
-1

使用C#。我沒有收到任何編譯錯誤,但似乎沒有按計劃運行。有什麼不正確使用我怎麼有這個名單<的>以下結構的設置?..試圖創建一個結構列表

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

List<StockEntry> _stocks = new List<StockEntry>(); 

protected override void Initialize() 
{ 
    //5min price bars 
    _stocks.Add(new StockEntry { Name = "ABC", Period = PeriodType.Minute, Value = 5, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ACE", Period = PeriodType.Minute, Value = 5, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ACN", Period = PeriodType.Minute, Value = 5, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ADT", Period = PeriodType.Minute, Value = 5, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "SCTY", Period = PeriodType.Minute, Value = 5, Count = 0 }); 

    //1min price bars 
    _stocks.Add(new StockEntry { Name = "ABC", Period = PeriodType.Minute, Value = 1, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ACE", Period = PeriodType.Minute, Value = 1, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ACN", Period = PeriodType.Minute, Value = 1, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "ADT", Period = PeriodType.Minute, Value = 1, Count = 0 }); 
    _stocks.Add(new StockEntry { Name = "SCTY", Period = PeriodType.Minute, Value = 1, Count = 0 }); 
} 

** *下方*

部分加入任何地方它計數是我不確定它是否真的在計算我正試圖完成的交易量。

protected override void OnBarUpdate() 
{ 
    // for loop to iterate each stock through the required 
    // entry conditions. "series" is just a 5min price bar 
    // of each instrument, "series + 5" is 1min of each 
    // instrument. Hoping the first stock I added above 
    // takes Index 1, then the next stock added takes Index 2 and so on.     
    for (int series = 0; series < 5; series++) 
    { 
     if (BarsInProgress == series + 5) //OnBarUpdate called for 1min bars 
     {  
      var stockEntry = _stocks[series]; 
      bool enterTrade = false; 

      if (stockEntry.Count < 1)//if 0 entries 
      { 
       enterTrade = true; 
      } 
      else // if 1 or more entries make sure 2 price bars or 10min has elapsed before entering another trade 
      { 
       enterTrade = BarsSinceEntry(series, "", 0) > 2; 
      } 

      if (enterTrade) 
      { 
       // Condition for Long Entry, fast MA cross above slow MA & current price > high of bar at cross 
       if (SMA(BarsArray[series],Fast)[1] > SMA(BarsArray[series],Slow)[1] && 
        SMA(BarsArray[series],Fast)[2] < SMA(BarsArray[series],Slow)[2] && 
        Closes[series + 5][0] > Highs[series][1] + distance && 
        SMA(BarsArray[series],Slow)[1] > SMA(BarsArray[series],Slow)[2] + .01) 
       {   
        EnterLong(200); //enter long 200 shares 

        // store/track that a trade for the current stock has 
        // taken place so that it can process through the condition 
        // above that requests how many trades have already taken place. 
        stockEntry.Count++;      } 
      } 
     } 
    } 
}  
+6

什麼不按計劃工作? – dbarnes

+3

顯然是局部變量。該方法返回後,不再列表。 –

回答

0

正如Hans所建議的,嘗試在Initialise方法之外移動_stocks變量。見下面的例子。

List<StockEntry> _stocks = new List<StockEntry>(); // Make it a class variable, not a method variable.   

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

我已經將它定義爲使用私人列表的類的字段 _stocks; – zirjeo

+0

任何想法爲什麼我被阻止發佈更多的帖子?我想我有一個合理的問題,問我是否正確構建了一個結構列表。我是編碼新手,所以這並不容易。但無論哪種方式,我已經在班上定義了它,即使它是多餘的。 – zirjeo

+0

你不清楚什麼是不工作。給我們更多的細節。你希望你的代碼發生什麼行爲? –

0

你想StockEntry類型的變量或列表項舉行的名字,期間,值的組合,和算什麼?或者你想讓每個這樣的變量或列表項目持有對具有名稱,期間,值和數量的實體的引用嗎?結構類型具有前者的含義;類類型具有後者的含義。

如果你有一個結構列表,並且希望修改列表項目的一部分,你必須讀出列表項目,進行修改,然後將其寫回到。如果列表包含對可變類類型的引用,則可以從列表中讀取引用,然後修改它引用的對象而不必更新列表。這樣做通常很方便,但這樣的便利是有代價的:如果列表的目的是封裝項目中保存的信息,則必須確保列表中的每個項目在宇宙中的任何地方僅保存StockEntry以外的時間,當一個人正在積極使用有問題的條目。這通常意味着將列表中的信息暴露給外部代碼的唯一安全方法是將該信息複製到其他對象。

我的建議是一個很好的模式是定義一個類是這樣的:

class SimpleHolder<T> 
{ 
    public T Value; 
    SimpleHolder() {} 
    SimpleHolder(T val) {Value = val;} 
} 

然後用List<SimpleHolder<StockItem>>。如果您隨後定義了SimpleHolder<StockItem> stockEntry;,您將能夠說stockEntry.Value.Count++;並讓它更新列表中保存的實體,但也可以使方法返回StockItem作爲返回其中包含的數據的方法,而無需公開該實體擁有它。

+0

沒有看到回覆。也許我把所有的事情都設置錯了。唯一應該改變的是伯爵(股票發起新交易的次數)。其他3個變量是常數..名稱只是股票的名稱,期間類型始終爲分鐘,且值始終爲5(5分鐘)。我使用的軟件需要添加到腳本中的每個股票名稱的名稱,期間類型和值。所以通常它只是添加每個股票的Add(「Name」,PeriodType.Min,5)。我只是引入計算每個已發起股票交易次數的額外因素。 – zirjeo

+0

@zirjeo:聽起來好像「Count」實際上不屬於'StockEntry'的其他部分。你可以定義一個'CountedThing '類,它包含一個'T'類型的'Value'和一個'Count',然後有一個'List >',或者設計一個類型'CountedThingList ' 'T []'或'List ',以及'int []'或'List ',並且保持兩個陣列或列表彼此「同步」。我喜歡自己使用數組[一個'List '實際上只不過是一個數組和一個「活動項目數」)。 – supercat

+0

Add(「Stock 1」,PeriodType.Min,5)//變成索引1 – zirjeo