2006 Sep: Trading With An Adaptive Price Zone

ICE Data Services -


AdaptivePriceZone.efs  EFSLibrary - Discussion Board
  

File Name: AdaptivePriceZone.efs


Description:
These studies are based on the September 2006 article, Trading With An Adaptive Price Zone, by Lee Leibfarth.


Formula Parameters:
AdaptivePriceZone.efs
Period: 20
Band Percent: 2

APZ_Strategy.efs
Period: 20
Band Percent: 2
ADX Period: 14
ADX Smoothing: 14
ADX Threshold: 30

Notes:
The APZ_Strategy.efs study is compatible for back testing and real time usage. These formulas require eSignal version 8.0.0 or later. The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.

Download File:
AdaptivePriceZone.efs
APZ_Strategy.efs






EFS Code:








/***************************************Provided By : eSignal (c) Copyright 2006Description:  Trading With An Adaptive Price Zone              by Lee LeibfarthVersion 1.0  07/06/2006Notes:* Sept 2006 Issue of Stocks and Commodities Magazine* Study requires version 8.0 or higher.Formula Parameters:                 Defaults:Period                              20Band Percent                        2***************************************/function preMain() {    setPriceStudy(true);    setStudyTitle("Adaptive Price Zone Indicator ");    setCursorLabelName("Upper Band", 0);    setCursorLabelName("Lower Band", 1);    setDefaultBarThickness(2, 0);    setDefaultBarThickness(2, 1);    setDefaultBarStyle(PS_DOT, 0);    setDefaultBarStyle(PS_DOT, 1);        var fp1 = new FunctionParameter("nPeriods", FunctionParameter.NUMBER);        fp1.setName("Period");        fp1.setLowerLimit(1);        fp1.setDefault(20);    var fp2 = new FunctionParameter("nBandPct", FunctionParameter.NUMBER);        fp2.setName("Band Percent");        fp2.setLowerLimit(0);        fp2.setDefault(2);}var bVersion = null;var bInit = false;var xAPZ = null;var xAPZ_Upper = null;  // Upper Bandvar xAPZ_Lower = null;  // Lower Bandfunction main(nPeriods, nBandPct) {        if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (bInit == false) {        xAPZ = efsInternal("calcAPZ", nPeriods, nBandPct);        bInit = true;    }        if (xAPZ_Upper == null) xAPZ_Upper = getSeries(xAPZ, 0);  // Upper Band    if (xAPZ_Lower == null) var xAPZ_Lower = getSeries(xAPZ, 1);  // Lower Band    var nAPZ_Upper = xAPZ_Upper.getValue(0);    var nAPZ_Lower = xAPZ_Lower.getValue(0);    if (nAPZ_Upper == null || nAPZ_Lower == null) return;    if (high(0) > nAPZ_Upper) {        drawShape(Shape.CIRCLE, AboveBar1, Color.blue, rawtime(0));    } else if (low(0) < nAPZ_Lower) {        drawShape(Shape.CIRCLE, BelowBar1, Color.blue, rawtime(0));    }        return new Array(nAPZ_Upper, nAPZ_Lower);}var xHL = null;function calcAPZ(nPeriods, nBandPct) {    if (xHL == null) xHL = efsInternal("calcHL");    if (isNaN(xHL.getValue(0))) return;        //nPeriods = Math.round(Math.sqrt(nPeriods));    nPeriods = Math.ceil(Math.sqrt(nPeriods));    var Value1 = ema(nPeriods, ema(nPeriods), 0);    var Value2 = ema(nPeriods, ema(nPeriods, xHL), 0);    if (Value1 == null || Value2 == null) return;        var UpBand = nBandPct * Value2 + Value1;    var DnBand = Value1 - nBandPct * Value2;    if (UpBand == null || DnBand == null) return;        return new Array(UpBand, DnBand);}function calcHL() {    return high(0) - low(0);}function verify() {    var b = false;    if (getBuildNumber() < 779) {        drawTextAbsolute(5, 35, "This study requires version 8.0 or later.",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "error");        drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "upgrade");        return b;    } else {        b = true;    }        return b;}/***************************************Provided By : eSignal (c) Copyright 2006Description:  Trading With An Adaptive Price Zone              by Lee LeibfarthVersion 1.0  07/06/2006Notes:* Sept 2006 Issue of Stocks and Commodities Magazine* Study requires version 8.0 or higher.* Study is designed for Back Testing.Formula Parameters:                 Defaults:Period                              20Band Percent                        2ADX Period                          14ADX Smoothing                       14ADX Threshold                       30***************************************/function preMain() {    setPriceStudy(true);    setStudyTitle("Adaptive Price Zone Strategy ");    setShowTitleParameters(false);    setCursorLabelName("Upper Band", 0);    setCursorLabelName("Lower Band", 1);    setCursorLabelName("ADX", 2);    setDefaultBarFgColor(Color.blue, 0);    setDefaultBarFgColor(Color.blue, 1);    setDefaultBarFgColor(Color.green, 2);    setDefaultBarThickness(2, 0);    setDefaultBarThickness(2, 1);    setDefaultBarStyle(PS_DOT, 0);    setDefaultBarStyle(PS_DOT, 1);    setDefaultFont("Ariel", 12);        var fp1 = new FunctionParameter("nPeriods", FunctionParameter.NUMBER);        fp1.setName("Period");        fp1.setLowerLimit(1);        fp1.setDefault(20);    var fp2 = new FunctionParameter("nBandPct", FunctionParameter.NUMBER);        fp2.setName("Band Percent");        fp2.setLowerLimit(0);        fp2.setDefault(2);    var fp3 = new FunctionParameter("nADXPeriods", FunctionParameter.NUMBER);        fp3.setName("ADX Period");        fp3.setLowerLimit(1);        fp3.setDefault(14);    var fp4 = new FunctionParameter("nADXSmoothing", FunctionParameter.NUMBER);        fp4.setName("ADX Smoothing");        fp4.setLowerLimit(1);        fp4.setDefault(14);    var fp5 = new FunctionParameter("nADXThreshold", FunctionParameter.NUMBER);        fp5.setName("ADX Threshold");        fp5.setLowerLimit(0);        fp5.setDefault(30);}var bVersion = null;var bInit = false;var bBackTest = true;var vPosition = null;var xAPZ = null;var xAPZ_Upper = null;  // Upper Bandvar xAPZ_Lower = null;  // Lower Bandfunction main(nPeriods, nBandPct, nADXPeriods, nADXSmoothing, nADXThreshold) {        if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (bInit == false) {        xAPZ = efsInternal("calcAPZ", nPeriods, nBandPct);        bInit = true;    }        if (xAPZ_Upper == null) xAPZ_Upper = getSeries(xAPZ, 0);  // Upper Band    if (xAPZ_Lower == null) var xAPZ_Lower = getSeries(xAPZ, 1);  // Lower Band    var nAPZ_Upper = xAPZ_Upper.getValue(0);    var nAPZ_Lower = xAPZ_Lower.getValue(0);    var nAPZ_Upper_1 = xAPZ_Upper.getValue(-1);    var nAPZ_Lower_1 = xAPZ_Lower.getValue(-1);    var nADX_0 = adx(nADXPeriods, nADXSmoothing, 0);    var nADX_1 = adx(nADXPeriods, nADXSmoothing, -1);    if (nAPZ_Upper_1 == null || nAPZ_Lower_1 == null || nADX_1 == null) return;    if (getCurrentBarIndex() == 0) bBackTest = false;        if (vPosition != null && nADX_1 > nADXThreshold) {  // Exit signal        if (vPosition == "long") {            drawText("Sell", AboveBar3, Color.red, Text.BOLD|Text.CENTER, "t"+rawtime(0));            drawShape(Shape.DOWNARROW, AboveBar2, Color.red, "s"+rawtime(0));            vPosition = null;            Alert.playSound("ding.wav");            if (bBackTest == true) {                Strategy.doSell("Sell", Strategy.MARKET, Strategy.THISBAR);            }        } else if (vPosition == "short") {            drawText("Cover", BelowBar3, Color.red, Text.BOLD|Text.CENTER, "t"+rawtime(0));            drawShape(Shape.UPARROW, BelowBar2, Color.red, "s"+rawtime(0));            vPosition = null;            Alert.playSound("ding.wav");            if (bBackTest == true) {                Strategy.doCover("Cover", Strategy.MARKET, Strategy.THISBAR);            }        }    } else if (nADX_1 <= nADXThreshold) {  // Entry signal                if (vPosition != "short" && high(-1) >= nAPZ_Upper_1) { // Short signal            vPosition = "short";            drawText("Short", AboveBar3, Color.blue, Text.BOLD|Text.CENTER, "t"+rawtime(0));            drawShape(Shape.DOWNARROW, AboveBar2, Color.blue, "s"+rawtime(0));            Alert.playSound("pop.wav");            if (bBackTest == true) {                Strategy.doShort("Short", Strategy.MARKET, Strategy.THISBAR);            }        }         if (vPosition != "long" && low(-1) <= nAPZ_Lower_1) { // Long signal            vPosition = "long";            drawText("Long", BelowBar3, Color.blue, Text.BOLD|Text.CENTER, "t"+rawtime(0));            drawShape(Shape.UPARROW, BelowBar2, Color.blue, "s"+rawtime(0));            Alert.playSound("pop.wav");            if (bBackTest == true) {                Strategy.doLong("Long", Strategy.MARKET, Strategy.THISBAR);            }        }    }        return new Array(nAPZ_Upper, nAPZ_Lower, nADX_0.toFixed(6));}var xHL = null;function calcAPZ(nPeriods, nBandPct) {    if (xHL == null) xHL = efsInternal("calcHL");    if (isNaN(xHL.getValue(0))) return;        //nPeriods = Math.round(Math.sqrt(nPeriods));    nPeriods = Math.ceil(Math.sqrt(nPeriods));    var Value1 = ema(nPeriods, ema(nPeriods), 0);    var Value2 = ema(nPeriods, ema(nPeriods, xHL), 0);    if (Value1 == null || Value2 == null) return;        var UpBand = nBandPct * Value2 + Value1;    var DnBand = Value1 - nBandPct * Value2;    if (UpBand == null || DnBand == null) return;        return new Array(UpBand, DnBand);}function calcHL() {    return high(0) - low(0);}function verify() {    var b = false;    if (getBuildNumber() < 779) {        drawTextAbsolute(5, 35, "This study requires version 8.0 or later.",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "error");        drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "upgrade");        return b;    } else {        b = true;    }        return b;}