Торговая система 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 );
		}
	}
}