/// <summary> /// 値を取得します。 /// </summary> /// <param name="candles">ロウソク足のコレクション</param> /// <returns>値</returns> public virtual decimal[] GetValues(DataTypes.CandleCollection candles) { // 必要期間に満たない if (candles.Count < Period + 1) { return(null); } // 真の値幅(TR) List <decimal> trs = new List <decimal>(); for (int i = 0; i < Period; i++) { trs.Add(new decimal[] { Math.Abs(candles[i].High - candles[i].Low), // 当日高値 - 当日安値 Math.Abs(candles[i].High - candles[i + 1].Close), // 当日高値 - 前日終値 Math.Abs(candles[i].Low - candles[i + 1].Close) // 当日安値 - 前日終値 }.Max()); } // ATR decimal atr = MovingAverageIndicator.GetMovingAverage(trs.ToArray(), MaMethod.Smma, PreviousAtr); // 次回のために覚えておく PreviousAtr = atr; return(new decimal[] { atr }); }
/// <summary> /// 値を取得します。 /// </summary> /// <param name="candles">ロウソク足のコレクション</param> /// <returns>値</returns> public decimal[] GetValues(DataTypes.CandleCollection candles) { // 必要期間に満たない if (candles.Count < FastMaIndicator.Period || candles.Count < SlowMaIndicator.Period) { return(null); } // キュー作成 if (MacdQueue == null) { MacdQueue = new Queue <decimal>(); } // 移動平均 decimal fast_ma = FastMaIndicator.GetValues(candles)[0]; decimal slow_ma = SlowMaIndicator.GetValues(candles)[0]; // MACD decimal macd = fast_ma - slow_ma; // キューに格納 MacdQueue.Enqueue(macd); if (MacdQueue.Count > SignalPeriod) { MacdQueue.Dequeue(); } // 必要期間に満たない if (MacdQueue.Count < SignalPeriod) { return(null); } // シグナル decimal signal = MovingAverageIndicator.GetMovingAverage(MacdQueue.ToArray(), SignalMaMethod, PreviousSignal); // 次回のために覚えておく PreviousSignal = signal; return(new decimal[] { macd, signal }); }