KAMA.efs EFSLibrary - Discussion Board
File Name: KAMA.efs
Description:
Kaufman Moving Average Adaptive (KAMA)
Formula Parameters:
Length: 21
Price: Close
Notes:
Everyone wants a short-term, fast trading trend that works without large
losses. That combination does not exist. But it is possible to have fast
trading trends in which one must get in or out of the market quickly, but
these have the distinct disadvantage of being whipsawed by market noise
when the market is volatile in a sideways trending market. During these
periods, the trader is jumping in and out of positions with no profit-making
trend in sight. In an attempt to overcome the problem of noise and still be
able to get closer to the actual change of the trend, Kaufman developed an
indicator that adapts to market movement. This indicator, an adaptive moving
average (AMA), moves very slowly when markets are moving sideways but moves
swiftly when the markets also move swiftly, change directions or break out of
a trading range.
Download File:
KAMA.efs
EFS Code:
/*********************************Provided By: eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2008. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name. eSignal is not responsible for the functionality once modified. eSignal reserves the right to modify and overwrite this EFS file with each new release. Description: Kaufman Moving Average Adaptive (KAMA)Version: 1.0 09/23/2008Notes: Everyone wants a short-term, fast trading trend that works without large losses. That combination does not exist. But it is possible to have fast trading trends in which one must get in or out of the market quickly, but these have the distinct disadvantage of being whipsawed by market noise when the market is volatile in a sideways trending market. During these periods, the trader is jumping in and out of positions with no profit-making trend in sight. In an attempt to overcome the problem of noise and still be able to get closer to the actual change of the trend, Kaufman developed an indicator that adapts to market movement. This indicator, an adaptive moving average (AMA), moves very slowly when markets are moving sideways but moves swiftly when the markets also move swiftly, change directions or break out of a trading range. Formula Parameters: Default: Length 21 Price Close**********************************/ var fpArray = new Array(); var bInit = false; function preMain() { setStudyTitle("KAMA"); setCursorLabelName("KAMA", 0); setDefaultBarFgColor(Color.red, 0); setPlotType(PLOTTYPE_LINE, 0); setDefaultBarThickness(1, 0); setPriceStudy(true); var x = 0; fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER); with (fpArray[x++]) { setLowerLimit(1); setDefault(21); } fpArray[x] = new FunctionParameter("Price", FunctionParameter.STRING); with (fpArray[x++]) { addOption("open"); addOption("high"); addOption("low"); addOption("close"); addOption("hl2"); addOption("hlc3"); addOption("ohlc4"); setDefault("close"); } } var xvnoise = null; var xMyPrice = null; var xAMA = null; function main(Length, Price) { var nAMA = 0; if (Length == null) Length = 21; if (Price == null) Price = "close"; if (bInit == false) { xMyPrice = eval(Price)(); xvnoise = efsInternal("Calc_avnoise", xMyPrice); xAMA = efsInternal("Calc_AMA", xvnoise, xMyPrice, Length); bInit = true; } nAMA = xAMA.getValue(0); return nAMA; } function Calc_AMA(xvnoise, xMyPrice, Length) { var nefratio = 1; var nAMA = 0; var nfastend = 0.666; var nslowend = 0.0645; var nnoise = 0; var nsignal = 0; var nsmooth = 0; var nAMA_Ref = ref(-1); var nBarCount = getCurrentBarCount(); if (xMyPrice.getValue(-1) == null) return 0; if (nAMA_Ref == null) nAMA_Ref = 1; if (nBarCount > Length) { nsignal = Math.abs(xMyPrice.getValue(0) - xMyPrice.getValue(-Length)); for (var i = 0; i < Length; i++) nnoise += xvnoise.getValue(-i); if (nnoise != 0) nefratio = nsignal / nnoise; } nsmooth = Math.pow(nefratio * (nfastend - nslowend) + nslowend, 2); if (nBarCount > Length) { nAMA = nAMA_Ref + nsmooth * (xMyPrice.getValue(0) - nAMA_Ref); } else if (nBarCount == Length) { nAMA = xMyPrice.getValue(0); } else { return; } return nAMA; } function Calc_avnoise(xMyPrice) { var nRes = 0; nRes = Math.abs(xMyPrice.getValue(0) - xMyPrice.getValue(-1)); if (nRes == null) nRes = 1; return nRes; }