November 2007
TRADERS' TIPS

Here is this month's selection of Traders' Tips, contributed by various developers of technical analysis software to help readers more easily implement some of the strategies presented in this and other issues.

You can copy these formulas and programs for easy use in your spreadsheet or analysis software. Simply "select" the desired text by highlighting as you would in any word processing program, then use your standard key command for copy or choose "copy" from the browser menu. The copied text can then be "pasted" into any open spreadsheet or other software by selecting an insertion point and executing a paste command. By toggling back and forth between an application window and the open Web page, data can be transferred with ease.

This month's tips include formulas and programs for:

METASTOCK: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TRADESTATION: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
eSIGNAL: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
WEALTH-LAB: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
AMIBROKER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
NEUROSHELL TRADER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
NEOTICKER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
AIQ: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
STRATASEARCH: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TRADINGSOLUTIONS: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
BLOCKS SOFTWARE: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TD AMERITRADE STRATEGYDESK: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TRADECISION: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TRACK 'N TRADE 5.0 & HF: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
TRADE NAVIGATOR: SHORT-TERM VOLUME AND PRICE OSCILLATOR
VT TRADER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
SWINGTRACKER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)
NINJA TRADER: STOCHASTICS WITH LONG-TERM EMA FILTER STRATEGY

or return to November 2007 Contents


METASTOCK: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

Code for MetaStock for the SVAPO indicator is also provided by Sylvain Vervoort in his article in this issue, "Short-Term Volume And Price Oscillator." Please see the article's sidebar, "SVAPO MetaStock code." --Editor

SVAPO  METASTOCK CODE
{calculate the heikin-ashi closing average haCl and get the input variables}
haO:= (Ref((O+H+L+C)/4,-1) + PREV)/2;
haCl:= ((O+H+L+C)/4+haO+Max((O+H+L+C)/4,Max(H,haO))+Min((O+H+L+C)/4,Min(L,haO)))/4;
period:= Input("SVAPO period :", 2, 20, 8);
cutoff:= Input("Minimum % price change :", 0, 10, 1);

{Inputs for standard deviation bands}
devH:= Input("Standard Deviation High :", 0.1, 5, 1.5);
devL:= Input("Standard Deviation Low :", 0.1, 5, 1.3);
stdevper:= Input("Standard Deviation Period :", 1, 200, 100);

{Smooth HaCl closing price}
haC:= Tema(haCl, period/1.6);

{Medium term MA of Volume to limit extremes and division factor}
vave:= Ref(Mov(V, period*5, S), -1);
vmax:= vave*2;
vc:= If(V < vmax, V, vmax);

{Basic volume trend}
vtr:= Tema(LinRegSlope(V, period), period);

{SVAPO result of price and volume}
SVAPO:= Tema(Sum(If(haC > (Ref(haC, -1)*(1+cutoff/1000)) AND
         Alert(vtr >= Ref(vtr, -1), 2), vc, If(haC < (Ref(haC, -1)*(1-cutoff/1000)) AND
         Alert(vtr > Ref(vtr, -1), 2), -vc, 0)), period)/(vave+1), period);
devH*Stdev(SVAPO, stdevper);
-devL*Stdev(SVAPO, stdevper);
zeroref:=0;
seroref;
SVAPO

GO BACK


TRADESTATION: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

Sylvain Vervoort's article in this issue, "Short-Term Volume And Price Oscillator," describes the construction of a short-term oscillator based on price and volume. During uptrends, when price and volume are moving up, volume is added to the oscillator. During downtrends, when price is moving down but volume is up, volume is subtracted from the oscillator. During market phases when volume is not increasing with price moves in the direction of the trend, nothing is added to the oscillator.

FIGURE 1: TRADESTATION, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here is an example of applying the strategy "SVAPO Strategy1" to a daily chart of QQQQ. The lower subgraph displays the SVAPO indicator.
The calculations use Patrick Mulloy's definition of the triple exponential moving average. Vervoort alludes to a second article that will contain strategy rules. However, in this article he outlines a reversion to the mean strategy with a 7% trailing stop. Both the indicator and outlined strategy are included in the code given here.

To download the code, go to the Support Center at TradeStation.com. Search for the file "Svapo.eld."

TradeStation does not endorse or recommend any particular strategy.
 

Indicator:  SVAPO
inputs:
    Period( 8 ),
    Cutoff( 1 ),
    DevH( 1.5 ),
    DevL( 1.3 ),
    StDevPeriod( 100 ) ;
variables:
    AP( 0 ),
    haO( 0 ),
    haCl( 0 ),
    haC( 0 ),
    VolumeValue( 0 ),
    VAvg( 0 ),
    VMax( 0 ),
    Vc( 0 ),
    VTrend( 0 ),
    HCUpCondition( false ),
    HCDnCondition( false ),
    SVAPO( 0 ),
    UpperBand( 0 ),
    LowerBand( 0 ) ;
{ calculate the Vervoort version of Heiken-Ashi }
AP = AvgPrice ;
haO = 0.5 * ( AP[1] + haO[1] ) ;
haCl = 0.25 * ( AP + haO + Maxlist( AP, Maxlist( High,
 haO ) ) + Minlist( AP, Minlist( Low, haO ) ) ) ;
