Kalman

Modified on 2018/02/03 06:05 by Eugene — Categorized as: Standard Indicators

Syntax

public Kalman(DataSeries source, string description)
public static Kalman Series(DataSeries source)

Parameter Description

source The source DataSeries

Description

Kalman
The Kalman Filter is based on the concept of optimum estimation, first introduced by Dr. R. E. Kalman in 1960. It has generally been used in terrestrial and space-based navigation and tracking systems. In general, it can be thought of as generating an optimal (in a linear, white noise, mean-square-error sense) estimate of a future position based on the current position of a target and an estimate of its velocity and acceleration and their uncertainties.

Interpretation

Where DataSeries are involved as in trading systems the mathematics can be simplified considerably and a (nearly) zero lag filter produced very straightforwardly. For further information see: Optimal Tracking Filters (DOC file) by John Ehlers of MESA Software. Note that Kalman filters can be applied to any DataSeries.

Calculation

The basic pseudo computation for the Kalman Filter value at a specific bar for a DataSeries is:

ZeroLagValueBar= Weight1 * DataSeriesValueBar + Weight2 * (DataSeriesValueBar - DataSeriesValueBar - 3)
ZeroLagValueBar= ZeroLagValueBar + Weight3 * ZeroLagValueLast
ZeroLagValueLast= ZeroLagValueBar
Save KalmanSeriesValueBar= ZeroLagValueBar
return KalmanSeriesValueBar


Example

This system uses the Kalman Filter as a signal line for the CMO Oscillator to time position entries


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies { public class KalmanDemo : WealthScript { protected override void Execute() { DataSeries Average = ( High + Low ) / 2; DataSeries hCMO = CMO.Series( Average, 14 ); ChartPane CMOPane = CreatePane( 40, true, true ); PlotSeries( CMOPane, hCMO, Color.Blue, LineStyle.Solid, 3 ); PlotSeries( CMOPane, Kalman.Series( hCMO ), Color.Black, LineStyle.Solid, 2 );

for(int bar = 20; bar < Bars.Count; bar++) { if (IsLastPositionActive) { if( CrossOver( bar, hCMO, 0 ) ) SellAtMarket( bar+1, LastPosition, "CMO 0" ); } else { if( ( CMO.Value( bar-1, Average, 14 ) < -50 ) & CrossOver( bar, hCMO, Kalman.Series( hCMO ) ) ) BuyAtMarket( bar+1, "CMO Kalman" ); } } } } }