2013-09-22 139 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