Exemple #1
0
        public void キャンドルマネージャーに2件のキャンドルを設定して更新した場合にキャンドルが正しく更新される()
        {
            var sut = new CandleChartManager(current, (s, r) => mockProvider, store);

            var symbol1 = new TradingSymbol("USD_JPY");
            var range1  = ChartRange.Daily;
            var chart1  = sut.GetChart(symbol1, range1);

            chart1.AddIndicator("SMA5", new SmaIndicator(5));
            chart1.AddIndicator("SMA10", new SmaIndicator(10));
            chart1.AddIndicator("SMA20", new SmaIndicator(20));
            chart1.AddIndicator("SMA60", new SmaIndicator(60));
            chart1.AddIndicator("SMA120", new SmaIndicator(120));

            var symbol2 = new TradingSymbol("EUR_USD");
            var range2  = ChartRange.Daily;
            var chart2  = sut.GetChart(symbol2, range2);

            chart2.AddIndicator("SMA5", new SmaIndicator(5));
            chart2.AddIndicator("SMA10", new SmaIndicator(10));
            chart2.AddIndicator("SMA20", new SmaIndicator(20));
            chart2.AddIndicator("SMA60", new SmaIndicator(60));
            chart2.AddIndicator("SMA120", new SmaIndicator(120));

            var snapshotBeforeUpdate1 = chart1.Snapshot;
            var snapshotBeforeUpdate2 = chart2.Snapshot;

            sut.Update(to);
            var snapshotAfterUpdate1 = chart1.Snapshot;
            var snapshotAfterUpdate2 = chart2.Snapshot;

            Assert.IsTrue(snapshotBeforeUpdate1.Candles.Last().Time < snapshotAfterUpdate1.Candles.Last().Time);
            Assert.IsTrue(snapshotBeforeUpdate2.Candles.Last().Time < snapshotAfterUpdate2.Candles.Last().Time);
        }
Exemple #2
0
        public void OANDAよりデータを取得してチャートが更新されることを確認する()
        {
            // 前提条件:
            // トレードをするクラスはチャートが常に勝手に最新に更新されていること
            // を想定して同期的にアクセス可能
            // データを取得する単位はシンボル・チャートの足単位とする
            // (TODO: 最適化できれば複数のシンボル・チャート足を同時に取得したいけど、
            // OANDA的に難しそうなのでとりあえず...分足から日足を生成するとか
            // -> ちなみに↑の最適化したい理由はリクエストが発生すると遅いから)
            //
            // 1. 更新スケジュールを作り、タイミングでトリガーを発生
            // 2. トリガーでプロバイダよりデータを取得する
            // 3. プロバイダがデータを取得出来たらデータストアを更新
            // 4. データストアはチャートマネージャに通知を送信
            // 5. チャートマネージャは送られてきたデータによってチャートを更新する
            // 6. スレッドセーフになるように頑張る

            var symbol = new TradingSymbol("USD_JPY");
            var range  = ChartRange.Daily;

            var from = new DateTime(2017, 12, 1, 0, 0, 0, DateTimeKind.Utc);
            var to   = new DateTime(2017, 12, 1, 0, 2, 0, DateTimeKind.Utc);

            var apiEndpoint = new OandaApi(_server.BaseUri, _server.DefaultAccessToken);
            var provider    = new OandaCandleProvider(apiEndpoint) as ICandleProvider;

            var chartManager = new CandleChartManager(from, (s, r) => provider);

            var chart = chartManager.GetChart(symbol, range);

            // この時点で100件分のチャートが取得済み
            chart.AddIndicator("SMA10", new SmaIndicator(10));
            var snapshot1 = chart.Snapshot;

            Assert.AreEqual(100, snapshot1.Candles.Length);
            Assert.AreEqual(100, snapshot1.Plot <SingleValue>("SMA10").Length);

            // これでチャートが更新される
            chartManager.Update(to);
            var snapshot2 = chart.Snapshot;

            Assert.AreEqual(100, snapshot2.Candles.Length);
            Assert.AreEqual(100, snapshot2.Plot <SingleValue>("SMA10").Length);

            // SNAPSHOT1とSNAPSHOT2のインスタンスが異なることを確認
            Assert.AreNotSame(snapshot1, snapshot2);
        }