個別株のデータを格納する配列

auカブコムAPIのデータを取得するには、私は「Queue」を使います。

配列の一種になりますが「先入れ後出し」が出来るデータ格納庫です。

データをロジックプログラム側から「kabuステーション」にリクエストすると、時間もかかるし、処理が例えば0.5秒かかると既に間引きされた状態となってしまいます。

基本的に私は「kabuステーション」からPUSHされたデータを利用するようにしていますが、処理が追い付かない場合もあるので、データは一旦Queueに入れて、処理後に格納庫の後ろから「Dequeue()」で取り出すような設計をします。

これは再現性を重要視しているからです。

ただロジックで計算する場合には、例えばMA(移動平均線)の場合には、何個分の過去のデータを平均するか?という事をするので「Dequeue()」で出したデータを使わない場合もあります。

その場合に「最大容量付きのQueue」という便利な関数を見つけたので紹介します。

public class FixedQueue<T> : IEnumerable<T>
{
    private Queue<T> _queue;

    public int Count => _queue.Count;

    public int Capacity { get; private set; }

    public FixedQueue(int capacity)
    {
        Capacity = capacity;
        _queue = new Queue<T>(capacity);
    }

    public void Enqueue(T item)
    {
        _queue.Enqueue(item);

        if (Count > Capacity) Dequeue();
    }

    public T Dequeue() => _queue.Dequeue();

    public T Peek() => _queue.Peek();

    public IEnumerator<T> GetEnumerator() => _queue.GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() => _queue.GetEnumerator();
}

使い方は「Enqueue()」で追加するだけで、勝手に後ろからデータが「Dequeue()」してくれます。

static void Main(string[] args)
{
    // 最大容量が3のキュー
    var vMA1 = new FixedQueue<double>(21);

    fixedQueue.Enqueue(price1);
    fixedQueue.Enqueue(price2);
    fixedQueue.Enqueue(price3);
    fixedQueue.Enqueue(price4);
    ....
    fixedQueue.Enqueue(price21);
    Console.WriteLine(vMA1.Average()) //1-21平均

    fixedQueue.Enqueue(price22);
    Console.WriteLine(vMA1.Average()) //2-22平均
}

こんな感じで使えます。