haC = TEMA( haCl, 0.625 * Period ) ;
{ medium term MA of volume to limit extremes and division factor }
VolumeValue = iff( BarType < 2, Ticks, Volume ) ;
VAvg = Average( VolumeValue[1], 5 * Period ) ;
VMax = 2 * VAvg ;
Vc = iff( VolumeValue < VMax, VolumeValue, VMax ) ;
{ Vervoot's basic volume trend }
VTrend = TEMA( LinearRegSlope( VolumeValue, Period ), Period ) ;
{ SVAPO result of price and volume }
HCUpCondition = haC > haC[1] * ( 1 + ( 0.001 *
 Cutoff ) ) and CountIf( VTrend >= VTrend[1], 2 ) = 2 ;
HCDnCondition = haC < haC[1] * ( 1 - ( 0.001 *
 Cutoff ) ) and CountIf( VTrend <= VTrend[1], 2 ) = 2 ;
SVAPO = TEMA( Summation( iff( HCUpCondition, Vc,
 iff( HCDnCondition, -Vc, 0 ) ), Period ) / ( VAvg + 1 ), Period ) ;
UpperBand = DevH * StdDev( SVAPO, StDevPeriod ) ;
LowerBand = -DevL * StdDev( SVAPO, StDevPeriod ) ;
if CurrentBar > StDevPeriod then
    begin
    Plot1( SVAPO, "SVAPO" ) ;
    Plot2( UpperBand, "UpperBand" ) ;
    Plot3( LowerBand, "LowerBand" ) ;
    Plot4( 0, "Zero" ) ;
    end ;
Strategy:  SVAPO Strategy1
inputs:
    Period( 8 ),
    Cutoff( 1 ),
    DevH( 1.5 ),
    DevL( 1.3 ),
    StDevPeriod( 100 ),
     PercentStop( 7 ) ;
variables:
    AP( 0 ),
    haO( 0 ),
    haCl( 0 ),
    haC( 0 ),
    VolumeValue( 0 ),
    VAvg( 0 ),
    VMax( 0 ),
    Vc( 0 ),
    VTrend( 0 ),
    HCUpCondition( false ),
    HCDnCondition( false ),
    SVAPO( 0 ),
    UpperBand( 0 ),
    LowerBand( 0 ),
    TrailPrice( 0 ) ;
{ calculate the Vervoort version of Heiken-Ashi }
AP = AvgPrice ;
haO = 0.5 * ( AP[1] + haO[1] ) ;
haCl = 0.25 * ( AP + haO + Maxlist( AP, Maxlist( High,
 haO ) ) + Minlist( AP, Minlist( Low, haO ) ) ) ;
haC = TEMA( haCl, 0.625 * Period ) ;
{ medium term MA of volume to limit extremes and division factor }
VolumeValue = iff( BarType < 2, Ticks, Volume ) ;
VAvg = Average( VolumeValue[1], 5 * Period ) ;
VMax = 2 * VAvg ;
Vc = iff( VolumeValue < VMax, VolumeValue, VMax ) ;
{ Vervoot's basic volume trend }
VTrend = TEMA( LinearRegSlope( VolumeValue, Period ), Period ) ;
{ SVAPO result of price and volume }
HCUpCondition = haC > haC[1] * ( 1 + ( 0.001 *
 Cutoff ) ) and CountIf( VTrend >= VTrend[1], 2 ) = 2 ;
HCDnCondition = haC < haC[1] * ( 1 - ( 0.001 *
 Cutoff ) ) and CountIf( VTrend <= VTrend[1], 2 ) = 2 ;
SVAPO = TEMA( Summation( iff( HCUpCondition, Vc,
 iff( HCDnCondition, -Vc, 0 ) ), Period ) / ( VAvg + 1 ), Period ) ;
UpperBand = DevH * StdDev( SVAPO, StDevPeriod ) ;
LowerBand = -DevL * StdDev( SVAPO, StDevPeriod ) ;
if CurrentBar > StDevPeriod then
    begin
    if SVAPO crosses over LowerBand then
        begin
        Buy next bar market ;
        TrailPrice = Close ;
        end
    else if SVAPO crosses under UpperBand then
        begin
        Sell short next bar at market ;
        TrailPrice = Close ;
        end
    else
        TrailPrice = EntryPrice ;
 
    SetStopContract ;
    SetDollarTrailing( TrailPrice * 0.01 * PercentStop ) ;
    end ;


--Mark Mills
TradeStation Securities, Inc.
A subsidiary of TradeStation Group, Inc.
www.TradeStation.com

GO BACK


eSIGNAL: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

For this month's Traders' Tips we've provided the formula Svapo.efs, based on the code given in Sylvain Vervoort's article in this issue, "Short-Term Volume And Price Oscillator."

The study contains formula parameters that may be configured through the Edit Studies option in the Advanced Chart to change the SVAPO period, minimum price change, standard deviation period, standard deviation high, standard deviation low, color, and line thickness of the indicator.

FIGURE 2: eSIGNAL, SHORT-TERM VOLUME AND PRICE OSCILLATOR
To discuss this study or download a complete copy of the formula, please visit the EFS Library Discussion Board forum under the Forums link at www.esignalcentral.com or visit our EFS KnowledgeBase at www.esignalcentral.com/support/kb/efs/.
 

/***************************************
Provided By :
    eSignal (Copyright © eSignal), a division of Interactive Data
    Corporation. 2007. 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:  Short-Term Volume And Price Oscillator
              by Sylvain Vervoort

Version 1.0  9/6/2007

Notes:
* Study requires version 8.0 or later.
 

Formula Parameters:                     Default:
SVAPO Period                            8
Minimum %o price change                 1
Standard Deviation High                 1.5
Standard Deviation Low                  1.3
Standard Deviation Period               100
Color                                   green
Thickness                               2
***************************************/

function preMain() {
    setStudyTitle("Short-Term Vol And Price Osc ");
    setShowTitleParameters(false);
    setCursorLabelName("DevH", 0);
    setCursorLabelName("SVAPO", 1);
    setCursorLabelName("DevL", 2);
    setDefaultBarStyle(PS_DASHDOT, 0);
    setDefaultBarStyle(PS_DASHDOT, 2);

    var fp1 = new FunctionParameter("nPeriod", FunctionParameter.NUMBER);
        fp1.setName("SVAPO Period");
        fp1.setLowerLimit(3);
        fp1.setUpperLimit(20);
        fp1.setDefault(8);
    var fp2 = new FunctionParameter("nCutoff", FunctionParameter.NUMBER);
        fp2.setName("Minimum %o price change");
        fp2.setLowerLimit(1);
        fp2.setUpperLimit(10);
        fp2.setDefault(1);
    var fp3 = new FunctionParameter("nDevH", FunctionParameter.NUMBER);
        fp3.setName("Standard Deviation High");
        fp3.setLowerLimit(0.1);
        fp3.setUpperLimit(5);
        fp3.setDefault(1.5);
    var fp4 = new FunctionParameter("nDevL", FunctionParameter.NUMBER);
        fp4.setName("Standard Deviation Low");
        fp4.setLowerLimit(0.1);
        fp4.setUpperLimit(5);
        fp4.setDefault(1.3);
    var fp5 = new FunctionParameter("nStdevPeriod", FunctionParameter.NUMBER);
        fp5.setName("Standard Deviation Period");
        fp5.setLowerLimit(1);
        fp5.setUpperLimit(200);
        fp5.setDefault(100);
    var fp30 = new FunctionParameter("cColor", FunctionParameter.COLOR);
        fp30.setName("Color");
        fp30.setDefault(Color.green);
    var fp40 = new FunctionParameter("nThick", FunctionParameter.NUMBER);
        fp40.setName("Thickness");
        fp40.setLowerLimit(1);
        fp40.setDefault(2);
}

// Global Variables
var bVersion  = null;    // Version flag
var bInit     = false;   // Initialization flag

// globals variables
var xHaOpen     = null;
var xHaClose    = null;
var xHaTema     = null;
var xVolLRSlope = null;
var xVtr        = null;
var xSvapoSum   = null;
var xSvapo      = null;
var xStdev      = null;
 

function main(nPeriod, nCutoff, nDevH, nDevL, nStdevPeriod, cColor, nThick) {
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;

    //Initialization
    if (bInit == false) {
        setDefaultBarFgColor(cColor, 0);
        setDefaultBarThickness(nThick, 1);
        addBand(0, PS_DASHDOT, 1, cColor, "zero");
        xHaOpen     = efsInternal("calcHaOpen");
        xHaClose    = efsInternal("calcHaClose", xHaOpen);
        xHaTema     = efsInternal("calcTEMA", (nPeriod/1.6), xHaClose);
        xVolLRSlope = efsInternal("calcLinRegSlope", nPeriod, volume());
        xVtr        = efsInternal("calcTEMA", nPeriod, xVolLRSlope);
        xVolAvg     = sma((nPeriod*5), volume());
        xVc         = efsInternal("calcVc", xVolAvg);
        xSvapoSum   = efsInternal("calcSvapoSum", nPeriod, nCutoff,
                        xHaTema, xVtr, xVolAvg, xVc );
        xSvapo      = efsInternal("calcTEMA", nPeriod, xSvapoSum);
        xStdev      = efsInternal("calcStDev", nStdevPeriod, xSvapo);

        bInit = true;
    }

    var nSvapo = xSvapo.getValue(0);
    var nStdev = xStdev.getValue(0);
    if (nSvapo == null || nStdev == null) return;

    var nStDevH = nDevH * nStdev;
    var nStDevL = -nDevL * nStdev;

    return new Array( nStDevH, nSvapo, nStDevL );
}
 

// HaOpen globals
var nHaOpen   = null;
var nHaOpen_1 = null;

function calcHaOpen() {
    if (nHaOpen_1 == null && open(-1) != null) {
        nHaOpen_1 = open(-1);
    } else if (nHaOpen != null) {
        nHaOpen_1 = nHaOpen;
    }
    if (nHaOpen_1 == null) return;

    var nC_1 = sma(1, ohlc4(), -1);
    if (nC_1 == null) return;

    nHaOpen = (nC_1 + nHaOpen_1) / 2;

    return nHaOpen;
}
 

function calcHaClose(xHaO) {
    var n4 = sma(1, ohlc4(), 0);
    var nHaO = xHaO.getValue(0);
    if (n4 == null || nHaO == null) return;

    var nHaCl = (n4 + nHaO +
        Math.max(n4, high(0), nHaO) +
        Math.min(n4, low(0), nHaO )  ) / 4;

    return nHaCl;
}
 

// TEMA globals
var xAvg1 = null;
var xAvg2 = null;
var xAvg3 = null;
var bInit2 = false;

function calcTEMA(nLength,xSource){

    if(bInit2 == false){
        xAvg1 = ema(nLength,xSource);
        xAvg2 = ema(nLength,xAvg1);
        xAvg3 = ema(nLength,xAvg2);
        bInit2 = true;
    }

    var nAvg1 = xAvg1.getValue(0);
    var nAvg2 = xAvg2.getValue(0);
    var nAvg3 = xAvg3.getValue(0);
    if (nAvg1 == null || nAvg2 == null || nAvg3 == null) return;

    var nTEMA = (3*nAvg1)-(3*nAvg2)+nAvg3;

    return nTEMA;
}
 

function calcLinRegSlope( nLRlen, xSource) {
    // y = Ax + B;
    // A = SUM( (x-xAVG)*(y-yAVG) ) / SUM( (x-xAVG)^2 )
    // A = slope
    // B = yAVG - (A*xAVG);  // y-intercept

    if (xSource.getValue(-nLRlen) == null ||
        xSource.getValue(0) == 0) return;

    var xSum = 0;
    var ySum = 0;
    var i = 0;
    for (i = 0; i < nLRlen; i++) {
        xSum += i;
        ySum += xSource.getValue(-i);
    }
    var xAvg = xSum/nLRlen;
    var yAvg = ySum/nLRlen;
    var aSum1 = 0;
    var aSum2 = 0;
    i = 0;
    for (i = 0; i < nLRlen; i++) {
        aSum1 += (i-xAvg) * (xSource.getValue(-i)-yAvg);
        aSum2 += (i-xAvg)*(i-xAvg);
    }
    var A = -(aSum1 / aSum2);  // slope
    //var B = yAvg - (A*xAvg);  // y-intercept

    return A;
}
 

function calcVc( xAvg ) {
    var nVolAvg = xAvg.getValue(-1);
    if (nVolAvg == null) return;

    var nVmax = nVolAvg * 2;
    var nVc   = volume(0);
    if (nVc >= nVmax) nVc = nVmax;

    return nVc;
}
 
 

function calcSvapoSum(nPeriod, nCutoff, xHaC, xvtr, xVAvg, xvc ) {

    nCutoff /= 100;
    var nSvapoSum = null;
    var nSum    = 0;
    var i       = 0;
    var nVave   = xVAvg.getValue(0);
    if (nVave == null || xvtr.getValue( -(nPeriod+2) ) == null) return;

    for (i = 0; i < nPeriod; i++) {
        var b1 = false;
        var b2 = false;
        var nHaC    = xHaC.getValue(-i);
        var nHaC_1  = xHaC.getValue(-(i+1));
        var nVc     = xvc.getValue(-i);
        var nVtr    = xvtr.getValue(-i);
        var nVtr_1  = xvtr.getValue(-(i+1));
        var nVtr_2  = xvtr.getValue(-(i+2));

        b1 = (nHaC > (nHaC_1*(1+nCutoff/1000)));
        b2 = (nVtr >= nVtr_1) || (nVtr_1 >= nVtr_2);
        if (b1 == true && b2 == true ) {
            nSum += nVc;
        } else {
            b1 = (nHaC < (nHaC_1*(1-nCutoff/1000)));
            b2 = (nVtr > nVtr_1) || (nVtr_1 > nVtr_2);
            if (b1 == true && b2 == true ) {
                nSum -= nVc;
            }
        }
    }

    nSvapoSum = nSum / (nVave+1);

    return nSvapoSum;
}
 

function calcStDev(nLength, xSource) {
    var sumX = 0;
    var sumX2 = 0;

    if (xSource.getValue(-nLength) == null) return;

    for (i = 0; i < nLength; i++) {
        var nVal = xSource.getValue(-i);
        sumX += nVal;
        sumX2 += (nVal * nVal);
    }
    var meanX = (sumX/nLength);
    var stdev = Math.sqrt((sumX2/nLength) - (meanX*meanX));

    return stdev;
}
 

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=https://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;
}
 

--Jason Keck
eSignal, a division of Interactive Data Corp.
800 815-8256, www.esignalcentral.com

GO BACK


WEALTH-LAB: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

We've added Sylvain Vervoort's SVAPO indicator to the Wealth-Lab Code Library for easy reference in any script. Since Vervoot promises to discuss the use of SVAPO in a trading strategy with price targets in a follow-up article, for now we'll simply provide an example of WealthScript code that accesses the SVAPO indicator, which we use to calculate the upper and lower standard deviation bands per the article (Figure 3).

FIGURE 3: WEALTH-LAB, SHORT-TERM VOLUME AND PRICE OSCILLATOR. SVAPO's "buy" signal for AAPL in April 2007 was timely indeed to catch the beginning of a significant move higher.
WealthScript code:
{$I 'SVAPO'}
var sdPeriod, sdUpper, sdLower, SvapoSer, SvapoPane: integer;
var devH: float = 1.5;
var devL: float = 1.3;
sdPeriod := 100;
{ Create the indicators (Period = 8, cutoff = 1.0) }
SvapoSer := SVAPOSeries( 8, 1.0 );
sdUpper := MultiplySeriesValue( StdDevSeries( SvapoSer, sdPeriod ), devH );
sdLower := MultiplySeriesValue( StdDevSeries( SvapoSer, sdPeriod ), -devL );
{ Plotting }
SvapoPane := CreatePane( 75, -1, -1 );
PlotSeriesLabel(SvapoSer, SvapoPane, #Blue, #Thick, 'SVAPO' );
PlotSeries( sdUpper, SvapoPane, #Gray, #Dotted );
PlotSeries( sdLower, SvapoPane, #Gray, #Dotted );
DrawHorzLine( 0, SvapoPane, #Gray, #Dotted );


-- Robert Sucher
www.wealth-lab.com

GO BACK


AMIBROKER: SHORT-TERM VOLUME AND PRICE OSCILLATOR

In "Short Term Volume And Price Oscillator," Sylvain Vervoort presents a new indicator that is said to generate short-term entry and exit signals based on a combination of price and volume action.

The AmiBroker formula language (AFL) implementation of the SVAPO indicator is straightforward. In addition to code based on the formula presented in Vervoort's article, we have included code that draws buy and sell arrows automatically based on change in direction of SVAPO (Figure 4). As a criterion for gauging change in direction, we have chosen the situation where SVAPO moves in one direction for at least four consecutive bars and then moves in the opposite direction in the last bar. It is worth noting that some of the signals generated that way are premature. Additional checks may be added, but this will result in delaying the signal.

FIGURE 4: AMIBROKER, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here is a Dow Chemical daily price chart (middle pane) with volume trend (upper pane) and the SVAPO indicator shown in the lower pane.
Here is ready-to-use formula code:
 
// input parameters
Period = Param("SVAPO period", 8, 2, 20, 1 );
CutOff = Param("Min. % price change", 1, 0, 10, 0.1 );
devH = Param("Std. Dev High", 1.5, 0.1, 5, 0.1 );
devL = Param("Std. Dev Low", 1.3, 0.1, 5, 0.1 );
StDevPer = Param("Std. Dev. Period", 100, 1, 200, 1 );
// heikin-ashi smoothing
Av4 = (O+H+L+C)/4;
HaOpen = AMA( Ref( Av4, -1 ), 0.5 );
HaCl = ( Av4 + HaOpen + Max( Av4, Max( H, HaOpen ) ) + Min( Av4, Min( L, HaOpen ) ) ) / 4;
HaC = TEMA( HaCl, period/1.6 );
// medium term MA of volume to limit extremes
Vave = Ref( MA( V, period * 5 ), -1 );
Vmax = Vave * 2;
Vc = Min( V, Vmax );
// basic volume trend
Vtr = TEMA( LinRegSlope( V, period ), period );
HaCLimitUp = Ref( HaC, -1 ) * (1 + Cutoff/1000);
HaCLimitDn = Ref( HaC, -1 ) * (1 - Cutoff/1000);
// SVAPO result of price and volume
SVAPOSum = Sum( IIf( ( HaC > HaCLimitUp ) AND Hold( Vtr >= Ref( Vtr,-1 ), 2 ), Vc,
                IIf( ( HaC < HaCLimitDn ) AND Hold( Vtr > Ref( Vtr, -1 ), 2 ), -Vc, 0 ) ),period );
SVAPO = TEMA( SVAPOSum / (Vave+1), period );
PlotGrid( 0 );
Plot( SVAPO, "SVAPO", colorBlue, styleThick );
Plot( devH * StDev( SVAPO, StDevPer ), "Up", colorGreen );
Plot( -devL * StDev( SVAPO, StDevPer ), "Dn", colorRed );
Chg = SVAPO - Ref( SVAPO, -1 );
BuySig = Chg > 0 AND Sum( Chg < 0, 5 ) == 4;
SellSig = Chg < 0 AND Sum( Chg > 0, 5 ) == 4;
PlotShapes( shapeUpArrow * BuySig, colorGreen );
PlotShapes( shapeDownArrow * SellSig, colorRed );


--Tomasz Janeczko, AmiBroker.com
www.amibroker.com

GO BACK


NEUROSHELL TRADER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

The short-term volume and price oscillator described by Sylvain Vervoort in his article in this issue can be easily implemented in NeuroShell Trader by combining a few of NeuroShell Trader's 800+ indicators. To implement the oscillator, select "New Indicator ..." from the Insert menu and use the Indicator Wizard to create the following indicators:
 

haC = Tema( HeikinAshiClose( Open, High, Low, Close ), 5 )
vave = Lag( MovAvg( Volume, 40 ), 1 )
vc = Min2( Volume, Mult2( 2, vave ) )
vtr = Tema( LinRegSlope( vc, 8 ), 8 )
vcutoff = IfThenElseIfThen( And2( A>B( %Change(haC, 1 ), cutoff ), A>=B( vtr, Lag( vtr, 1 ) ) ),
          vc, And2( A<B( %Change(haC, 1 ), Negative(cutoff) ), A>=B (vtr, Lag(vtr,1) ) ), -vc, 0 )
SVAPO = Tema( Divide( Sum( vcutoff, 8), Add2( vave, 1 ) ), 8)
StndDevHigh = BollingerBandHigh ( SVAPO, stdevper, devH )
StndDevLow = BollingerBandLow ( SVAPO, stdevper, devL )


A sample chart is shown in Figure 5. Note that the oscillator is based on the HeikinAshiClose and TEMA custom indicators, which NeuroShell Trader users can download for free at www.ward.net.

FIGURE 5: NEUROSHELL, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here is a short-term volume and price oscillator chart for Intel Corp. in NeuroShell.
--Marge Sherald, Ward Systems Group, Inc.
301 662-7950, sales@wardsystems.com
www.neuroshell.com

GO BACK


NEOTICKER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

Sylvain Vervoort's short-term volume and price oscillator presented in his article in this issue can be implemented with NeoTicker formula language (Listing 1). This indicator has five parameters and three plots (Figure 6). SVAPO is defaulted to plot in a different pane from the price series in the indicator setup.

FIGURE 6: NEOTICKER, SHORT-TERM VOLUME AND PRICE OSCILLATOR. This indicator has five parameters and three plots. SVAPO is defaulted to plot in a different pane from price in the indicator setup.
We have made a number of adjustments in translating the MetaStock code given in the article into NeoTicker formula language. For example, when assigning user input values to local variables, we use the "choose" function to cap the maximum and minimum. We use a number of local variables within the formula code to make it more memory efficient.

For a downloadable version of this indicator, please refer to the NeoTicker blog site (https://blog.neoticker.com).
 

'input value with lower and upper bound limit
$period := choose(param1<2, 2, param1>20, 20, param1);
$cutoff := choose(param2<0, 0, param2>10, 10, param2);
$devH   := choose(param3<0.1, 0.1, param3>5, 5, param3);
$devL   := choose(param4<0.1, 0.1, param3>5, 5, param4);
$stdevper := choose(param5<1, 1, param5>200, 200, param5);
'calculate the heiken-ashi average haCl
AvgPrice := (O+H+L+C)/4;
haO := (AvgPrice(1) + haO(1))/2;
haCl := (AvgPrice + haO +
         maxlist(AvgPrice, H, haO) +
         minlist(AvgPrice, L, haO))/4;
haC := tema(haCl, $period/1.6);
'Medium term MA of volume to limit extremes and division factor
$vave := average(1, v, $period*5);
$vmax := $vave*2;
$vc := if(v < $vmax, v, $vmax);
'Basic volume trend
vtr := tema(linslope(v,$period),$period);
$myAlert1 := vtr >= vtr(1) or vtr(1) >= vtr(2);
mvc := choose(haC>(haC(1)*(1+$cutoff/1000)) and $myAlert1 > 0, $vc,
              haC<(haC(1)*(1-$cutoff/1000)) and $myAlert1 > 0, -$vc, 0);
SVAPO := tema(summation(mvc, $period)/$vave, $period);
plot1 := SVAPO;
plot2 := $devH*stddev(SVAPO,$stdevper);
plot3 := -1*$devL*stddev(SVAPO,$stdevper);


--Kenneth Yuen, TickQuest Inc.
www.tickquest.com

GO BACK


AIQ: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

Here, I'll provide the AIQ code for Sylvain Vervoort's short-term volume and price oscillator (SVAPO), together with some background information on the heikin-ashi candlestick technique and the triple moving average method (TEMA) that is used in the indicator.

To test the effectiveness of the indicator, I constructed entry rules for longs and shorts based on Vervoort's examples in the article. These rules were not expressly spelled out by the author but are just one interpretation of how the indicator might be used in a trading system.

Enter a long position when:
1) SVAPO is below the lower band and
2) SVAPO increases from the day before.

Enter a short position when:
1) SVAPO is above the upper band and
2) SVAPO decreases from the day before.

Using the NASDAQ list of stocks and AIQ's EDS module, which tests all trade signals that do not overlap, I tested the above rules over the four-year period from 9/12/2003 to 9/12/2007, exiting after one-, three-, five-, 10-, and 20-day fixed holding periods while not using any other exit techniques. The results of the tests are summarized in Figure 7.

FIGURE 7: AIQ, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here are sample test results using various fixed holding periods on the NASDAQ 100 list of stocks.
The longs show favorable results in all periods and the trades outperform the NASDAQ 100 index on an average trade basis in all the tests of the longs (not shown in the table). The shorts show losses that increase progressively as the holding period is increased. Since the test period was primarily a bullish period and the short positions were net losers, adding a trend filter probably would improve the results of both the longs and shorts.

The code can be downloaded from the AIQ website at www.aiqsystems.com and also from www.tradersedge systems.com/traderstips.htm, or copied and pasted from the STOCKS & COMMODITIES website at www.Traders.com.
 

AIQ code!! SHORT-TERM VOLUME & PRICE OSCILLATOR
! Author: Sylvain Vervoort, TASC November 2007
! Coded by: Richard Denning 9/12/07
! Background re Heikin-Ashi bars used to compute the tripple
! exponential moving average:
! A type of candlestick chart that shares many characteristics
! with standard candlestick charts, but differs because of the
! values used to create each bar. Instead of using the
! open-high-low-close (OHLC) bars like standard candlestick
! charts, the Heikin-Ashi technique uses a modified formula:
! Formula:
! HAClose = (Open+High+Low+Close) / 4
! HAOpen = [HAOpen (previous bar) + HAClose (previous bar)] / 2
! HAHigh = Max (High,HAOpen,HAClose)
! HALow = Min (Low,HAOpen, HAClose)
! Background reTEMA:
! The TEMA is a smoothing indicator with less lag than a
! straight exponential moving average. TEMA is an acronym
! for Triple Exponential Moving Average, but the calculation
! is more complex than that. The TEMA was developed by
! Patrick Mulloy and is described in his articles in the January
!  & February1994 issues of TASC magazine.
! Formula:
! TEMA=3xEMA(input)-3 x EMA(EMA(input)+EMA(EMA(EMA(input)))
! CODING ABBREVIATIONS:
H is [high].
L is [low].
C is [close].
O is [open].
V is [volume].
! INPUTS:
P1 is 8.        !Min=2 , max = 20, default=8
cutoff is 1.      !Min=0, max=10, default=1
devH is 1.5.    !Min=0.1, max=5, default=1.5
devL is 1.3.    !Min=0.1, max=5, default=1.3
devP is 100.    !Min 1, max=200, default=100
haC is (O + H +L + C) / 4.
DaysInto is ReportDate() - RuleDate().
Stop if DaysInto > 100.
stopHAO is iff(stop,O, haO).
haO is (valresult(stopHAO,1) + valresult(haC,1)) / 2.
haH is Max(H,max(haO,haC)).
haL is Min(L,min(haO,haC)).
haCL is (haC + haO + haH + haL) / 4.
P2 is P1 / 1.6.
haTemaCL is 3 * (expavg(haCL,P2))
    - 3*(expavg(expavg(haCL,P2),P2))
    + expavg(expavg(expavg(haCL,P2),P2),P2).
haTemaCL1 is valresult(haTemaCL,1).
vavg is simpleavg(V,P1 * 5,1).
vmax is vavg *  2.
vc is iff(V < vmax,V,vmax).
vLRs is slope2(vc,P1).
vtr is 3 * (expavg(vLRs,P1))
    - 3 * (expavg(expavg(vLRs,P1),P1))
    + expavg(expavg(expavg(vLRs,P1),P1),P1).
vtr1 is valresult(vtr,1).
temp1 is iff(haTemaCL > haTemaCL1*(1+cutoff/1000)
    and countof(vtr >= vtr1,2)>=1 ,vc,
    iff(haTemaCL < haTemaCL1*(1-cutoff/1000)
    and countof(vtr > vtr1,2)>=1, -vc,0)).
temp2 is sum(temp1,P1) / (vavg+1).
SVAPO is 3 * (expavg(temp2,P1))
    - 3 * (expavg(expavg(temp2,P1),P1))
    + expavg(expavg(expavg(temp2,P1),P1),P1).
stdev is sqrt(variance(SVAPO,devP)).
upBand is devH * stdev.  !Upper band for SVAPO
loBand is -devL * stdev.   !Lower band for SVAPO
! TEST OF INDICATOR:
! LONG ENTRY RULES:
LE if SVAPO < loBand and SVAPO > valresult(SVAPO,1).
! SHORT ENTRY RULES:
SE if SVAPO > upBand and SVAPO < valresult(SVAPO,1).


--Richard Denning
AIQ Systems
richard.denning@earthlink.net

GO BACK


STRATASEARCH: SHORT-TERM VOLUME AND PRICE OSCILLATOR

In "Short-Term Volume And Price Oscillator," Sylvain Vervoort has given us a very helpful indicator. By referencing the smoothed price supported by the smoothed volume, and by using variable signal lines based on standard deviations, this indicator can be quite effective at identifying multiple market conditions.

In our tests of this indicator, we used the author's suggestion to generate buy and sell signals when the SVAPO reverses direction outside the upper and lower boundaries. Using a variety of parameter sets, we discovered many profitable combinations offering significant annual returns and high profitability. Holding periods, however, could run a bit high for many traders, with the best systems holding positions for 40 to 50 days. Nevertheless, as a primary or supporting indicator, the SVAPO is a welcome addition.

FIGURE 8: STRATASEARCH, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Buy and sell signals are generated when the SVAPO reverses direction outside the upper and lower boundaries.
StrataSearch users may greatly benefit from running this indicator alongside a collection of other supporting trading rules. For example, the use of additional trading rules on the entry may help eliminate a certain percentage of the false signals. Likewise, additional trading rules on the exit may help trigger signals more effectively than the stop or trailing stop.

As with all Traders' Tips, a plug-in containing the code for the SVAPO can be downloaded from the Shared Area of our user forum. In addition, this month's plug-in contains a number of trading rules that can be included in your automated search for trading systems. Simply install the plug-in, start your search, and let StrataSearch identify whether this indicator can improve your trading systems.
 

//****************************************************************
// Short-Term Volume And Price Oscillator
//****************************************************************
period= parameter("period");
cutoff= parameter("cutoff");
// calculate the heikin-ashi closing average haCl
haO=(ref((O+H+L+C)/4,-1) + ref((O+H+L+C)/4,-2))/2;
haCl=((O+H+L+C)/4+haO+
    higher((O+H+L+C)/4,higher(H,haO))+
    lower((O+H+L+C)/4,lower(L,haO)))/4;
haC=tema(haCl,5);
// Smooth HaCl closing price
days = if(period/1.6 >= 1, period/1.6, 1);
haC = tema(haCl,days);
// Medium term MA of Volume
days2 = if(period*5 >= 1, period*5, 5);
vave =Ref(Mov(V,days2,S),-1);
vmax=vave*2;
vc=If(V<vmax,V,vmax);
// Basic volume trend
vtr = tema(lrs(V,period),period);
SVAPO=Tema(Sum(If(haC>(Ref(haC,-1)*
    (1+cutoff/1000)) AND
    HadAlert(vtr>=Ref(vtr,-1),2), vc,
        If(haC<(Ref(haC,-1)*(1-cutoff/1000)) AND
    HadAlert(vtr>Ref(vtr,-1),2),-vc,0)),period)/
        (vave+1),period);


--Pete Rast
Avarin Systems, Inc.
www.StrataSearch.com

GO BACK


TRADINGSOLUTIONS: SHORT-TERM VOLUME AND PRICE OSCILLATOR

In the article "Short-Term Volume And Price Oscillator," Sylvain Vervoort introduces the SVAPO indicator.

This function uses the heikin-ashi candlestick functions introduced in a previous Traders' Tip. Given those functions, the SVAPO can be entered into TradingSolutions as described below.

The combined functions are also available as a function file that can be downloaded from the TradingSolutions website (www.tradingsolutions.com) in the Free Systems section. As with many indicators, these functions could make good inputs to neural network predictions.
 

Function Name: SVAPO Volume Clip
Short Name: SVAPO_VC
Inputs: Volume, Volume Period
If (LT (Volume, Mult (Lag (MA (Volume, Volume Period),1),2)), Volume,
    Mult (Lag (MA (Volume, Volume Period),1),2))
Function Name: SVAPO Volume Trend
Short Name: SVAPO_VTR
Inputs: Volume, Period
EMA (EMA (EMA (Slope (Volume, Period), Period), Period), Period)
Function Name: SVAPO
Short Name: SVAPO
Inputs: Period, Volume Period, Minimum %o Price Change, Open, High, Low, Close, Volume
EMA (EMA (EMA (Div (Sum (If (And (GT (haClose (Open, High, Low, Close),
     Mult (Lag (haClose (Open, High, Low, Close), 1), Add (1, Div (Minimum %o Price Change, 1000)))),
     WasTrue (GE (SVAPO_VTR (Volume, Period), Lag (SVAPO_VTR (Volume, Period),1)),2)),
     SVAPO_VC (Volume, Volume Period), If (And (LT (haClose (Open, High, Low, Close),
     Mult (Lag (haClose (Open, High, Low, Close),1), Sub (1,Div (Minimum %o Price Change, 1000)))),
     WasTrue (GT (SVAPO_VTR (Volume, Period), Lag (SVAPO_VTR (Volume, Period),1)),2)),
     Negate (SVAPO_VC (Volume, Volume Period)), 0)), Period), Add (Lag (MA (Volume, Volume Period),
     1), 1)), Period), Period), Period)
Function Name: SVAPO Top Band
Short Name: SVAPO_Top
Inputs: Period, Volume Period, Minimum %o Price Change, Standard Deviation High,
        Standard Deviation Period, Open, High, Low, Close, Volume
Mult (StDev (SVAPO (Period, Volume Period, Minimum %o Price Change, Open, High, Low, Close, Volume),
      Standard Deviation Period), Standard Deviation High)
Function Name: SVAPO Bottom Band
Short Name: SVAPO_Bottom
Inputs: Period, Volume Period, Minimum %o Price Change, Standard Deviation Low,
        Standard Deviation Period, Open, High, Low, Close, Volume
Mult (StDev (SVAPO (Period, Volume Period, Minimum %o Price Change, Open, High, Low, Close, Volume),
      Standard Deviation Period), Negate (Standard Deviation Low))


--Gary Geniesse
NeuroDimension, Inc.
800 634-3327, 352 377-5144
www.tradingsolutions.com

GO BACK


BLOCKS SOFTWARE: SHORT-TERM VOLUME AND PRICE OSCILLATOR

Note: To use the study described here, you will need the free Blocks software and the Strategy Trader datapack. Go to www.Blocks.com to download the software and get detailed information on the available datapacks.

For the article in this issue by Sylvain Vervoot, "Short-Term Volume And Price Oscillator," we've created a chart study in that runs in Blocks software. To use it, open the "Personal Chartist" workspace in Blocks, then click the "Add Study" (that is, the plus mark) button and type "SVAPO" to filter the list and select the study.

Click on SVAPO in the pane legend to set the SVAPO period and minimum price % change (Figure 9). Click on the StdDev period in the pane legend to set the standard deviation period and the value for the upper and lower sides (Figure 10).

Figure 9


 

Figure 10

SVAPO can be used for any time frame. Just click the time frame selector at the top of the chart to view daily, three-day, weekly charts, and so on. With the Mega Minute pack, you can also view intraday charts (minute, hourly, and so on) with streaming real-time data. Figure 11 is an hourly chart of Adbe, where SVAPO does a nice job of pointing out intraday reversals to the upside.

FIGURE 11: BLOCKS, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here is an hourly chart of ADBE, where SVAPO does a nice job of pointing out intraday reversals to the upside.
--Bruce Loebrich and Patrick Argo
Worden Brothers, Inc.
800 776-4940, www.worden.com
GO BACK

TD AMERITRADE STRATEGYDESK: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

In this issue, Sylvain Vervoort discusses the construction of a volume and price oscillator in his article, "Short-Term Volume And Price Oscillator." Here, we'll explain how to build this functionality in TD Ameritrade's StrategyDesk.

We start with the construction of a five-period triple moving average. This will assist us in determining the short-term price trend.
 

((MovingAverage[MA,Close,5,0,D]) + (MovingAverage[MA,Close,5,0,D,1]  * 2) +
 (MovingAverage[MA,Close,5,0,D,2] * 3) + (MovingAverage[MA,Close,5,0,D,3] * 4) +
 (MovingAverage[MA,Close,5,0,D,4] * 5) + (MovingAverage[MA,Close,5,0,D,5] * 4) +
 (MovingAverage[MA,Close,5,0,D,6] * 3) + (MovingAverage[MA,Close,5,0,D,7] * 2) +
 (MovingAverage[MA,Close,5,0,D,8])) / 25


Second, we need a mechanism to determine the volume trend. This can be done with a smoothed moving average of volumes, in this case, an eight-period average of a 40-period volume moving average:
 

(MovingAverage[MA,Volume,40,0,D]  + MovingAverage[MA,Volume,40,0,D,1] +
 MovingAverage[MA,Volume,40,0,D,2] + MovingAverage[MA,Volume,40,0,D,3] +
 MovingAverage[MA,Volume,40,0,D,4] + MovingAverage[MA,Volume,40,0,D,5] +
 MovingAverage[MA,Volume,40,0,D,6] + MovingAverage[MA,Volume,40,0,D,7]) / 8
The construction of the two moving averages is shown on the price and volume chart in Figure 12.

FIGURE 12: TD AMERITRADE STRATEGYDESK, SHORT-TERM VOLUME AND PRICE OSCILLATOR. The oscillator at the bottom indicates uptrends and downtrends on higher-than-average volumes. The colored candlestick bars on the stock chart assist in confirmation.
From here, we look to combine these two to create an oscillator. Essentially, we need to ask which direction the price is trending and whether there is above-average volume. The following formula compares the daily prices to the price trend and the daily volumes to the volume trend:
((Bar[Close,D] < ((MovingAverage[MA,Close,5,0,D]) + (MovingAverage[MA,Close,5,0,D,1]  * 2) +
 (MovingAverage[MA,Close,5,0,D,2] * 3) + (MovingAverage[MA,Close,5,0,D,3] * 4) +
 (MovingAverage[MA,Close,5,0,D,4] * 5) + (MovingAverage[MA,Close,5,0,D,5] * 4) +
 (MovingAverage[MA,Close,5,0,D,6] * 3) + (MovingAverage[MA,Close,5,0,D,7] * 2) +
 (MovingAverage[MA,Close,5,0,D,8])) / 25) - (Bar[Close,D] > ((MovingAverage[MA,Close,5,0,D]) +
 (MovingAverage[MA,Close,5,0,D,1]  * 2) + (MovingAverage[MA,Close,5,0,D,2] * 3) +
 (MovingAverage[MA,Close,5,0,D,3] * 4) + (MovingAverage[MA,Close,5,0,D,4] * 5) +
 (MovingAverage[MA,Close,5,0,D,5] * 4) + (MovingAverage[MA,Close,5,0,D,6] * 3) +
 (MovingAverage[MA,Close,5,0,D,7] * 2) + (MovingAverage[MA,Close,5,0,D,8])) / 25)) *
 (Bar[Volume,D] > (MovingAverage[MA,Volume,40,0,D]  + MovingAverage[MA,Volume,40,0,D,1] +
 MovingAverage[MA,Volume,40,0,D,2] + MovingAverage[MA,Volume,40,0,D,3] +
 MovingAverage[MA,Volume,40,0,D,4] + MovingAverage[MA,Volume,40,0,D,5] +
 MovingAverage[MA,Volume,40,0,D,6] + MovingAverage[MA,Volume,40,0,D,7]) / 8)


An example implementation of this formula can be seen in Figure 12. The formula shown is built as a custom study and placed on the chart. The oscillator at the bottom of the chart shows values ranging between +1 and -1. At +1, the stock is trending down on higher volumes. At -1, the stock is trending up on higher volumes. A middle value of zero indicates that the volumes are below average.

We use StrategyDesk's unique color bar functionality to help indicate this scenario. On the upper price chart, you'll see that the candlesticks are green when the oscillator is at -1, red when the oscillator is at +1, and white when the oscillator is at a zero value. The colored bars are constructed based on the same formula and assist in visual confirmation of the oscillator. In the example in Figure 12, we see that the green bars are generally following the uptrend, and the red bars are generally following the downtrend.

This oscillator formula can also be used as the basis for program trading and backtesting in StrategyDesk.

If you have questions about this formula or functionality, please call TD Ameritrade's StrategyDesk free helpline at 800 228-8056, or access the online Help Center via the StrategyDesk application. StrategyDesk is a downloadable application free to TD Ameritrade clients. A brokerage account is required and regular commission rates apply. For more information, visit www.tdameritrade.com.

TD Ameritrade and StrategyDesk do not endorse or recommend any particular trading strategy.

--Jeff Anderson
TD AMERITRADE Holding Corp.
www.tdameritrade.com

GO BACK


TRADECISION:SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

The article by Sylvain Vervoort in this issue, "Short-Term Volume And Price Oscillator," demonstrates how turning points in the oscillator can indicate potential trades.

To implement this oscillator in Tradecision, first create the Alert and TEMA functions using Tradecision's Function Builder. Then, with the help of the Indicator Builder, you can create the short-term volume and price oscillator (SVAPO), which is based on the concept explained by Vervoort. A sample chart is shown in Figure 13

FIGURE 13: TRADECISION, SHORT-TERM VOLUME AND PRICE OSCILLATOR. Here is the SVAPO applied to a daily chart of Google.
Code for the SVAPO indicator is shown here:
 
input
period:"SVAPO period:",8,4,20;
cutoff:"Minimum %o price change:",1,0,10;
devH:"Standard Deviation High:",1.5,0.1,5;
devL:"Standard Deviation Low:",1.3,0.1,5;
stdevper:"Standard Deviation Period:",100,1,200;
end_input
var
ohlc:=(O + H + L + C) / 4;
{calculate the heikin-ashi closing average haCl and get the input variables}
haO:=(ohlc\1\ + iff(historysize>period*6,this\1\,0)) / 2;
haCl:=(ohlc + haO + Max(ohlc, Max(H, haO)) + Min(ohlc, Min(L, haO))) / 4;
{Smooth HaCl closing price}
haC:=TEMA(haCl, period / 1.6);
{Medium term MA of volume to limit extremes and division factor}
vave:=SMA(V, period * 5)\1\;
vmax:=vave * 2;
vc:=iff(V < vmax, V, vmax);
{Basic volume trend}
vtr:=TEMA(LRS(V, period), period);
{SVAPO result of price and volume}
SVAPO:=CumSum(iff(haC >(haC\1\ * (1 + cutoff / 1000)) and Alert(vtr >= vtr\1\, 2), vc,
              iff(haC < (haC\1\ * (1 - cutoff / 1000)) and Alert(vtr >vtr\1\, 2), -vc, 0)),
              period) / (vave + 1);
end_var
return TEMA(iff(historysize>period*6,SVAPO, 0),period);


    The default settings for the Svapo indicator can be easily modified:

To use these functions and indicator in Tradecision, visit the area "Traders' Tips from Tasc magazine" at https://tradecision.com/support/tasc_tips/tasc_traders_tips.htm or copy the code from the Stocks & Commodities website at www.Traders.com.

--Alex Grechanowski, Alyuda Research, Inc.
sales@alyuda.com, 510 931-7808
www.tradecision.com
GO BACK

TRACK 'N TRADE 5.0 & HF:SHORT-TERM VOLUME AND PRICE OSCILLATOR
 

Price oscillators come in many styles with many different options and features. Some of the more popular price oscillators are indicators that carry such names as the SSTO, RSI, and CCI. All three of these price oscillators have one thing in common: they are all based on a fixed scale. A fixed-scale oscillator is an indicator that has upper and lower boundaries, oftentimes referred to as the "overbought region" when referring to the upper boundary, and the "oversold region" when referring to the lower boundary. Unlike traditional moving averages, where we derive a buy or sell signal based on simple crossovers of two or more moving average lines, a fixed-scale oscillator generates entry and exit signals derived from a moving average crossover, either within the upper region or a breaking of these upper and lower fixed-width thresholds themselves.

To establish a buy or sell signal from any one of the many fixed-width oscillating indicators from within Track 'n Trade, simply access the third tab from within the Track 'n Trade left control panel. Next, right-click on the chart region, and select the desired oscillator: RSI, SSTO, CCI, or any of the other indicators listed.

After selecting the indicator, the control panel will display a settings window, which allows the user to customize the mathematical formulas that create each individual oscillator. For example, the slow stochastics settings window contains three variable fields, allowing the user to change the variables that derive the slow stochastics oscillator. This interface allows complete modification of the indicator without requiring the user to write code.

The individual thresholds are set from within the control panel as well, allowing the user to modify the sensitivity of the thresholds by indicating the desired percentage level of the overall "0 - 100" scale window. (As quoted by Sylvain Vervoort in his article in this issue, "The faster you can get in at a price reversal, the tighter your initial stop-loss can be.") It is through the adjustment of these threshold levels that the trader can fine-tune or set the sensitivity of the buy/sell arrows.

(Within Track 'n Trade, it is important to note that the software allows for four different thresholds, but only derives the buy/sell signals from the first two thresholds from within the panel, leaving the other two as noncalculated visual markers.)

FIGURE 14: TRACK 'N TRADE, SHORT-TERM VOLUME AND PRICE OSCILLATOR
Of course, more sensitivity throws less signals, while less sensitivity throws more signals. The less sensitive our thresholds, the more false signals we receive. The more sensitive we set the thresholds, the fewer signals we receive, and the more likely we are to miss out on profitable trading opportunities. Thus, the key is to find the right balance through testing and experience.

--Lan Turner
Gecko Software, Inc.
www.geckosoftware.com

GO BACK


TRADE NAVIGATOR:SHORT-TERM VOLUME AND PRICE OSCILLATOR

In this issue, Sylvain Vervoort presents "Short-Term Volume And Price Oscillator." Here, we'll show how to recreate this oscillator and its components using Trade Navigator. Creating functions in Trade Navigator requires the Gold or Platinum version. You can also download a special file that contains everything discussed here.

As Vervoort states in the article, "Using an oscillator as the only reference to enter or exit a trade is not a good idea. The oscillator should instead be used as an alert for having a closer look at the chart and only then making a decision, taking into consideration all possible technical analysis tools."

All of these functions must be created in a specific order. They build on each other, so be sure to follow the order closely.

We will be creating nine functions, and you can use the following procedure for creating all nine. The last function has some custom inputs, and the use of those is discussed.
 

1) To start, click on the Edit menu and then Functions.
2) Click New to create a new function.
3) Type, or copy and paste, the following syntax into the Formula Box:
(((Open + High + Low + Close).1 / 4) + (((Open + High + Low + Close).2 / 4) +
   ((Open + High + Low + Close).3 / 4))) / 2
4) Click Save and name it "haO" (that is, "O" as in "Oscar").


