c# MACD 算法實現

此算法在自己WP7應用中 用到  
同花順 算法
DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG);
DEA  : EMA(DIFF,M);
MACD : 2*(DIFF-DEA);
Zero : 0;
關鍵點是第一天的數據
如果是區間的數據,區間第一天的DIF DEA MACD 都是0
<pre name="code" class="csharp">/// <summary>
        /// MACD算法
        /// </summary>
        /// <param name="n1">12</param>
        /// <param name="n2">26</param>
        /// <param name="n3">9</param>
        /// <param name="day">K線數據</param>
        /// <returns></returns>
        public static List<KLinfo> ComputationMACD2(int SHORT, int LONG, int M, List<KLinfo> KLStocklist)
        {
            for (int i = 0; i < KLStocklist.Count;i++ )
            {

                if (KLStocklist[i].KID == 1)
                {
                    KLStocklist[i].Ema12Value = KLStocklist[i].ClosePrice;
                    KLStocklist[i].Ema26Value = KLStocklist[i].ClosePrice;
                    KLStocklist[i].DifValue = KLStocklist[i].Ema12Value - KLStocklist[i].Ema26Value;
                    KLStocklist[i].DeaValue = KLStocklist[i].DifValue;
                    KLStocklist[i].MacdValue = 2.0 * (KLStocklist[i].DifValue - KLStocklist[i].DeaValue);
                }
                else
                {
                    KLStocklist[i].Ema12Value = (2 * KLStocklist[i].ClosePrice + (SHORT - 1) * KLStocklist[KLStocklist[i].KID - 2].Ema12Value) / (SHORT + 1);
                    KLStocklist[i].Ema26Value = (2 * KLStocklist[i].ClosePrice + (LONG - 1) * KLStocklist[KLStocklist[i].KID - 2].Ema26Value) / (LONG + 1);
                    KLStocklist[i].DifValue = KLStocklist[i].Ema12Value - KLStocklist[i].Ema26Value;
                    KLStocklist[i].DeaValue = (2 * KLStocklist[i].DifValue + (M - 1) * KLStocklist[KLStocklist[i].KID - 2].DeaValue) / (M + 1);
                    KLStocklist[i].MacdValue = 2.0 * (KLStocklist[i].DifValue - KLStocklist[i].DeaValue);

                }
            }

             return KLStocklist;
        }



1  /// <summary>
        /// KDJ算法
        /// </summary>
        /// <param name="N">9</param>
        /// <param name="M1">3</param>
        /// <param name="M2">3</param>
        /// <param name="KLStocklist">K線數據</param>
        /// <returns></returns>
        public static List<KLinfo> ComputationKJD(int N, int M1, int M2, List<KLinfo> KLStocklist)
        {

            for (int i = 0; i < KLStocklist.Count; i++)
            {
                double RSV = 0;
                double a = 0;
                double b = 0;
                double e = 0;

                GetMinMaxPirce(i + 1, N, KLStocklist);

                if (KLStocklist[i].KID == 1)
                {
                    RSV = (KLStocklist[i].ClosePrice - KLStocklist[i].MinPrice) / (KLStocklist[i].MaxPrice - KLStocklist[i].MinPrice) * 100;
                    a = (1 * RSV + (M1 - 1) * 0) / 1;
                    b = (1 * a + (M2 - 1) * 0) / 1;
                    e = 3 * a - 2 * b;
                  
                }
                else
                {
                    RSV = (KLStocklist[i].ClosePrice - KLStocklist[i].MinPrice) / (KLStocklist[i].MaxPrice - KLStocklist[i].MinPrice) * 100;
                    a = (1 * RSV + (M1 - 1) * KLStocklist[i - 1].Kvalue) / M1;
                    b = (1 * a + (M2 - 1) * KLStocklist[i - 1].Dvalue) / M2;
                    e = 3 * a - 2 * b;
                }

                KLStocklist[i].RSV = RSV;
                KLStocklist[i].Kvalue = a;
                KLStocklist[i].Dvalue = b;
                KLStocklist[i].Jvalue = e;

                if (a < 0) KLStocklist[i].Kvalue = 0;
                if (a > 100) KLStocklist[i].Kvalue = 100;
                if (b < 0) KLStocklist[i].Dvalue = 0;
                if (b > 100) KLStocklist[i].Dvalue = 100;
                if (e < 0) KLStocklist[i].Jvalue = 0;
                if (e > 100) KLStocklist[i].Jvalue = 100;
            }



            return null;

        }

        /// <summary>
        /// 獲取區間最大最小
        /// </summary>
        /// <param name="Index">當日K線</param>
        /// <param name="N">9</param>
        /// <param name="KLStocklist">K線數據</param>
        /// <returns></returns>
        public static void GetMinMaxPirce(int Index, int N, List<KLinfo> KLStocklist)
        {

            var MinPirce = from n in KLStocklist where n.KID <= Index && n.KID > ((Index - N) < 0 ? 0 : (Index - N)) select n;

            if (MinPirce.Count() != 0)
            {
                KLStocklist[Index-1].MinPrice = MinPirce.Select(n => n.LowPrice).Min();
                KLStocklist[Index-1].MaxPrice = MinPirce.Select(n => n.HighPrice).Max();
            }
          

        }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章