PureBytes Links
Trading Reference Links
|
Sorry, I sent this out before the ELA, but for some reason my mailer
sent it in HTML format and the Omega list bounced it. Let's try again:
I couldn't find the code for my Equity Curve MA indicator in my files
or in the Omega list archives, but Ed Winters found it in the Code list
archive. (Thanks Ed!)
My final version was a bit more involved than I remembered. :-)
Here 'tis, and the ELA has already been sent in a separate message.
Gary
==============================================================
From: "Gary Fritz" <fritz@xxxxxxxx>
To: Code List <code-list@xxxxxxxxxxxxx>
Date sent: Fri, 10 Dec 1999 16:29:26 -0700
Subject: Re: CL_Money management & system trading
Bob4367123@xxxxxxx wrote:
> It seems to me, in my limited experience backtesting systems, that
> all systems work, some of the time. So the question is, when do
> you trade the system?
Only when it's going to make money. :-)
> why can't you trade the system only when the equity curve is going
> up, and not trade when the system is in drawdown? My limited
> research into this looks promising.
This strategy gets recommended in a number of places. I recently saw
it in Mark Jurik's book and wished I could try it out in TS. But it
would be really nasty to do this, since you'd have to simulate all
the system trades to track the "phantom" equity, and use that PE and
the MA of the PE to determine when your system could really trade.
Then it occurred to me that it would be *easy* to write an indicator
to do this. It doesn't trade the system for you, but it gives you an
idea for how well the strategy works. I'd been meaning to post it,
so this is a good excuse. :-)
I took my "Equity Curve" indicator and modified it to only "count" a
trade if the system equity was above the equity MA. The green bars &
white line show the unmodified equity as reported by the system, the
red line is the XMA of the equity, and the yellow line is the
modified equity.
The indicator takes several arguments: the same "period" input that
the regular Equity Curve indicator takes, the length of the XMA, and
two inputs to tell what to do when the equity is above & below the
MA. With the defaults (0.0 and 1.0) it has the effect of trading
only when the equity is above the MA. If you set BelowMA to 0.5 it's
as though you cut your position size in half when you're below the
MA. If BelowMA is -1 it calculates a bad approximation of what would
happen if you took the *opposite* of your system's position when the
equity is below the MA. (It just negates the result of the trade.
Obviously you would get different results if you went long instead of
short, etc.)
Note: the indicator only takes the MA of the equity at the end of
each Period you specify. If you want it to compute the MA on a trade-
by-trade basis, specify "T" as your Period.
Results: I found that it did almost nothing to really good systems
(systems that have a steadily increasing equity), as you would
expect. But few systems have a steadily-increasing equity,
especially on a trade-by-trade basis, and most systems I looked at
got HURT much more than helped by this strategy.
In order for the equity to go below the MA, you need a series of
losses. To dig out from the low-equity state, you need some wins.
But many of the digging-out wins are discarded, since the equity is
still below the MA. So you don't get all those wins. If your system
often alternates between wins and losses, you get murdered -- the
system ignores the wins that get the equity above the MA, and takes
the losses that drive it below the MA again.
The only time I saw a real benefit from the strategy was in systems
that had horrific extended drawdowns. And even then it was often
only a short-term help, since once the system finally turned around
and started winning again, the basic strategy got ahead of the
modified one.
I suspect that trading with a strategy like this would result in a
higher Sharpe ratio. It might even increase the win% -- my indicator
doesn't compute that. But it knocks hell out of your profits, and it
only seems to help really bad systems. I wouldn't want to trade any
system that benefits from this.
In fact it works so badly that I don't understand why so many books
recommend it. Does anyone see a flaw in my code?
Gary
{
Equity Curve MA MM
Version 1.01 9/6/2000
This indicator plots bars of closed equity on a periodic basis
on the last 200 bars of a chart. If your system test contains more
than 200 trades or periods, it only plots the last 200.
The indicator then computes an Exponential Moving Average of the system
equity, and determines the resulting equity if you change your
position size when the system equity falls below the MA. When the
system equity is above the MA, trade AboveMA * your normal position,
and BelowMA * your normal position when the MA is below the equity.
Unmodified system equity plots with green bars. Equity MA plots
as a red line, and modified system equity (taking the MA into
account) plots as a yellow line.
The number of periods plotted is determined by the variable "Size,"
which may be changed. If you increase it, set the size of the array
"EQ" and the "MaxBarsBack" value larger than or equal to the value
of "Size".
Inputs:
Period: Sampling period
("T"=per trade, "Y"=yearly, "Q"=quarterly, "M"=monthly,
"W"=weekly, "D"=daily)
MAlen: Length of simple moving average
BelowMA: Position size when equity is below the MA
AboveMA: Position size when equity is above the MA
(1.0 = normal position size, 0.0 = no position)
Gary Fritz
}
Inputs: Period("W"), MAlen(10), BelowMA(0.0), AboveMA(1.0);
Vars: Equity(0), EndEq(0), LastEq(0);
Vars: Mo(0), Countr(0), J(0), K(0), CE(0), Size(200), Last(0);
Vars: Per(0), P1(0), P2(0), P3(0), P4(0);
Vars: Factor(0), MA(0), LastModEq(0), LastMA(0), TakeNextTrade(True);
Array: EQ[200](0), EQMA[200](0), ModifiedEQ[200](0);
{ Determine the desired period, print the proper header, and
set Per to the appropriate value. Why use Per? Because if I
compare Period to "T", "Y", etc on every bar, the indicator runs
TWICE as slowly! EL string operators are sloooowwww... }
if (BarNumber = 1) then begin
if Period = "T" then begin print("Per-trade profit:"); Per = 0; end;
if Period = "Y" then begin print("Yearly profit:"); Per = 1; end;
if Period = "Q" then begin print("Quarterly profit:"); Per = 2; end;
if Period = "M" then begin print("Monthly profit:"); Per = 3; end;
if Period = "W" then begin print("Weekly profit:"); Per = 4; end;
if Period = "D" then begin print("Daily profit:"); Per = 5; end;
Factor = 2/(MAlen+1);
end;
Mo = Month(Date);
Equity = I_ClosedEquity;
{ If our chosen period has expired, record the end-of-period equity }
if ((Per = 0) and (Equity <> Equity[1]))
or ((Per = 1) and (Year(Date) <> Year(Date[1])))
or ((Per = 2) and (Mo <> Mo[1]) and (Mo=1 or Mo=4 or Mo=7 or Mo=10))
or ((Per = 3) and (Mo <> Mo[1]))
or ((Per = 4) and (DayOfWeek(Date) < DayOfWeek(Date[1])))
or ((Per = 5) and (Date <> Date[1]))
then begin
if Per = 0 then EndEq = Equity
else EndEq = Equity[1];
if (LastBarOnChart = False) then
print(Date[1]:6:0,",",EndEq:7:2,",",EndEq-LastEq:7:2);
{ Compute XMA of recent equity values }
if (MA = 0) then MA = EndEq
else MA = Factor*EndEq + (1-Factor)*MA;
EQ[Countr] = EndEq;
EQMA[Countr] = MA;
if TakeNextTrade
then ModifiedEQ[Countr] = LastModEq + AboveMA*(EndEq - LastEq)
else ModifiedEQ[Countr] = LastModEq + BelowMA*(EndEq - LastEq);
TakeNextTrade = (EndEq >= MA);
LastEq = EndEq;
LastModEq = ModifiedEQ[Countr];
Countr = Mod(Countr + 1, Size); { Move pointer in buffer }
end;
{ On last bar, plot the last Size periods of equity }
if LastBarOnChart then
for J = 0 to Size - 1 begin { Loop to plot bars }
K = Mod(Countr + J, Size); { Calc pointer into buffer }
Plot1[Size - 1 - J](EQ[K],"ClosedEq");
Plot2[Size - 1 - J](EQMA[K],"EqMA");
Plot3[Size - 1 - J](ModifiedEQ[K],"ModEQ");
Plot4[Size - 1 - J](EQ[K], ""); { Plot white line at top of histogram }
end;
|