TRIMA
Overview of the Triangular Moving Average calculation.
/* TRIMA Description
* =================
* The triangular MA is a weighted moving average. Instead of the
* TA_WMA who put more weigth on the latest price bar, the triangular
* put more weigth on the data in the middle of the specified period.
*
* Examples:
* For TimeSerie={a,b,c,d,e,f...} ('a' is the older price)
*
* 1st value for TRIMA 4-Period is: ((1*a)+(2*b)+(2*c)+(1*d)) / 6
* 2nd value for TRIMA 4-Period is: ((1*b)+(2*c)+(2*d)+(1*e)) / 6
*
* 1st value for TRIMA 5-Period is: ((1*a)+(2*b)+(3*c)+(2*d)+(1*e)) / 9
* 2nd value for TRIMA 5-Period is: ((1*b)+(2*c)+(3*d)+(2*e)+(1*f)) / 9
*
* Generally Accepted Implementation
* ==================================
* Using algebra, it can be demonstrated that the TRIMA is equivalent to
* doing a SMA of a SMA. The following explain the rules:
*
* (1) When the period is even, TRIMA(x,period)=SMA(SMA(x,period/2),(period/2)+1)
* (2) When the period is odd, TRIMA(x,period)=SMA(SMA(x,(period+1)/2),(period+1)/2)
*
* In other words:
* (1) A period of 4 becomes TRIMA(x,4) = SMA( SMA( x, 2), 3 )
* (2) A period of 5 becomes TRIMA(x,5) = SMA( SMA( x, 3), 3 )
*
* The SMA of a SMA is the algorithm generaly found in books.
*
* Tradestation Implementation
* ===========================
* Tradestation deviate from the generally accepted implementation by
* making the TRIMA to be as follow:
* TRIMA(x,period) = SMA( SMA( x, (int)(period/2)+1), (int)(period/2)+1 );
* This formula is done regardless if the period is even or odd.
*
* In other word:
* (1) A period of 4 becomes TRIMA(x,4) = SMA( SMA( x, 3), 3 )
* (2) A period of 5 becomes TRIMA(x,5) = SMA( SMA( x, 3), 3 )
* (3) A period of 6 becomes TRIMA(x,5) = SMA( SMA( x, 4), 4 )
* (4) A period of 7 becomes TRIMA(x,5) = SMA( SMA( x, 4), 4 )
*
* It is not clear to me if the Tradestation approach is a bug or a deliberate
* decision to do things differently.
*
* Metastock Implementation
* ========================
* Output is the same as the generally accepted implementation.
*
* TA-Lib Implementation
* =====================
* Output is also the same as the generally accepted implementation.
*
* For speed optimization and avoid memory allocation, TA-Lib use
* a better algorithm than the usual SMA of a SMA.
*
* The calculation from one TRIMA value to the next is done by doing 4
* little adjustment (the following show a TRIMA 4-period):
*
* TRIMA at time 'd': ((1*a)+(2*b)+(2*c)+(1*d)) / 6
* TRIMA at time 'e': ((1*b)+(2*c)+(2*d)+(1*e)) / 6
*
* To go from TRIMA 'd' to 'e', the following is done:
* 1) 'a' and 'b' are substract from the numerator.
* 2) 'd' is added to the numerator.
* 3) 'e' is added to the numerator.
* 4) Calculate TRIMA by doing numerator / 6
* 5) Repeat sequence for next output
*
* These operations are the same steps done by TA-LIB:
* 1) is done by numeratorSub
* 2) is done by numeratorAdd.
* 3) is obtain from the latest input
* 4) Calculate and write TRIMA in the output
* 5) Repeat for next output.
*
* Of course, numerotrAdd and numeratorSub needs to be
* adjusted for each iteration.
*
* The update of numeratorSub needs values from the input at
* the trailingIdx and middleIdx position.
*
* The update of numeratorAdd needs values from the input at
* the middleIdx and todayIdx.
*/Last updated
Was this helpful?