var FASTLIMIT, SLOWLIMIT, SMOOTH, DETRENDER, I1, Q1, JI, JQ, I2, Q2, RE, IM, X, PERIOD, SMOOTHPERIOD, PHASE, DELTAPHASE, ALPHA, MAMA, FAMA, PRICE, PRICE1, PRICE2, PRICE3, SMOOTH2, SMOOTH4, SMOOTH6, PERIOD1, DETRENDER2, DETRENDER3, DETRENDER4, DETRENDER6, I12, I14, I16, Q12, Q14, Q16, I21, Q21, RE1, IM1, ATVALUE, PHASE1, MAMA1, FAMA1: float; var WAGER, PRICESERIES, SMOOTHSERIES, PERIODSERIES, DETRENDERSERIES, PHASESERIES, MAMASERIES, FAMASERIES, I1SERIES, Q1SERIES, I2SERIES, Q2SERIES, RESERIES, IMSERIES, BAR: integer; fastLimit := 0.4; slowLimit := 0.05; wager := 5000; priceSeries := addSeries(#high, #low); priceSeries := divideSeriesValue(priceSeries,2); smooth := 0.0; detrender := 0.0; i1 := 0.0; q1 := 0.0; ji := 0.0; jq := 0.0; i2 := 0.0; q2 := 0.0; re := 0.0; im := 0.0; x := 0.0; period := 0.0; smoothPeriod := 0.0; phase := 0.0; deltaPhase := 0.0; alpha := 0.0; mama := 0.0; fama := 0.0; smoothSeries := createSeries(); periodSeries := createSeries(); detrenderSeries := createSeries(); phaseSeries := createSeries(); mamaSeries := createSeries(); famaSeries := createSeries(); i1Series := createSeries(); q1Series := createSeries(); i2Series := createSeries(); q2Series := createSeries(); reSeries := createSeries(); imSeries := createSeries(); for Bar := 6 to BarCount() - 1 do begin price := getSeriesValue(bar, priceSeries); price1 := getSeriesValue(bar-1, priceSeries); price2 := getSeriesValue(bar-2, priceSeries); price3 := getSeriesValue(bar-3, priceSeries); smooth := (4*price + 3*price1 + 2*price2 + (price3/010)); setSeriesValue(bar, smoothSeries, smooth); smooth := getSeriesValue(bar, smoothSeries); smooth2 := getSeriesValue(bar-2, smoothSeries); smooth4 := getSeriesValue(bar-4, smoothSeries); smooth6 := getSeriesValue(bar-6, smoothSeries); period1 := getSeriesValue(bar-1, periodSeries); detrender := (0.0962*smooth + 0.5769*smooth2 - 0.5769*smooth4 - 0.0962*smooth6) * (0.075*period1 + 0.54); setSeriesValue(bar, detrenderSeries, detrender); detrender := getSeriesValue(bar, detrenderSeries); detrender2 := getSeriesValue(bar-2, detrenderSeries); detrender3 := getSeriesValue(bar-3, detrenderSeries); detrender4 := getSeriesValue(bar-4, detrenderSeries); detrender6 := getSeriesValue(bar-6, detrenderSeries); period1 := getSeriesValue(bar-1, periodSeries); q1 := (0.0962*detrender + 0.5769*detrender2 - 0.5769*detrender4 - 0.0962*detrender6)*(0.075*period1 + 0.54); i1 := detrender3; setSeriesValue(bar, i1Series, i1); setSeriesValue(bar, q1Series, q1); i1 := getSeriesValue(bar, i1Series); i12 := getSeriesValue(bar-2, i1Series); i14 := getSeriesValue(bar-4, i1Series); i16 := getSeriesValue(bar-6, i1Series); q1 := getSeriesValue(bar, q1Series); q12 := getSeriesValue(bar-2, q1Series); q14 := getSeriesValue(bar-4, q1Series); q16 := getSeriesValue(bar-6, q1Series); period1 := getSeriesValue(bar-1, periodSeries); ji := (0.0962*i1 + 0.5769*i12 - 0.5769*i14 - 0.0962*i16)*(0.075*period1 + 0.54); jq := (0.0962*q1 + 0.5769*q12 - 0.5769*q14 - 0.0962*q16)*(0.075*period1 + 0.54); i2 := i1 - jq; q2 := q1 + ji; setSeriesValue(bar, i2Series, i2); setSeriesValue(bar, q2Series, q2); i2 := getSeriesValue(bar, i2Series); i21 := getSeriesValue(bar-1, i2Series); q2 := getSeriesValue(bar, q2Series); q21 := getSeriesValue(bar-1, q2Series); i2 := 0.2*i2 + 0.8*i21; q2 := 0.2*q2 + 0.8*q21; re := i2*i21 + q2*q21; im := i2*q21 - q2*i21; setSeriesValue(bar, reSeries, re); setSeriesValue(bar, imSeries, im); end; for Bar := 6 to BarCount() - 1 do begin re := getSeriesValue(bar, reSeries); re1 := getSeriesValue(bar-1, reSeries); im := getSeriesValue(bar, imSeries); im1 := getSeriesValue(bar-1, imSeries); period1 := getSeriesValue(bar-1, periodSeries); re := 0.2*re + 0.8*re1; im := 0.2*im + 0.8*im1; setSeriesValue(bar, reSeries, re); setSeriesValue(bar, imSeries, im); if (im <> 0) and (re <> 0) then begin x := (im / re); atValue := ArcTan(x); {if bar > barCount() - 10 then print (FloatToStr(x) + ' ' + FloatToStr(atValue));} period := 360 / atValue; end; if period > 1.5*period1 then period := 1.5*period1; if period < 0.67*period1 then period := 0.67*period1; if period < 6.0 then period := 6.0; if period > 50.0 then period := 50.0; period := 0.2*period + 0.8*period1; setSeriesValue(bar, periodSeries, period); i1 := getSeriesValue(bar-1, i1Series); q1 := getSeriesValue(bar-1, q1Series); if i1 <> 0 then phase := arctan(q1/i1); setSeriesValue(bar, phaseSeries, phase); phase := getSeriesValue(bar, phaseSeries); phase1 := getSeriesValue(bar-1, phaseSeries); price := getSeriesValue(bar, priceSeries); deltaphase := phase1 - phase; if deltaphase < 1.0 then deltaphase := 1.0; alpha := fastlimit / deltaphase; if alpha < slowlimit then alpha := slowlimit; if alpha > fastlimit then alpha := fastlimit; mama1 := getSeriesValue(bar-1, mamaSeries); fama1 := getSeriesValue(bar-1, famaSeries); mama := alpha*price + (1 - alpha)*mama1; setSeriesValue(bar, mamaSeries, mama); fama := 0.5*alpha*mama + (1 - 0.5*alpha)*fama1; setSeriesValue(bar, famaSeries, fama); print (floatToStr(fama)); end; PlotSeries( famaSeries, 0, #Blue, 0 ); PlotSeries( mamaSeries, 0, #fuchsia, 0 ); { Trading Rules } for Bar := 7 to BarCount() - 1 do begin mama := getSeriesValue(bar, mamaSeries); mama1 := getSeriesValue(bar-1, mamaSeries); fama := getSeriesValue(bar, famaSeries); fama1 := getSeriesValue(bar-1, famaSeries); if (mama >= fama) and (mama1 < fama1) then begin if LastPositionActive( ) then begin CoverAtMarket(Bar + 1, LastPosition( ), 'ShortExit'); end; {buyAtMarket(Bar + 1,);} end; if (mama < fama) and (mama1 >= fama1) then begin if LastPositionActive( ) then begin SellAtMarket(Bar + 1, LastPosition( ), 'LongExit'); end; shortAtMarket(Bar + 1, ''); end; end;