Now that you've created one function, follow the same steps for the eight additional functions.
 

Function name    Syntax
HaO     (((Open + High + Low + Close).1 / 4) + (((Open + High + Low + Close).2 / 4) +
           ((Open + High + Low + Close).3 / 4))) / 2
vave    MovingAvg (Volume , 40).1
Vmax    vave * 2
Vc    IFF (Volume < vmax , Volume , vmax)
Vtr    TRIX (Regression Slope (vc , 8) , 8 , False)
Alert svapo    Occurrences (vtr >= vtr.1 , 2) >= 1
Hacl    ((Open + High + Low + Close) / 4 + haO + Max ((Open + High + Low + Close) / 4 ,
          Max (High , haO)) + Min ((Open + High + Low + Close) / 4 , Min (Low , haO))) / 4
Hac    TRIX (haCl , 5 , False)
svapo    TRIX (MovingSum (IFF (haC > haC.1 * (1 - cutoff / 1000) And Alert SVAPO ,
               vc , IFF (haC < haC.1 * (1 - cutoff / 1000) And Alert SVAPO , vc * (-1) ,
               0)) , period , 0) / (vave + 1) , Period , False)


The last function, SVAPO, is the main point of the article. It contains inputs that can be variable. When you save, you will receive the following prompt:

1) Click Add.
2) Type a value of 10 for cutoff.
3) Type a value of 7 for period.
4) Uncheck the box for expression.

 To add the indicator to the chart:

