-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++;                     }
            }
        }
    }
}    
4

2 に答える 2

0

Hans が提案したように、_stocks 変数を Initialise メソッドの外に移動してみてください。以下の例を参照してください。

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 } );
    ....
}
于 2013-09-22T22:14:26.653 に答える
0

タイプの各変数またはリスト項目にStockEntry、名前、期間、値、およびカウントの組み合わせを保持しますか? または、そのような各変数またはリスト項目に、名前、期間、値、およびカウントを持つエンティティへの参照を保持させたいですか? 構造体型には前者の意味があります。クラス型には後者の意味があります。

構造のリストがあり、リスト項目の一部を変更したい場合は、リスト項目を読み取り、変更を加え、書き戻す必要があります。リストに変更可能なクラス型への参照が含まれている場合、リストから参照を読み取り、リストを更新せずに参照先のオブジェクトを変更できます。これはしばしば便利ですが、その便利さには代償が伴います。リストの目的が項目に保持されている情報をカプセル化することである場合、リスト内の各項目がユニバース内の任意の場所への唯一の参照を保持していることを確認する必要があります。StockEntry問題のエントリを積極的に使用している場合を除きます。これは一般に、リスト内の情報を外部コードに公開する唯一の安全な方法は、その情報を他のオブジェクトにコピーすることであることを意味します。

良いパターンは、次のようなクラスを定義することです。

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

を使用しList<SimpleHolder<StockItem>>ます。次に を定義すると、リストに保持されているエンティティを更新するように指定できますがSimpleHolder<StockItem> stockEntry;、保持しているエンティティを公開することなく、そこに含まれるデータを返す手段としてメソッドが a を返すようにすることもできます。 .stockEntry.Value.Count++;StockItem

于 2013-09-25T15:45:57.127 に答える