General Topics
Markets
Technical Topics
Brokerage Firms
Company Specific
Community Lounge
Site Support

# Ehlers' Fractal Moving Average (FRAMA)

Discussion in 'Technical Analysis' started by skippy, Oct 15, 2006.

1. ### skippy

Hi -- Does anyone have any experience with this indicator? Please PM me if you're willing to discuss: I've some questions about the way it "acts." Thanks!

2. ### ElectricSavant

Could you post a screenshot?

3. ### ElectricSavant

This was another modified variant of it in another platform

y:=Input("sample time periods",1,20,8);
y2:=2*y;
n1:=(HHV(H,y)-LLV(L,y))/y;
n2:=Ref((HHV(H,y)-LLV(L,y))/y,-y);
n3:=(HHV(H,y2)-LLV(L,y2))/y2;
x:=(Log(n1+n2)-Log(n3))/Log(2);
xt:=Exp(-4.6*(x-1));
x1:=If(xt<0.1,0.1,If(xt>1,1,xt));
x2:=1-x1;
If(Cum(1)=y2,
(MP() * x1) + (Ref(MP(),-1) * x2),
(MP() * x1) + (PREV * x2))

4. ### ElectricSavant

this may or may not work in tradestation

{ The IntrabarOrderGeneration attribute is set to false
in this strategy because strategy calculations depend on
end-of-bar prices. }

[IntrabarOrderGeneration = false]
inputs:
Price( 0.5 * ( H + L ) ),
N( 16 ),
NumDevsUp( 2 ),
NumDevsDn( 2 ),
TrailAmt( 0.5 ),
BandColor( Yellow ),
DataType( 1 ) ; { pass in 1 if you are working with
the entire population, and 2 if you are working
with a sample and want the standard deviation for
the population }

variables:
Divisor( 0 ),
Mean( 0 ),
SumSqr( 0 ),
AvgDiff( 0 ),
FracStandardDev( 0 ),
LowerBand( 0 ),
UpperBand( 0 ),
TL_ID1( -1 ),
TL_ID2( -1 ) ;

// AvgDiff = 0 ;
Divisor = Iff( DataType = 1, N, N - 1 ) ;
if Divisor > 0 then
begin
Mean = AdaptMovAvg_Fractal( Price, N ) ;
SumSqr = 0 ;
for Value1 = 0 to N - 1
begin
SumSqr = SumSqr + Square( Price[Value1] -
Mean ) ;
end ;
AvgDiff = SumSqr / Divisor ;
end ;

if AvgDiff > 0 then
FracStandardDev = SquareRoot( AvgDiff )
else
FracStandardDev = 0 ;

LowerBand = Mean - NumDevsDn * FracStandardDev ;
UpperBand = Mean + NumDevsUp * FracStandardDev ;

if CurrentBar > 1 and Low crosses over LowerBand then
{ CB > 1 check used to avoid spurious cross confirmation
at CB = 1 }
Buy ( "BBandLE" ) next bar LowerBand stop ;

if CurrentBar > 1 and High crosses under UpperBand then
SellShort next bar at UpperBand Stop ; { ie, don't
buy if next bar completely below current LowerBand,
but wait for next crossing condition - an example
of a non-persistent setup with an indefinite
stop/limit trigger }

SetStopShare ;
SetDollarTrailing( TrailAmt ) ;
SetProfitTarget ( 3 * TrailAmt ) ;

{ Use trendlines to "plot" the bands on the chart }
TL_ID1 = TL_New( Date[1], Time[1], UpperBand[1], Date,
Time, UpperBand ) ;
TL_SetColor( TL_ID1, BandColor ) ;
TL_ID2 = TL_New( Date[1], Time[1], LowerBand[1], Date,
Time, LowerBand ) ;
TL_SetColor( TL_ID2, BandColor ) ;

6. ### skippy

Hey, thanks. I do have the code. I'm puzzled by its tendancies, that's all. For example, the way it can be smoother at some smaller lengths than some larger ones. I say "some" because this is not consistently true across all values -- i.e., 10 may be smoother than 14, but 11 considerably jumpier than 12. I'm wondering if anyone out there might be able to explain the "why" of this phenomenon.

7. ### ElectricSavant

Could it be this?

y:=Input("sample time periods",1,20,8);

8. ### skippy

Ah! Thank you! Your clue just prompted me to reinspect the actual formula. The period "n" must be an even number. Thanks again!

9. ### 5Pillars

Guys.....it is not in the lines, it is in our minds.