1) Click on the Charts menu, then click Add to chart.
2) Scroll down to SVAPO. Click on it and then click Add.

 The chart shown in Figure 15 demonstrates the SVAPO indicator.

FIGURE 15: TRADE NAVIGATOR, SHORT-TERM VOLUME AND PRICE OSCILLATOR. This sample chart demonstrates the SVAPO indicator.


To download a special file that contains all the functions, follow these steps:

1) Click on the File menu and then click Update Data.
2) Click the bottom radio button "Download Special File."
3) Type "sc1107" and click Start.
4) Follow the upgrade prompts. Once Trade Navigator has restarted, you should have the library in your system. You can then follow the steps to add the indicator to the chart.

--Michael Herman
Genesis Financial Technologies
https://www.GenesisFT.com

GO BACK


VT TRADER: SHORT-TERM VOLUME AND PRICE OSCILLATOR (SVAPO)

Sylvain Vervoort's article in this issue, "Short-Term Volume And Price Oscillator," discusses the use of a volume-price oscillator (SVAPO) to help define market conditions and qualify potential trade entry and exit points. Vervoort goes on to discuss the construction of the SVAPO indicator. Briefly mentioned in his article is the inclusion of the SVAPO indicator into a trading system, which is to be described in a followup article by the author.

We'll be offering the short-term volume and price oscillator (SVAPO) for download in our user forums. The VT Trader code and instructions for creating the Svapo are as follows:

