Торговая система Kaufman's Adaptive Moving Average Binary Wave
ОписаниеKAMA - Адаптивная скользящая средняя была разработана Перри Кауфманом и впервые опубликована в его книге «Умный трейдинг» в 1995 году. Отличие адаптивной скользящей средней от ее сестер состоит в том, что период вычисления скользящей средней напрямую зависит от состояния рынка и динамики цен – при резких трендовых движениях период скользящей средней постепенно уменьшается для большей чувствительности, ну а в моменты затухания рынка и снижения активности период скользящей средней увеличивается, тем самым фильтруются незначительные колебания. В итоге, адаптивная скользящая средняя избавилась от извечных недостатков скользящих средних – запаздываний при увеличении периода и ложных срабатываний при его уменьшении.
Filter вычисляет разброс значений KAMA за определенный период с помощью стандартного отклонения. Если этот разброс не превышает определённую величину то используется предыдущее значения фильтра, если же оно превышает заданный порог происходит присвоение новой величины.
Код
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators; // ER is here
namespace WealthLab.Strategies
{
public class KAMABinaryWave : WealthScript
{
private StrategyParameter paramPeriod;
private StrategyParameter paramFilter;
public KAMABinaryWave()
{
paramPeriod = CreateParameter("Period", 10, 1, 100, 1);
paramFilter = CreateParameter("Filter %", 15, 1, 100, 1);
}
protected override void Execute()
{
int Periods = paramPeriod.ValueInt;
double FilterPercent = paramFilter.Value;
KAMA k = KAMA.Series( Close,Periods );
ER e = ER.Series( Close,Periods );
DataSeries bWave = new DataSeries(Bars,"KAMA Binary Wave");
DataSeries Filter = FilterPercent * StdDev.Series(k - (k>>1),Periods,StdDevCalculation.Sample);
double AMALow = 0;
double AMAHigh = 0;
for(int bar = Periods; bar < Bars.Count; bar++)
{
AMALow = k[bar] < k[bar-1] ? k[bar] : AMALow;
AMAHigh = k[bar] > k[bar-1] ? k[bar] : AMAHigh;
if( ( k[bar] - AMALow ) > Filter[bar] )
bWave[bar] = 1.0;
else
if( ( AMAHigh - k[bar] ) > Filter[bar] )
bWave[bar] = -1.0;
if (IsLastPositionActive)
{
if( bWave[bar] < 0 )
SellAtMarket( bar+1,LastPosition );
}
else
{
if( bWave[bar] > 0 )
BuyAtMarket( bar+1 );
}
}
ChartPane bwPane = CreatePane( 30,true,true );
PlotSeries( bwPane, bWave, Color.Blue, LineStyle.Solid, 1 );
PlotSeries( PricePane, k, Color.Red, LineStyle.Solid, 1 );
}
}
}