Traders' Tip text
The Compare Price Momentum Oscillator (CPMO) by Vitali Apirine is not really a new indicator. It's rather an approach to put the DecisionPoint Price Momentum Oscillator (
PMO) in an intermarket context.
Specifically, author uses the CPMO to compare momentum of different indexes. For example, it's believed that the S&P 500 rises when consumer discretionary (IXY) outperforms consumer staples (IXR) and vice versa.
As a reference we include a simplistic Strategy which produces buy signals when the
PMO of IXY crosses above the
PMO of IXR. The opposite event (a crossunder) generated a sell signal. Wealth-Lab users can find PMO in the
Community Indicators library.
Figure 1. On the daily chart, consumer discretionary (IXY) and consumer staples (IXR) are plotted along with the S&P 500 ETF (SPY).On the daily chart, consumer discretionary (IXY) and consumer staples (IXR) are plotted along with the S&P 500 ETF (SPY).
WealthScript Code (C#)
On a closing note, simply download public strategies from Wealth-Lab (hit Ctrl-O and choose "Download...") to get the trading system code below:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators;
namespace WealthLab.Strategies
{
public class TASCAug2020 : WealthScript
{
private StrategyParameter slider1;
private StrategyParameter slider2;
public TASCAug2020()
{
slider1 = CreateParameter("PMO period 1",35,2,300,20);
slider2 = CreateParameter("PMO period 2",20,2,300,20);
}
protected override void Execute()
{
var ls = LineStyle.Solid;
var ixy = GetExternalSymbol("IXY", true).Close;
var ixr = GetExternalSymbol("IXR", true).Close;
var pmo_ixy = PMO.Series(ixy, slider1.ValueInt, slider2.ValueInt);
var pmo_ixr = PMO.Series(ixr, slider1.ValueInt, slider2.ValueInt);
int xoBar = -1, xuBar = -1;
ChartPane panePMO = CreatePane( 40, true, true); HideVolume();
PlotSeries( panePMO, pmo_ixy, Color.Green, ls, 1);
PlotSeries( panePMO, pmo_ixr, Color.Red, ls, 1);
for(int bar = GetTradingLoopStartBar( Math.Max(pmo_ixy.FirstValidValue, pmo_ixr.FirstValidValue)); bar < Bars.Count; bar++)
{
bool xo = CrossOver( bar, pmo_ixy, pmo_ixr);
bool xu = CrossUnder( bar, pmo_ixy, pmo_ixr);
if (xo) {
xoBar = bar;
DrawCircle( panePMO, 15, bar, pmo_ixybar, Color.Green, LineStyle.Solid, 1, true);
}
if (xu) {
xuBar = bar;
DrawCircle( panePMO, 15, bar, pmo_ixybar, Color.Red, LineStyle.Solid, 1, true);
}
SetBackgroundColor( bar, (xoBar > xuBar) ? Color.FromArgb(20, Color.Green) : Color.FromArgb(20, Color.Red));
if (xoBar == xuBar)
SetBackgroundColor( bar, Color.Transparent);
if (xoBar == xuBar) continue;
if (IsLastPositionActive)
{
Position p = LastPosition;
if (xu) SellAtMarket( bar + 1, p, "Trend change");
}
else
{
if (xoBar > xuBar)
BuyAtMarket( bar + 1);
}
}
}
}
}
Gene Geren (Eugene)
Wealth-Lab team