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平均
}
こんな感じで使えます。