Short-term volume and price oscillator (SVAPO)
1. Navigator Window>Tools>Indicator Builder>[New] button
2. In the Indicator Bookmark, type the following text for each field:
 

Name: TASC - 11/2007 - Short-Term Volume and Price Oscillator
Short Name: vt_SVAPO
Label Mask: TASC - 11/2007 -
   Short-Term Volume and Price Oscillator (%period%, %cutoff%, %devH%, %devL%, %stdevper%)
Placement: New Frame
Inspect Alias: SVAPO


3. In the Input Bookmark, create the following variables:
 

[New] button... Name: period , Display Name: SVAPO Periods , Type: integer , Default: 8
[New] button... Name: cutoff , Display Name: Minimum Per 10K % Price Change , Type: float , Default: 1
[New] button... Name: devH , Display Name: Standard Deviation High , Type: float , Default: 1.5
[New] button... Name: devL , Display Name: Standard Deviation Low , Type: float , Default: 1.3
[New] button... Name: stdevper , Display Name: Standard Deviation Periods , Type: integer , Default: 100


4. In the Output Bookmark, create the following variables:
 

[New] button...
Var Name: SVAPO
Name: (SVAPO)
Line Color: dark green
Line Width: slightly thicker
Line Type: solid line
[New] button...
Var Name: StDevH
Name: (StDevH)
Line Color: dark green
Line Width: thin
Line Type: dashed line
[New] button...
Var Name: StDevL
Name: (StDevL)
Line Color: dark green
Line Width: thin
Line Type: dashed line


5. In the Horizontal Line Bookmark, create the following variables:
 

[New] button...
Value: +0.0000
Color: red
Width: thin
Style: dashed line


6. In the Formula Bookmark, copy and paste the following formula:
 

{Provided By: Visual Trading Systems, LLC & Capital Market Services, LLC (c) Copyright 2007}
{Description: SVAPO ndicator}
{Notes: November 2007 Issue - Short-Term Volume and Price Oscillator}
{vt_SVAPO Version 1.0}
{Smooth HA Closing Price}
SmoothHaC:= vt_tema(haC,period/1.6,E);
{Medium term MA of volume to limit extremes and division factor}
vave:= ref(mov(V,period*5,S),-1);
vmax:= vave*2;
vc:= if(V<vmax,V,vmax);
{Basic Volume Trend}
vtr:= vt_tema(LinRegSlope(V,period),period,E);
{SVAPO Result of Price and Volume}
SVAPO:= vt_tema(sum(if(SmoothHaC>(ref(SmoothHaC,-1)*(1+cutoff/10000)) AND 
        BarsSince(vtr>=ref(vtr,-1))<=2,vc, if(SmoothHaC<(ref(SmoothHaC,-1)*(1-cutoff/10000)) AND 
        BarsSince(vtr>ref(vtr,-1))<=2,-vc,0)),period) /(vave+1), period,E);
