⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ta_mama.c

📁 股票主要技术指标源码
💻 C
📖 第 1 页 / 共 2 页
字号:
   Re     = Im     = 0.0;   mama   = fama   = 0.0;   I1ForOddPrev3 = I1ForEvenPrev3 = 0.0;   I1ForOddPrev2 = I1ForEvenPrev2 = 0.0;   prevPhase  = 0.0;   /* The code is speed optimized and is most likely very    * hard to follow if you do not already know well the    * original algorithm.    * To understadn better, it is strongly suggested to look     * first at the Excel implementation in "test_MAMA.xls" included    * in this package.    */   while( today <= endIdx )   {      adjustedPrevPeriod = (0.075*period)+0.54;      todayValue = inReal[today];      DO_PRICE_WMA(todayValue,smoothedValue);      if( (today%2) == 0 )      {         /* Do the Hilbert Transforms for even price bar */         DO_HILBERT_EVEN(detrender,smoothedValue);         DO_HILBERT_EVEN(Q1,detrender);         DO_HILBERT_EVEN(jI,I1ForEvenPrev3);         DO_HILBERT_EVEN(jQ,Q1);         if( ++hilbertIdx == 3 )            hilbertIdx = 0;         Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);         I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2);         /* The variable I1 is the detrender delayed for          * 3 price bars.           *          * Save the current detrender value for being          * used by the "odd" logic later.          */         I1ForOddPrev3 = I1ForOddPrev2;         I1ForOddPrev2 = detrender;         /* Put Alpha in tempReal2 */         if( I1ForEvenPrev3 != 0.0 )            tempReal2 = (std_atan(Q1/I1ForEvenPrev3)*rad2Deg);         else            tempReal2 = 0.0;      }      else      {         /* Do the Hilbert Transforms for odd price bar */         DO_HILBERT_ODD(detrender,smoothedValue);         DO_HILBERT_ODD(Q1,detrender);         DO_HILBERT_ODD(jI,I1ForOddPrev3);         DO_HILBERT_ODD(jQ,Q1);         Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);         I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2);         /* The varaiable I1 is the detrender delayed for          * 3 price bars.           *          * Save the current detrender value for being          * used by the "odd" logic later.          */         I1ForEvenPrev3 = I1ForEvenPrev2;         I1ForEvenPrev2 = detrender;         /* Put Alpha in tempReal2 */         if( I1ForOddPrev3 != 0.0 )            tempReal2 = (std_atan(Q1/I1ForOddPrev3)*rad2Deg);         else            tempReal2 = 0.0;      }      /* Put Delta Phase into tempReal */      tempReal  = prevPhase - tempReal2;      prevPhase = tempReal2;      if( tempReal < 1.0 )         tempReal = 1.0;      /* Put Alpha into tempReal */      if( tempReal > 1.0 )      {         tempReal = optInFastLimit/tempReal;         if( tempReal < optInSlowLimit )            tempReal = optInSlowLimit;      }      else      {         tempReal = optInFastLimit;      }        /* Calculate MAMA, FAMA */      mama = (tempReal*todayValue)+((1-tempReal)*mama);      tempReal *= 0.5;      fama = (tempReal*mama)+((1-tempReal)*fama);      if( today >= startIdx )      {         outMAMA[outIdx] = mama;         outFAMA[outIdx++] = fama;      }      /* Adjust the period for next price bar */      Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re);      Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im);      prevQ2 = Q2;      prevI2 = I2;      tempReal = period;      if( (Im != 0.0) && (Re != 0.0) )         period = 360.0 / (std_atan(Im/Re)*rad2Deg);      tempReal2 = 1.5*tempReal;      if( period > tempReal2)         period = tempReal2;      tempReal2 = 0.67*tempReal;      if( period < tempReal2 )         period = tempReal2;      if( period < 6 )         period = 6;      else if( period > 50 )         period = 50;      period = (0.2*period) + (0.8 * tempReal);      /* Ooof... let's do the next price bar now! */      today++;   }   /* Default return values */   VALUE_HANDLE_DEREF(outNBElement) = outIdx;   return ENUM_VALUE(RetCode,TA_SUCCESS,Success);}/**** START GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****//* Generated */ /* Generated */ #define  USE_SINGLE_PRECISION_INPUT/* Generated */ #if !defined( _MANAGED ) && !defined( _JAVA )/* Generated */    #undef   TA_PREFIX/* Generated */    #define  TA_PREFIX(x) TA_S_##x/* Generated */ #endif/* Generated */ #undef   INPUT_TYPE/* Generated */ #define  INPUT_TYPE float/* Generated */ #if defined( _MANAGED )/* Generated */ enum class Core::RetCode Core::Mama( int    startIdx,/* Generated */                                      int    endIdx,/* Generated */                                      cli::array<float>^ inReal,/* Generated */                                      double        optInFastLimit, /* From 0.01 to 0.99 *//* Generated */                                      double        optInSlowLimit, /* From 0.01 to 0.99 *//* Generated */                                      [Out]int%    outBegIdx,/* Generated */                                      [Out]int%    outNBElement,/* Generated */                                      cli::array<double>^  outMAMA,/* Generated */                                      cli::array<double>^  outFAMA )/* Generated */ #elif defined( _JAVA )/* Generated */ public RetCode mama( int    startIdx,/* Generated */                      int    endIdx,/* Generated */                      float        inReal[],/* Generated */                      double        optInFastLimit, /* From 0.01 to 0.99 *//* Generated */                      double        optInSlowLimit, /* From 0.01 to 0.99 *//* Generated */                      MInteger     outBegIdx,/* Generated */                      MInteger     outNBElement,/* Generated */                      double        outMAMA[],/* Generated */                      double        outFAMA[] )/* Generated */ #else/* Generated */ TA_RetCode TA_S_MAMA( int    startIdx,/* Generated */                       int    endIdx,/* Generated */                       const float  inReal[],/* Generated */                       double        optInFastLimit, /* From 0.01 to 0.99 *//* Generated */                       double        optInSlowLimit, /* From 0.01 to 0.99 *//* Generated */                       int          *outBegIdx,/* Generated */                       int          *outNBElement,/* Generated */                       double        outMAMA[],/* Generated */                       double        outFAMA[] )/* Generated */ #endif/* Generated */ {/* Generated */    int outIdx, i;/* Generated */    int lookbackTotal, today;/* Generated */    double tempReal, tempReal2;/* Generated */    double adjustedPrevPeriod, period;/* Generated */    int trailingWMAIdx;/* Generated */    double periodWMASum, periodWMASub, trailingWMAValue;/* Generated */    double smoothedValue;/* Generated */    CONSTANT_DOUBLE(a) = 0.0962;/* Generated */    CONSTANT_DOUBLE(b) = 0.5769;/* Generated */    double hilbertTempReal;/* Generated */    int hilbertIdx;/* Generated */    HILBERT_VARIABLES( detrender );/* Generated */    HILBERT_VARIABLES( Q1 );/* Generated */    HILBERT_VARIABLES( jI );/* Generated */    HILBERT_VARIABLES( jQ );/* Generated */    double Q2, I2, prevQ2, prevI2, Re, Im;/* Generated */    double I1ForOddPrev2,  I1ForOddPrev3;/* Generated */    double I1ForEvenPrev2, I1ForEvenPrev3;/* Generated */    double rad2Deg;/* Generated */    double mama,fama,todayValue,prevPhase;/* Generated */  #ifndef TA_FUNC_NO_RANGE_CHECK/* Generated */     if( startIdx < 0 )/* Generated */        return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_START_INDEX,OutOfRangeStartIndex);/* Generated */     if( (endIdx < 0) || (endIdx < startIdx))/* Generated */        return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_END_INDEX,OutOfRangeEndIndex);/* Generated */     #if !defined(_JAVA)/* Generated */     if( !inReal ) return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */     #endif /* Generated */     if( optInFastLimit == TA_REAL_DEFAULT )/* Generated */        optInFastLimit = 5.000000e-1;/* Generated */     else if( (optInFastLimit < 1.000000e-2) ||  (optInFastLimit > 9.900000e-1) )/* Generated */        return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */     if( optInSlowLimit == TA_REAL_DEFAULT )/* Generated */        optInSlowLimit = 5.000000e-2;/* Generated */     else if( (optInSlowLimit < 1.000000e-2) ||  (optInSlowLimit > 9.900000e-1) )/* Generated */        return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */     #if !defined(_JAVA)/* Generated */     if( !outMAMA )/* Generated */        return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */     if( !outFAMA )/* Generated */        return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */     #endif /* Generated */  #endif /* Generated */    rad2Deg = 180.0 / (4.0 * std_atan(1));/* Generated */    lookbackTotal = 32 + TA_GLOBALS_UNSTABLE_PERIOD(TA_FUNC_UNST_MAMA,Mama);/* Generated */    if( startIdx < lookbackTotal )/* Generated */       startIdx = lookbackTotal;/* Generated */    if( startIdx > endIdx )/* Generated */    {/* Generated */       VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx);/* Generated */       VALUE_HANDLE_DEREF_TO_ZERO(outNBElement);/* Generated */       return ENUM_VALUE(RetCode,TA_SUCCESS,Success);/* Generated */    }/* Generated */    VALUE_HANDLE_DEREF(outBegIdx) = startIdx;/* Generated */    trailingWMAIdx = startIdx - lookbackTotal;/* Generated */    today = trailingWMAIdx;/* Generated */    tempReal = inReal[today++];/* Generated */    periodWMASub = tempReal;/* Generated */    periodWMASum = tempReal;/* Generated */    tempReal = inReal[today++];/* Generated */    periodWMASub += tempReal;/* Generated */    periodWMASum += tempReal*2.0;/* Generated */    tempReal = inReal[today++];/* Generated */    periodWMASub += tempReal;/* Generated */    periodWMASum += tempReal*3.0;/* Generated */    trailingWMAValue = 0.0;/* Generated */    #define DO_PRICE_WMA(varNewPrice,varToStoreSmoothedValue) { \/* Generated */       periodWMASub     += varNewPrice; \/* Generated */       periodWMASub     -= trailingWMAValue; \/* Generated */       periodWMASum     += varNewPrice*4.0; \/* Generated */       trailingWMAValue  = inReal[trailingWMAIdx++]; \/* Generated */       varToStoreSmoothedValue = periodWMASum*0.1; \/* Generated */       periodWMASum -= periodWMASub; \/* Generated */    }/* Generated */    i = 9;/* Generated */    do/* Generated */    {/* Generated */       tempReal = inReal[today++];/* Generated */       DO_PRICE_WMA(tempReal,smoothedValue);/* Generated */    } while( --i != 0);/* Generated */    hilbertIdx = 0;/* Generated */    INIT_HILBERT_VARIABLES(detrender);/* Generated */    INIT_HILBERT_VARIABLES(Q1);/* Generated */    INIT_HILBERT_VARIABLES(jI);/* Generated */    INIT_HILBERT_VARIABLES(jQ);/* Generated */    period = 0.0;/* Generated */    outIdx = 0;/* Generated */    prevI2 = prevQ2 = 0.0;/* Generated */    Re     = Im     = 0.0;/* Generated */    mama   = fama   = 0.0;/* Generated */    I1ForOddPrev3 = I1ForEvenPrev3 = 0.0;/* Generated */    I1ForOddPrev2 = I1ForEvenPrev2 = 0.0;/* Generated */    prevPhase  = 0.0;/* Generated */    while( today <= endIdx )/* Generated */    {/* Generated */       adjustedPrevPeriod = (0.075*period)+0.54;/* Generated */       todayValue = inReal[today];/* Generated */       DO_PRICE_WMA(todayValue,smoothedValue);/* Generated */       if( (today%2) == 0 )/* Generated */       {/* Generated */          DO_HILBERT_EVEN(detrender,smoothedValue);/* Generated */          DO_HILBERT_EVEN(Q1,detrender);/* Generated */          DO_HILBERT_EVEN(jI,I1ForEvenPrev3);/* Generated */          DO_HILBERT_EVEN(jQ,Q1);/* Generated */          if( ++hilbertIdx == 3 )/* Generated */             hilbertIdx = 0;/* Generated */          Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);/* Generated */          I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2);/* Generated */          I1ForOddPrev3 = I1ForOddPrev2;/* Generated */          I1ForOddPrev2 = detrender;/* Generated */          if( I1ForEvenPrev3 != 0.0 )/* Generated */             tempReal2 = (std_atan(Q1/I1ForEvenPrev3)*rad2Deg);/* Generated */          else/* Generated */             tempReal2 = 0.0;/* Generated */       }/* Generated */       else/* Generated */       {/* Generated */          DO_HILBERT_ODD(detrender,smoothedValue);/* Generated */          DO_HILBERT_ODD(Q1,detrender);/* Generated */          DO_HILBERT_ODD(jI,I1ForOddPrev3);/* Generated */          DO_HILBERT_ODD(jQ,Q1);/* Generated */          Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);/* Generated */          I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2);/* Generated */          I1ForEvenPrev3 = I1ForEvenPrev2;/* Generated */          I1ForEvenPrev2 = detrender;/* Generated */          if( I1ForOddPrev3 != 0.0 )/* Generated */             tempReal2 = (std_atan(Q1/I1ForOddPrev3)*rad2Deg);/* Generated */          else/* Generated */             tempReal2 = 0.0;/* Generated */       }/* Generated */       tempReal  = prevPhase - tempReal2;/* Generated */       prevPhase = tempReal2;/* Generated */       if( tempReal < 1.0 )/* Generated */          tempReal = 1.0;/* Generated */       if( tempReal > 1.0 )/* Generated */       {/* Generated */          tempReal = optInFastLimit/tempReal;/* Generated */          if( tempReal < optInSlowLimit )/* Generated */             tempReal = optInSlowLimit;/* Generated */       }/* Generated */       else/* Generated */       {/* Generated */          tempReal = optInFastLimit;/* Generated */       }  /* Generated */       mama = (tempReal*todayValue)+((1-tempReal)*mama);/* Generated */       tempReal *= 0.5;/* Generated */       fama = (tempReal*mama)+((1-tempReal)*fama);/* Generated */       if( today >= startIdx )/* Generated */       {/* Generated */          outMAMA[outIdx] = mama;/* Generated */          outFAMA[outIdx++] = fama;/* Generated */       }/* Generated */       Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re);/* Generated */       Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im);/* Generated */       prevQ2 = Q2;/* Generated */       prevI2 = I2;/* Generated */       tempReal = period;/* Generated */       if( (Im != 0.0) && (Re != 0.0) )/* Generated */          period = 360.0 / (std_atan(Im/Re)*rad2Deg);/* Generated */       tempReal2 = 1.5*tempReal;/* Generated */       if( period > tempReal2)/* Generated */          period = tempReal2;/* Generated */       tempReal2 = 0.67*tempReal;/* Generated */       if( period < tempReal2 )/* Generated */          period = tempReal2;/* Generated */       if( period < 6 )/* Generated */          period = 6;/* Generated */       else if( period > 50 )/* Generated */          period = 50;/* Generated */       period = (0.2*period) + (0.8 * tempReal);/* Generated */       today++;/* Generated */    }/* Generated */    VALUE_HANDLE_DEREF(outNBElement) = outIdx;/* Generated */    return ENUM_VALUE(RetCode,TA_SUCCESS,Success);/* Generated */ }/* Generated */ /* Generated */ #if defined( _MANAGED )/* Generated */ }}} // Close namespace TicTacTec.TA.Lib/* Generated */ #endif/**** END GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -