예제 #1
0
 /// <summary>
 /// Возвращает список значений, соответствующих индикатору MACD за указанный период
 /// </summary>
 /// <param name="rates">Список цен</param>
 /// <param name="fast_ma">Период "быстрой" скользящей</param>
 /// <param name="slow_ma">Период "медленной" скользящей</param>
 /// <param name="signal">Период сигнала</param>
 /// <param name="name">Индивидуальное имя индикатора</param>
 /// <returns></returns>
 public MACD(List <double> rates, int fast_ma = 12, int slow_ma = 26, int signal = 9, string name = "MACD")
     : base("MACD", name)
 {
     try
     {
         //Проверка входных параметров
         if (rates == null)
         {
             throw new Exception("Нет входных данных");
         }
         if (fast_ma < 2 || slow_ma < 2 || signal < 2)
         {
             throw new Exception("Параметры скользящих должны быть не меньше 2");
         }
         Rates         = rates;
         FastMA_Period = fast_ma;
         SlowMA_Period = slow_ma;
         Signal_Period = signal;
         Subtotals     = new SubtotalsMACD(fast_ma, slow_ma, signal);
         Values        = new List <MACDValue>(rates.Count);
         CreateIndicator();
     }
     catch (Exception e)
     {
         ErrorOfInit(e.Message);
     }
     EndOfInit();
 }
예제 #2
0
        public override bool AddPoints()
        {
            // проверим, есть ли что вообще добавлять
            Error = "Ok";
            bool res = true;

            try
            {
                var Cr = Rates.Count;
                var Cv = Values.Count;
                var dc = Cr - Cv;
                if (dc < 0)
                {
                    throw new Exception($"Список значений {Name} больше значений исходного ряда.");
                }
                if (dc > 0)
                {
                    for (int i = Cr - dc; i < Cr; i++)
                    {
                        Subtotals.UpdatePrice(Rates[i]);
                        var(val, subtotals) = GetPoint(Subtotals);
                        Values.Add(val);
                        Subtotals = subtotals;
                    }
                }
            }
            catch (Exception e)
            {
                res   = false;
                Error = e.Message;
            }
            return(res);
        }
예제 #3
0
 public SubtotalsMACD(SubtotalsMACD subMACD)
 {
     EMA_fast      = subMACD.EMA_fast;
     EMA_slow      = subMACD.EMA_slow;
     EMA_sig       = subMACD.EMA_sig;
     A_fast        = subMACD.A_fast;
     A_slow        = subMACD.A_slow;
     A_sig         = subMACD.A_sig;
     Price         = subMACD.Price;
     PreviousPrice = subMACD.PreviousPrice;
 }
예제 #4
0
        public (MACDValue macd, SubtotalsMACD subMACD) GetPoint(SubtotalsMACD sub_MACD)
        {
            var s = new SubtotalsMACD(sub_MACD);
            var p = s.Price;

            s.EMA_fast = (p - s.EMA_fast) * s.A_fast + s.EMA_fast;
            s.EMA_slow = (p - s.EMA_slow) * s.A_slow + s.EMA_slow;
            var m = new MACDValue();

            m.FastMACD  = s.EMA_fast - s.EMA_slow;
            m.Signal    = (m.FastMACD - s.EMA_sig) * s.A_sig + s.EMA_sig;
            m.Histogram = m.FastMACD - m.Signal;
            s.EMA_sig   = m.Signal;

            //var p = Rates[i];
            //ema_fast = (p - ema_fast) * ew_fast + ema_fast;
            //ema_slow = (p - ema_slow) * ew_slow + ema_slow;
            //var macd_ = ema_fast - ema_slow;
            //sig = (macd_ - sig) * ew_signal + sig;
            //macd.Add((macd_, sig));
            return(m, s);
        }