StDevH:= devH*StDev(SVAPO,stdevper);
StDevL:= -devL*StDev(SVAPO,stdevper);


7. Click the "Save" icon to finish building the SVAPO indicator.

To attach the SVAPO indicator to a chart, click the right mouse button within the chart window and then select "Add Indicators" -> "TASC - 011/2007 - Short-Term Volume and Price Oscillator" from the indicator list.

A sample chart is shown in Figure 16. To learn more about VT Trader, visit www.cmsfx.com.

FIGURE 16: VT TRADER, SVAPO. Here is the SVAPO indicator displayed in a new frame below the EUR/USD 30-minute heikin-ashi candle chart.
--Chris Skidmore
Visual Trading Systems, LLC (courtesy of CMS Forex)
(866) 51-CMSFX, trading@cmsfx.com
www.cmsfx.com

GO BACK


SWINGTRACKER:SHORT-TERM VOLUME AND PRICE OSCILLATOR
 

The SwingTracker code implementing the ideas presented in Sylvain Vervoort's article in this issue, "Short-Term Volume And Price Oscillator," is shown here for copying and pasting, or visit the SwingTracker website at www.mrswing.com.

FIGURE 17: SWINGTRACKER, SHORT-TERM VOLUME AND PRICE OSCILLATOR
A sample SwingTracker chart displaying the custom indicator is shown in Figure 17.--Editor

// $Id: SVAPOIndicator.java,v 1.5 2007/05/17 11:01:32 lars Exp $
package com.iqpartners.data.indicator;

import com.iqpartners.chart.render.LineDSRenderer;
import com.iqpartners.chart.render.RangeRenderer;
import com.iqpartners.chart.render.RendererContext;
import com.iqpartners.data.ChartInfo;
import com.iqpartners.data.ChartItemInfo;
import com.iqpartners.data.DataSet;
import com.iqpartners.data.Range;
import com.iqpartners.data.Tick;
import com.iqpartners.data.indicator.Indicator.LabelWriter;
import com.iqpartners.data.overlay.ColorParameter;
import com.iqpartners.data.overlay.FloatParameter;
import com.iqpartners.data.overlay.IntegerParameter;
import com.iqpartners.data.overlay.LabelIntegerComponent;
import com.iqpartners.data.overlay.ParameterComponent;
import com.iqpartners.data.overlay.SpinnerIntegerComponent;
import com.iqpartners.main.ColorPicker;
import com.iqpartners.main.ColorSchemeManager;
import com.iqpartners.main.TranslatedMessages;
import com.iqpartners.util.EasyLanguageUtil;
import com.iqpartners.util.StringUtil;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ResourceBundle;

public class SVAPOIndicator extends Indicator
{
    private float valueLast = 0.0f;
 

    protected static final int[] labelValues = { -10, 0, 10 };
    protected static final LabelWriter labelWriter = new LabelWriter ()
    {
        public String getLabel (float value)
        {
            return Integer.toString ((int)value);
        }
    };
    protected static final int[] gridValues = { -10, 0, 10 };
 

    protected void setParameters ()
    {
        ResourceBundle messages;
        TranslatedMessages translatedMessages = TranslatedMessages.instance ();
        messages = translatedMessages.getBundle ();

        IntegerParameter ip1 = new IntegerParameter (messages.getString ("svapo_period"), 8)
        {
            public ParameterComponent getParameterComponent ()
            {
                return new SpinnerIntegerComponent (this, 2, 20, 1);
            }
        };
        addParameter (INT_PARM_1, ip1);

        IntegerParameter ip2 = new IntegerParameter (messages.getString ("minimum_po_price_change"), 1)
        {
            public ParameterComponent getParameterComponent ()
            {
                return new SpinnerIntegerComponent (this, 0, 10, 1);
            }
        };
        addParameter (INT_PARM_2, ip2);

        FloatParameter fp1 = new FloatParameter (messages.getString ("standard_deviation_high"),1.5f);
        addParameter (FLOAT_PARM_1, fp1);

        FloatParameter fp2 = new FloatParameter (messages.getString ("standard_deviation_low"),1.3f);
        addParameter (FLOAT_PARM_2, fp2);

        IntegerParameter ip3 = new IntegerParameter (messages.getString ("standard_deviation_period"), 100)
        {
            public ParameterComponent getParameterComponent ()
            {
                return new SpinnerIntegerComponent (this, 1, 200, 1);
            }
        };
        addParameter (INT_PARM_3, ip3);
 
 

        ColorParameter cp1 = new ColorParameter (messages.getString ("svapo_color"), null);
        addParameter (COLOR_PARM_1, cp1);

        ColorParameter cp2 = new ColorParameter (messages.getString ("stddev_color"), null);
        addParameter (COLOR_PARM_2, cp2);
 

        IntegerParameter vp = new IntegerParameter (messages.getString ("version"), 1)
        {
            public int getValue ()
            {
                return 1;
            }
            public ParameterComponent getParameterComponent ()
            {
                return new LabelIntegerComponent (this, versionFormatter);
            }
        };
        addParameter (VERSION_PARM, vp);

        setRangeRenderer (new RangeRenderer ()
        {
            /**
             * Draw the Y Axis
             */
            public void plot (RendererContext rc, Range r, Graphics g)
            {
                drawValueLabels (g, rc, r, labelValues, labelWriter);
                drawValueGrid (g, rc, r, gridValues);
                drawTitle (g, rc, getOverlayName ());
                drawLastLabel (g, rc);
            }
        });
    }

    public void drawLastLabel (Graphics g, RendererContext rc)
    {
        int fontDelta = g.getFont ().getSize ()/2 - 1;
        g.setColor (getColorParm (COLOR_PARM_1, ColorSchemeManager.current ().color8 ()));
        g.fillRect (rc.getXMax ()+fontDelta,rc.getY (valueLast)-fontDelta,fontDelta*50,g.getFont ().getSize ());
        String label = StringUtil.formatFloat2D (valueLast);
        g.setColor (Color.WHITE);
        g.drawString (label, rc.getXMax ()+fontDelta+1, rc.getY (valueLast) + fontDelta);
    }
 

    int getPeriod ()
    {
        return getIntParm1 ();
    }

    int getCutoff ()
    {
        return getIntParm2 ();
    }

    float getDevHigh ()
    {
        return getFloatParm (FLOAT_PARM_1,1.5f);
    }

    float getDevLow ()
    {
        return getFloatParm (FLOAT_PARM_2,1.3f);
    }

    int getStdevPeriod ()
    {
        return getIntParm3 ();
    }

    protected void calculate ()
    {
        clearDataSets ();
        if ( (chartData != null) && ! chartData.isEmpty () )
        {
            Tick ticks[] = chartData.getAllTicks ();
            DataSet ds_hacl = new DataSet(chartData);
 
 

            DataSet ds_volume = DataSet.Volume (chartData);
            Float volume[] = ds_volume.getAllData ();
            DataSet vtr = DataSet.TEMA (DataSet.LinRegSlope (ds_volume,getPeriod ()),getPeriod ());

            Float arr_prev[] = new Float[ticks.length];

            DataSet ds_sum = new DataSet (chartData);
            float prev = 0;
            float prev_ha_c = 0;

            ds_hacl.addFloat (0F,0);
            ds_hacl.addFloat (0F,1);
            ds_sum.addFloat (0F,0);
            ds_sum.addFloat (0F,1);
            arr_prev[0] = 0F;
            arr_prev[1] = 0F;
 

            DataSet ha_c = DataSet.TEMA (ds_hacl,(int)(getPeriod ()/1.6));

            DataSet ds_svapo = DataSet.TEMA (ds_sum,getPeriod ());
 

            for( int i = 2; i < ticks.length; i++ )
            {
                Float prev_value = ds_svapo.dataAtAll (i-1);
                if (prev_value == null)
                    prev_value = 0F;
                float ha_o = ((ticks[i-1].getClose () + ticks[i-1].getOpen () + ticks[i-1].getHigh ()
                                      + ticks[i-1].getLow () ) / 4 + prev_value ) / 2;

                float four_sum = (ticks[i].getClose () + ticks[i].getOpen () + ticks[i].getHigh () + ticks[i].getLow () ) / 4 ;

                ds_hacl.addFloat ((four_sum + ha_o +
                        Math.max (four_sum, Math.max (ticks[i].getHigh (), ha_o) ) +
                        Math.min (four_sum, Math.min (ticks[i].getLow (), ha_o ) ))/4, i);

                ha_c = DataSet.TEMA (ds_hacl,(int)(getPeriod ()/1.6));

                float vave = EasyLanguageUtil.average (volume, i - 1, Math.min (i-1, 5 * getPeriod ()));
                float vmax = vave / 2;

                float vc = Math.min (volume[i], vmax);

                prev = 0;

                if ((vtr.dataAtAll (i) != null)&&(vtr.dataAtAll (i-1) != null)&&(vtr.dataAtAll (i-2) != null))
                {
                    if (( ha_c.dataAtAll (i) > prev_ha_c * (1 + getCutoff () / 1000))&&
                       ((vtr.dataAtAll(i)>=vtr.dataAtAll(i-1))||(vtr.dataAtAll (i-1)>=vtr.dataAtAll (i-2))))
                    {
                        prev = vc;
                    }
                    else if (( ha_c.dataAtAll (i) < prev_ha_c * ( 1 - getCutoff () / 1000 ) )&&
                              ((vtr.dataAtAll (i)>vtr.dataAtAll(i-1))||(vtr.dataAtAll (i-1)>vtr.dataAtAll (i-2))))
                    {
                        prev = -vc;
                    }
                }
                arr_prev[i] = prev;

                float sum = EasyLanguageUtil.sum (arr_prev,i,Math.min (i,getPeriod ())) / (vave +1);
                ds_sum.addFloat (sum,i);

                if (ha_c.dataAtAll (i) == null)
                    prev_ha_c = 0;
                else
                    prev_ha_c = ha_c.dataAtAll (i);

                ds_svapo = DataSet.TEMA (ds_sum,getPeriod ());
            }

            ds_svapo.setDataSetRenderer (new LineDSRenderer (new ColorPicker ()
            {
                public Color getColor (int index)
                {
                    return SVAPOIndicator.this.getColorParm (COLOR_PARM_1, ColorSchemeManager.current ().color10 ());
                }
            }));

            addDataSetPair (DS_1, ds_svapo, null);
            int dataIndex = ds_svapo.size ()-1;
            if (dataIndex >= 0)
                valueLast = ds_svapo.dataAtAll (dataIndex);
 

            DataSet ds_stddevh = new DataSet(chartData);
            DataSet ds_stddevl = new DataSet(chartData);
            for (int i = 0; i < ticks.length; i++)
            {
                float stddev = EasyLanguageUtil.stdDev (ds_svapo.getAllData (),i,Math.min (i,getStdevPeriod ()));
                ds_stddevh.addFloat (stddev*getDevHigh (),i);
                ds_stddevl.addFloat (0-stddev*getDevLow (),i);
            }

            ds_stddevh.setDataSetRenderer (new LineDSRenderer (new ColorPicker ()
            {
                public Color getColor (int index)
                {
                    return SVAPOIndicator.this.getColorParm (COLOR_PARM_2, ColorSchemeManager.current ().color1 ());
                }
            }));
            addDataSetPair (DS_2, ds_stddevh, null);

            ds_stddevl.setDataSetRenderer (new LineDSRenderer (new ColorPicker ()
            {
                public Color getColor (int index)
                {
                    return SVAPOIndicator.this.getColorParm (COLOR_PARM_2, ColorSchemeManager.current ().color1 ());
                }
            }));
            addDataSetPair (DS_3, ds_stddevl, null);
 

        }

    }

    public ChartInfo getInfoEx (int index)
    {
        ChartInfo ci = new ChartInfo ();
        // initiliaze localization
        ResourceBundle messages;
        TranslatedMessages translatedMessages = TranslatedMessages.instance ();
        messages = translatedMessages.getBundle ();
        DataSet svapo = getDataSet1 (DS_1);
        if (svapo != null)
        {
            Float value = svapo.dataAt (index);
            if (value != null)
            {
                ChartItemInfo cii = new ChartItemInfo ();
                cii.setName (messages.getString ("svapo"));
                cii.setValue (StringUtil.formatFloat2D (value));
                cii.setColor (getColorParm (COLOR_PARM_1, ColorSchemeManager.current ().color10 ()));
                ci.add (cii);
            }
        }
        return ci;
    }

    public String getOverlayName ()
    {
        // Initiliaze localization
        ResourceBundle messages;
        TranslatedMessages translatedMessages = TranslatedMessages.instance ();
        messages = translatedMessages.getBundle ();
        return messages.getString ("svapo");
    }

}
 
 

GO BACK


NINJA TRADER: STOCHASTICS WITH LONG-TERM EMA FILTER STRATEGY

The stochastics with long-term EMA filter strategy, as discussed in the December 2006 STOCKS & COMMODITIES interview with Robert W. Colby, is available for download at www.ninjatrader.com/SC/StochasticColby.zip.

Once it has been downloaded, from within the NinjaTrader Control Center window, select the menu File > Utilities > Import NinjaScript and select the downloaded file.

NinjaTrader makes strategy construction accessible for nonprogrammers and programmers alike. By utilizing a GUI-driven point and click approach, traders without programming experience can start to assemble strategies quickly and easily.

You can review the strategy's source code by selecting the menu Tools > Edit NinjaScript > Strategy from within the NinjaTrader Control Center window and selecting the strategy "StochasticsColby."

NinjaScript strategies are compiled DLLs that run native, not interpreted, which provides you with the highest performance possible.

A sample chart implementation of the StochasticsColby strategy is shown in Figure 18.

FIGURE 18: NINJA TRADER, STOCHASTICS WITH LONG-TERM EMA FILTER STRATEGY. This sample daily bar chart shows the backtest results for the S&P emini futures contract over the past four years.
--Raymond Deux and Joshua Peng
NinjaTrader, LLC
www.ninjatrader.com
GO BACK

Return to November 2007 Contents

Originally published in the November 2007 issue of Technical Analysis of STOCKS & COMMODITIES magazine. All rights reserved. © Copyright 2007, Technical Analysis, Inc.