March 2000
Article: In Search of A Holy Grail
by Howard Arrington
What a difference a month makes. I hope you have had as much fun
with these markets as I have had. I trade stocks and grew my account
nicely in January. I equaled that success in February until I got on
the wrong side of the market on a couple of those big down days in the
DOW. I shouldn't complain because February was still a positive
month for me, but only half of January's success. Being beat up by
the market for a few days in February reawakened in me a yearning for a
successful mechanical trading system that would remove the emotional and mental
debate about what to do next.
My brother and I spent hundreds of hours in the past few weeks researching an
idea we have. To our great delight, the theoretical results are considerably
better than we hoped for. Now, I am not going to promote our system
by telling you everything we are doing. That is not my
purpose. My newsletter objective is to teach you how to think for
yourself. This article will touch on the process we recently went
through in our search for a Holy Grail trading system that fits our objectives
and trading style.
Step 1: It all started with a unique idea that would
generate a buy signal in a daily stock chart. Since I live near the
Grand Teton mountain, I will name this idea the Teton signal. To
research whether the Teton signal had any merit, I arbitrarily chose the first
week of January, and generated a focus group of 21 stocks that had the Teton
signal that week. My simulation bought 1,000 shares of each stock
and held the stocks until February 23rd, showing a profit of
$54,000. Since the Nasdaq has put in record highs since January, I
need to be very cautious because the Teton signal may not work in a down market.
Step 2: I then examined the stocks picked by the Teton
signal and observed that about half the stocks were priced under $10. So, I
divided the portfolio into two groups: Over $10 and Under $10.
The average profit for the Under $10 group was 50% greater than the average
profit for the Over $10 group. Therefore, the first improvement to
my Holy Grail was a decision to invest only in the Under $10 stocks.
The profit jumped to $78,000 for the Under $10 focus group by using the same
capital as Step 1.
Step 3: The next consideration was to compare buying a
fixed number of shares versus buying an equal dollar amount of each
stock. Balancing dollar distribution among the stocks in the focus
group increased the profit to $110,000. The capital requirement
remained the same, but buying $10,000 of each stock was more profitable than
buying the same number of shares for each stock. I did not know this
would be the result until I tried the idea on my focus group.
Step 4: The improvements in Step 2 and 3 evolved the
system to twice the profit of the initial idea. But the focus group
was too small to be statistically significant. So, the Teton signal
was used to find a 2nd focus group of 24 stocks from the 2nd week of
January. Profits from the 2nd focus group were not quite as high as
the 1st study group, but my enthusiasm still rose because the Teton signal
seemed to be repeatable with the 2nd group. Using both groups, I
concentrated on finding a common characteristic among the losers and put in an
adjustment to the Teton signal to eliminate the losers. Naturally,
any adjustment to the signal will eliminate or add both losers and winners, but
a change is worth keeping if more losers are eliminated than winners, and
relative profits increase. Since the Teton signal was tweaked, I
reran the signal on both week #1 and week #2 to reestablish the focus groups for
these two weeks. Results were verified and found to be better.
Step 5: By now, we felt we were on to something
worthwhile, and it was time to work with a large focus group and do some serious
back testing. The Teton signal was used to create 17 groups for the
17 weeks in November 1999 through February 2000. Each week was
treated as a separate focus group and kept in a separate Ensign Windows trading
account. The smallest group had 7 signals in one week, and the
largest group had 32 signals. For each signal, $10,000 worth of
stock was bought (paper trade) using the closing price of the day that had a
Teton signal. Collectively, the 17 focus groups contained 300
stocks. Profits were encouraging because the 15 oldest groups showed
profits. The two groups for the last two weeks of February showed losses,
but this is probably due to the shortness of time. The stocks picked
by the Teton signal need time to mature before they can be evaluated as a good
or bad investment.
Step 6: Coming up with an idea and generating lots of
signals over the past 4 months was the easy part. The next several
steps address money management issues because we don't happen to have several
million dollars of capital to buy $10,000 worth of stock every time we get a
Teton signal. However, an audience of 300 stocks makes for a
wonderfully diverse set of stocks to analyze. The up trending
markets of November and December are countered by the down trending markets seen
in January and February, and our Teton signal appears to work well in both types
of markets. In this step, we studied the benefit of using a
protective stop at various percentage levels of retracement. Our
tests showed that the system would be most profitable if we did not use any
protective stop. Probably this unexpected result is due to having a
diversity of 300 stocks and the Nasdaq has moved to new record highs.
To determine these results, a sophisticated ESPL script was written that
would open charts for each stock in our 17 trading accounts, find the signal
date, make a $10,000 trade and either keep the position until Feb 23rd, or exit
at the stop loss level being tested. This was not a trivial step to
take in our research. The power of the ESPL programming language in
Ensign Window really shined, and we were able to generate beautiful reports with
great statistics to support our research. The script we wrote for our
research is shared with you in this newsletter.
Step 7: The next idea examined was an exit
strategy. Is there a percentage gain target that is
optimal? For example, a high percentage of the stocks picked by the
Teton signal gained 50%, a goodly percentage gained 100%, and a few gained
several hundred percent. The ESPL script created for Step 6 was
enhanced to search out the answer. Part of the complication of
finding an answer involves the recycling of one's capital. Is it
better to get a $20,000 profit in three months or exit after a $10,000 gain in
one month, and buy two new $10,000 positions? That is a tough
question to answer. For our 17 focus groups, we think the optimum
profit target is a 100% gain. Although a 200% profit target showed a
greater profit on February 23rd, it represented a lower growth rate per day than
using a 100% target. Those stocks which achieved their 100% targets
did so in an average of 7 to 8 weeks. Recycling those profits into
stocks with new Teton signals made more money than holding the original stocks
for a higher target objective.
Step 8: The next exit strategy that was examined
involved time. For this test, all stocks were allowed to run without
exiting at a target objective. A position would be sold after a
fixed number of days from the Teton signal date. The ESPL script
gave profit results in weekly increments from 1 week to 20 weeks. We
think that holding a position for 8 weeks has the optimal growth
rate. Holding rising stocks for 20 weeks shows a greater profit, but
not a greater rate of growth. The average growth rate for 8 weeks
might be $175 per day for a $10,000 position, and a lower $125 per day if held
20 weeks.
Step 9: All profit comparisons were made relative for
the amount of capital required to finance a strategy. New positions
were acquired each day, rather than all at once. The profit from the
November trades becomes available to finance some trades in January or
February. This is how a real account would work. 300
positions were not acquired all at the same time, nor liquidated at the same
time. There is a staggering of each which affects the net position
held in any given week. Our ESPL reports showed the weekly total
position held. Subtracting the profit achieved week by week gave us
the position size that was being financed by our capital. Making all
profit figures relative to each other answers a question like: Is strategy
A which made $100,000 by using capital for 100 positions more or less favorable
than strategy B which made $60,000 with 50 positions? By normalizing
the results, relative worth shows strategy B to have a better average value per
position.
Step 10: Several of the preceding steps examined
strategies for exiting the positions initiated by the Teton signal.
However, one flaw was our assumption that the position was bought using the
close of the signal day. A better reality would be to buy the next
day's open. An even more realistic approach would be to buy the open
price, with a built in penalty for a typical spread between a bid/ask
price. Assume the open is a bid, but we must buy at a higher ask
price. Making these changes to our ESPL calculations naturally
degraded the profits, but the system still generated enviable results for our
focus group of 300 stocks.
Part of the analysis was to test various entry strategies, such as a limit on
how large of an opening gap to tolerate, or should we hold out for an entry
opportunity at yesterday's closing signal price. Our tests showed
that relative profits would be better if we hold out for a entry price 10% below
the close on the signal day. For example, if the close on the signal
day was $5, we would only buy the stock at $4.50 or lower. True,
many of our original 300 stocks could not be purchased because of this 10% lower
requirement, but the additional profits made on those trades that did get
purchased made up for the missed trades. Again, all profits have to
be made relative as was done in step 9. Perhaps we missed 150 of the
300 trades because the 150 never retreated 10% plus slippage so we could buy a
position. Yet, the relative profit from the 150 exceeded the profit
from the 300.
Step 11: We revisited one of the steps done earlier by
examining many of the losers. One characteristic we noticed was many
of them were thinly traded stocks. Therefore, we did an analysis on
average volume and added a minimum average volume requirement to our Teton
signal. The threshold we chose reduced the 300 signals by 16, 1 of which
was a great winner and 15 of which were either losers or under
performers. Again, this tweak improved the relative profit of our
Holy Grail by eliminating dead weight which pulled down the average daily growth
rates.
Step 12: Our final step was just more icing on the
cake. We are constantly improving our system, and have answered for
ourselves various questions about how to get in and how to get out of our
positions. Our system generates more signals than we can possibly
take, yet we hesitate to arbitrarily take some and skip others just because we
are under capitalized. We needed to know which of the 300 signals
are likely to be super stars. In general, all signals were great
because of recent advances in the Nasdaq. But some are exceptional
and we wanted to discover the difference. This is a perfect
application for a neural net to solve. We chose as inputs to a
neural net various chart characteristics on the day of the Teton signal such as
net, range, Stochastic, price, volume and average volume. We also
used various fundamentals such as P/E ratio and dividend. Signals
from December and January were used to train the network, and then the November
signals were run through the network to compare the network forecast with the
reality of November's trades. The forecast looked
excellent. Therefore, we retrained the network using November,
December and January signals, and used it to evaluate February's
signals. Of course we use the neural net to appraise the potential
of every new Teton signal we might get.
Basically the neural net separates the signals into two groups: Above
average performers, and Below average performers. We used the neural
net to divide February's 80 signals into these two groups. We found
the stocks forecast to be Above average in reality have an average gain of
$5500, while the stocks forecast to be Below average have an average gain of
$850. That is a fantastic A|B separation which suggests that the
neural net is performing well. The neural net is discovering
something in the cross relationship of the various inputs that is too complex
for my mind to discover. I have no idea what it is that the neural
net is seeing and using in its decision process to forecast a signal for either
group. As long as it is working so well, I am content not to
know. I'll just use it to my advantage, and use my limited capital
to buy stocks forecast to be in the Above average group.
Summary: The Teton signal picks a great set of stocks
to buy. But it is our research in strategies for how to enter and
how to exit that greatly enhances the profits. Every step that was
taken to statistically separate the cream from the milk made the system more
profitable and doable considering the limited capital we have in our accounts.
Now I'll answer the question you all want to ask. Does Howard
believe in the results of his research enough to put money on it?
The answer is a definite YES. My brother and I did not do all this
work to have fodder for an article in my newsletter. In fact, my
brother's preference is to keep quiet about what we do. We did it
for our private use, and we both have made trades in our accounts based
precisely on the mechanical system we have researched. It is too
early to tell whether our accounts will be as profitable in reality as was seen
in hindsight, but we do believe in the value of our ideas and that the results
are statistically substantiated by our research. Although the DOW
had a significant down move in January and February, the Nasdaq did
not. How the system would perform in a bear market is yet to be
determined.
Everything I have shared with you is for one purpose only, and that is to
show you the process of evolution or improvement. I do not propose
that you accept any detail I have given as having application to your
trading. Our results apply only to those unique stocks picked by our
private Teton signal. It is a signal designed for me and my brother
and fits the type of trading we want to do in the stock market.
Every one is different and what works for us would not necessarily work for
you. But, as you seek to develop a trading system that works for
you, perhaps you will consider using some of the steps I used in my personal
search for a Holy Grail. Good luck to all of us.
Trader Profile: David Kaiser
David Kaiser has been trading Commodities for nearly 30 years. His longevity
as a successful trader is his most impressive credential. David has been an
Ensign Software customer since the mid 1980's.
ES: Give a brief summary of your trading history and background?
DK: I started trading penny stocks at age 15. My mom opened the account in
her name since I was too young. I traded money that I earned mowing lawns. I
have been trading commodities since 1972. I traded mostly spreads at first. I
used to draw charts by hand everyday. It was a lot of work to manually update
the charts. For the past 15 years I have used Ensign Software programs to
facilitate my trading. After some success in the markets, a few friends asked if
I would trade some money for them. Since then I have been trading for myself and
a few others full time. I trade commodities exclusively. I have a trading room
at home in my basement. The daily commute is great.
ES: What kind of Computer equipment and Software do have in your trading
room?
DK: I use basic Pentium IBM clone computers. Nothing special. I was even
using a 386 computer until a few months ago. As far as software goes, I have had
every Ensign Software product since Ensign 1. I currently use both Ensign 6
(DOS) and Ensign Windows. I really like Ensign Software because they are so
responsive. If I ever have a program request or a problem, the response or fix
is almost immediate. You can't find that anywhere else.
ES: Which markets do you trade?
DK: I only trade the commodities markets. I trade whatever is moving. I will
trade any commodity if it looks good. My favorite market right now is the E-Mini
S&P market. I like it because it trades electronically and is very easy to
get in and out.
ES: What chart time-frames do you use?
DK: I mostly use Daily charts and 30-minute charts. These time frames give me
what I need, without having to look at other chart times.
ES: Which technical analysis studies and tools do you use?
DK: I like to use the Keltner Channel and the Relative Strength Index. I also
use Ensign's Custom Symbols feature to build my own Indexes. These custom
Indexes help me keep track of different market groups.
ES: What kind of chart formations do you look for?
DK: I mostly look for consolidations, where the market is moving sideways. I
like to buy the bottoms and sell the tops of consolidations, in conjunction with
Elliott wave counts.
ES: How frequently do you trade?
DK: Several times a day in multiple markets.
ES: What kind of money management or risk management do you use?
DK: No specific rules. I will exit a trade if it doesn't act like I thought
it should, rather than wait around for the market to stop me out. I won't let a
losing trade grow bigger than the expected profit from the trade. Sometimes I
place a stop on a trade, depending on the market conditions… (like if Alan
Greenspan is at the microphone speaking). Other times I just jump out of a trade
when it doesn't go as I expected. The trade could be at a profit or a loss.
ES: What was one of your best trades?
DK: Actually, my best trade was a mistake. A few years back I placed an order
to short the Cotton market. The broker never called me back and I thought that
the trade was not filled. I wasn't very diligent at checking my daily open
positions. I didn't realize that I was short Cotton for over a week. By the time
I found out that I had a Cotton position, the trade had a $20,000 profit. I'm
not proud of the trade because it could have been a huge loss. I got lucky that
time. I keep better track of my positions now.
ES: What was one of your worst mistakes?
DK: Adding to a losing position. I have made that mistake maybe a dozen times
over the years. I won't make it again. I won't ever try to average a losing
position. It's just trouble. It's much better to just step aside and then
re-enter your next trade with a clear head.
ES: What do you look for in a broker?
DK: The two big items I look for are 1) low commissions, and 2) electronic
trading access. I currently use electronic trading software that has ties with
Ensign Software. It works great. I get fills in 3 seconds for some markets. I
make sure to verify my trades and equity everyday. A good broker should correct
any problems immediately.
ES: What advice would you give to a new trader?
DK: Focus on managing your losing trades. The profitable trades will take
care of themselves. If you want to stay in business, don't add to a losing
trade, and don't hang on to losing trades. I know people that have gone broke
because they fell in love with a losing trade and wouldn't step aside. You can
always put a new trade back on. One big loss will kill a new account.
ES: What is the ideal trade for you?
DK: A trade that moves in my direction right away. This validates my reasons
for placing the trade. It's a lot nicer deciding where to take profits, than
trying to figure out how to exit a bad trade.
ESPL Tutor: Analyze Trade Objectives
This script is too extensive to document or explain in detail. It is
provided for those who want to test their Holy Grail idea in the same manner
that I and my brother tested our ideas. This is the script we wrote
to support our research effort. If you will spend some time studying
the script, you can probably learn a neat trick or two.
-- Program to analyze Trade Accounts
-- with various Targets, Stops and Time exits
-- John Arrington and Howard Arrington
var
ex,sa,ta,vi,i,j,k,m,n,tp,sl,nAccounts,signalDate: integer;
wDays,wCount,twDays,twCount: integer; {Winner series}
sDays,sCount,tsDays,tsCount: integer; {Stop loss series}
oDays,oCount,toDays,toCount: integer; {Open position series}
fDays,fCount,tfDays,tfCount,nCount,tnCount: integer; {Forced
Time exit}
wRate,sRate,oRate,fRate,fValue,oValue,toValue,tfValue: real;
twRate,tsRate,toRate,tfRate,tRate: real;
b,bShow,bPosition: boolean;
s,symbol,exitDate,entryDate,signalClose,tPrice: string;
signalprice,maxprice,openPrice,entryPrice,stopLossPrice,targetPrice: real;
dl,slip,p,v,x,y,z,xr,av,ar,pObject,sObject,mp: real;
procedure Write4(n: real);
begin
if n=0 then write(' ') else Write(Format('%4.0f',n));
end;
BEGIN
tp := 0; {set Target Price Objective as a percent
increase, 0 = none}
sl := 0; {set Stop Loss protection as a percent loss, 50
= exit down 50%}
sa := 22; {start with account #}
ta := 23; {end with account #}
ex := 0; {force exit after this many trade days,
typically 5 days per week}
mp := -10; {entry price can be a maximum percent above signal price}
slip:=5; {ask price slippage as a percent, 10% = 50
cents on a $5 stock}
dl := 5000; {dollar amount invested per trade}
Output(eClear); DimArray(2500); for i:=0 to 2500 do SetArray(i,0);
pObject:=dl*tp/100; sObject:=dl*sl/100; bShow:=((sa+10)>ta);
Writeln(Format('TARGET gain =%3.0f',tp),'%',Format('
$%5.0f',pObject));
Writeln(Format('STOP loss =%3.0f',-sl),'%',Format('
$%5.0f',sObject));
Writeln(Format('LIMIT entry =%3.0f',mp),'%');
Writeln(Format('SLIPPAGE =%3.0f',slip),'%');
Writeln(Format('TIME out =%3.0f trading days',ex)); if
ex=0 then ex:=10000;
twCount:=0; tsCount:=0; toCount:=0; tfCount:=0; tnCount:=0;
twDays:=0; tsDays:=0; toDays:=0; tfDays:=0;
twRate:=0; tsRate:=0; toRate:=0; tfRate:=0;
tfValue:=0; toValue:=0;
for m := sa to ta do begin Writeln(); inc(nAccounts);
{--loop accounts--}
sList.LoadFromFile(sPath+'Accounts\Account.'+IntToStr(m));
Writeln(Copy(sList.strings[1],3,30),' Account #',m);
if bShow then Writeln(
'Symbol Signal %Up Close Open Entry Target
Last Days Value Rate Watch');
wCount:=0; sCount:=0; oCount:=0; fCount:=0; nCount:=0;
wDays:=0; sDays:=0; oDays:=0; fDays:=0;
wRate:=0; sRate:=0; oRate:=0; fRate:=0;
oValue:=0; fValue:=0;
for i:=3 to pred(sList.Count) do begin
s:=sList.strings[i];
exitDate:=Trim(GetToken(8,s,#44));
symbol:=Trim(GetToken(3,s,#44));
if length(symbol)>0 then begin
if bShow then ChartReplace(symbol) else ChartLoad(symbol);
entryDate:=Trim(GetToken(6,s,#44));
k:=StringToDate(entryDate)-19000000;
signalDate:=Bar(eIndex,k); b:=False; bPosition:=false;
if signalDate<BarEnd then
openPrice:=Open(signalDate+1)/100
else openPrice:=Last(signalDate)/100;
signalprice:=Last(signalDate)/100;
entryprice:=signalprice*(1+slip/100);
maxPrice:=signalPrice*(1+mp/100);
if entryPrice>maxPrice then EntryPrice:=MaxPrice;
stopLossPrice:=entryPrice*sl/100;
{-- STOP at % of EntryPrice--}
if tp=0 then targetPrice:=9999999
else targetPrice:=entryPrice*((tp/100)+1); {-- TARGET
at % of EntryPrice--}
if tp=0 then tPrice:=' '
else tPrice:=Align(targetPrice,7);
p:=(Last(signalDate)-Last(signalDate-1))/Last(signalDate-1)*100;
if bShow then
Write(Align(symbol,5),Align(entryDate,9),Format('%4.0f',p),
Align(Last(signalDate)/100,6),Align(OpenPrice,6));
{ if bShow then begin}
{ Remove(eArrow);}
{ AddLine(eArrow,112,signalDate+1,entryPrice*100);}
{ AddLine(eArrow,116,signalDate+1,targetPrice*100);}
{ AddLine(eArrow,116,signalDate+1,stopLossPrice*100);}
{ end;}
for j:=signalDate+1 to BarEnd do
begin {--find entry and exit --}
if not bPosition then begin
if (Open(j)*(1+slip/100)/100)<=maxPrice then
begin
entryPrice:=Open(j)*(1+slip/100)/100;
bPosition:=true; b:=true;
end
else if (Low(j)*(1+slip/100)/100)<=maxPrice
then begin
entryPrice:=maxPrice; bPosition:=true;
b:=true;
end;
end;
if b then begin
vi:=1000-BarEnd+j; SetArray(vi,vArray(vi)+1);
v:=(Last(j)/100-entryPrice)/entryPrice*dl;
SetArray(vi+500,vArray(vi+500)+v);
end;
if b and (Low(j)<=stopLossPrice*100) then
begin {-- test for STOP out --}
n:=j-signalDate-1; if n<1 then n:=1; b:=False;
inc(sCount); sDays:=sDays+n; z:=n; if z<5 then
z:=5;
sRate:=sRate+sObject/z;
for z:=vi+501 to 1500 do
SetArray(z,vArray(z)-sObject);
if bShow then
writeln(Align(entryPrice,6),tPrice,' ',
Copy(DateToString(Bar(eDate,j)),1,5),
Format(' %3.0f
<STOP>%6.0f',n,-sObject/n));
end;
if High(j)>20000 then writeln('>>>>
'+symbol+' <<<< Possible Bad Data')
else
if b and (High(j)>targetPrice*100) then
begin {-- price TARGET reached --}
n:=j-signalDate-1; if n<1 then n:=1; b:=False;
inc(wCount); wDays:=wDays+n; z:=n; if z<5 then
z:=5;
wRate:=wRate+pObject/z;
y:=trunc(n/5); SetArray(y,vArray(y)+1);
for z:=vi+501 to 1500 do
SetArray(z,vArray(z)+pObject);
if bShow then
writeln(Align(entryPrice,6),tPrice,' ',
Copy(DateToString(Bar(eDate,j)),1,5),
Format(' %3.0f
Winner%6.0f',n,pObject/n));
end;
if b and ((j-SignalDate)>ex) then
begin {-- test for TIME exits --}
fValue:=fValue+v;
n:=j-signalDate-1; if n<1 then n:=1;
inc(fCount); fDays:=fDays+n; z:=n; if z<5 then
z:=5;
fRate:=fRate+v/z; b:=false;
for z:=vi+501 to 1500 do SetArray(z,vArray(z)+v);
if bShow then Writeln(Align(entryPrice,6),tPrice,
Align(Last(j)/100,6),Format('%5.0f%8.0f%6.0f <TIME>',n,v,v/n));
end;
end; {j bar loop on chart}
if b then begin {-- Watch these, they
are near price targets --}
{ Alert(eSet,stopLossPrice*100);}
{ Alert(eSet,targetPrice*100); }
oValue:=oValue+v;
n:=BarEnd-signalDate-1; if n<1 then n:=1;
inc(oCount); oDays:=oDays+n; z:=n; if z<5 then z:=5;
oRate:=oRate+v/z;
if bShow then
Write(Align(entryPrice,6),tPrice,Align(Last(BarEnd)/100,6),
Format('%5.0f%8.0f%6.0f',n,v,v/n));
if (Last(BarEnd)>=targetPrice*75) and b then begin
n:=100-(Last(BarEnd)/targetPrice);
if bShow then
Writeln(Align('T-'+IntToStr(n)+'%',6)); b:=False;
end;
if (Last(BarEnd)<=stopLossPrice*75) and b then begin
n:=100-(Last(BarEnd)/stopLossPrice);
if bShow then
Writeln(Align('S+'+IntToStr(n)+'%',6)); b:=False;
end;
if b then if bShow then Writeln();
end;
if not bPosition then begin {print
information about missed traded}
inc(nCount); n:=BarEnd-signalDate-1; if n<1 then
n:=1;
v:=(Last(BarEnd)/100-entryPrice)/entryPrice*dl;
if bShow then
writeln(Align(entryPrice,6),tPrice,Align(Last(BarEnd)/100,6),
Format('%5.0f%8.0f%6.0f',n,v,v/n),' <____');
end;
end; {valid symbol}
end; {i symbols in account}
if bShow then Writeln();
twCount:=twCount+wCount; tsCount:=tsCount+sCount;
toCount:=toCount+oCount; tfCount:=tfCount+fCount;
tnCount:=tnCount+nCount;
toValue:=toValue+oValue;
tfValue:=tfValue+fValue;
twDays:=twDays+wDays; tsDays:=tsDays+sDays;
toDays:=toDays+oDays; tfDays:=tfDays+fDays;
twRate:=twRate+wRate; tsRate:=tsRate+sRate;
toRate:=toRate+oRate; tfRate:=tfRate+fRate;
Writeln(Format('Total %4.0f
Objective Amount
Days Rate',
wCount+sCount+oCount+fCount+nCount));
if nCount>0 then Writeln(Format('%5.0f No Trades',nCount));
if wCount>0 then
Writeln(Format('%5.0f Winners @ $%5.0f
=%11.0f %5.0f %7.0f',
wCount,pObject,wCount*pObject,wDays/wCount,wRate/wCount));
if sCount>0 then
Writeln(Format('%5.0f Stop Outs @ $%5.0f
=%11.0f %5.0f %7.0f',
sCount,-sObject,-sCount*sObject,sDays/sCount,-sRate/sCount));
if fCount>0 then
Writeln(Format('%5.0f Time Outs value
=%11.0f %5.0f %7.0f',
fCount,fValue,fDays/fCount,fRate/fCount));
if oCount>0 then
Writeln(Format('%5.0f Open Positions value =%11.0f
%5.0f %7.0f',
oCount,oValue,oDays/oCount,oRate/oCount));
z:=wCount+sCount+oCount+fCount;
if z>0 then x:=(wRate+sRate+oRate+fRate)/z else x:=0;
tRate:=tRate+x; z:=wCount*pObject-sCount*sObject+oValue+fValue;
Writeln(Format('
TOTAL $%11.0f Rating=%5.0f',z,x));
end; {m all accounts}
Writeln();
Writeln(
'SUMMARY
------------------------------------------------------------------------');
Writeln('');
Writeln(Format('Total %4.0f
Objective Amount
Days Rate',
twCount+tsCount+toCount+tfCount+tnCount));
x:=twCount*pObject; y:=-tsCount*sObject; z:=x+y+toValue+tfValue;
if tnCount>0 then Writeln(Format('%5.0f No Trades',tnCount));
if twCount>0 then
Writeln(Format('%5.0f Winners @ $%5.0f
=%11.0f %4.0f %7.0f',
twCount,pObject,x,twDays/twCount,twRate/twCount));
if tsCount>0 then
Writeln(Format('%5.0f Stop Outs @ $%5.0f
=%11.0f %4.0f %7.0f',
tsCount,-sObject,y,tsDays/tsCount,-tsRate/tsCount));
if tfCount>0 then
Writeln(Format('%5.0f Time Outs value
=%11.0f %5.0f %7.0f',
tfCount,tfValue,tfDays/tfCount,tfRate/tfCount));
if toCount>0 then
Writeln(Format('%5.0f Open Positions value =%11.0f
%4.0f %7.0f',
toCount,toValue,toDays/toCount,toRate/toCount));
Writeln(Format('
TOTAL $%11.0f Rating=%5.0f',z,
tRate/nAccounts));
Writeln('');
Writeln('SIZE of Open Position (weekly)');
Writeln(
'..20..19..18..17..16..15..14..13..12..11..10...9...8...7...6...5...4...3...2...1');
for i:=0 to 19 do Write4(vArray(905+i*5)); Writeln('');
for i:=0 to 19 do Write4(vArray(905+i*5)-vArray(900+i*5)); Writeln('');
Writeln('');
Writeln('VALUE of Account
(weekly)');
Writeln(
'..20..19..18..17..16..15..14..13..12..11..10...9...8...7...6...5...4...3...2...1');
for i:=0 to 19 do Write4(vArray(1405+i*5)/dl); Writeln('');
for i:=0 to 19 do Write4((vArray(1405+i*5)-vArray(1400+i*5))/dl);
Writeln('');
Writeln('');
Writeln('CAPITAL Requirement (weekly)');
Writeln(
'..20..19..18..17..16..15..14..13..12..11..10...9...8...7...6...5...4...3...2...1');
for i:=0 to 19 do Write4(vArray(905+i*5)-vArray(1405+i*5)/dl);
Writeln('');
for i:=0 to 19 do Write4(vArray(905+i*5)-vArray(1405+i*5)/dl-
vArray(900+i*5)+vArray(1400+i*5)/dl); Writeln('');
if tp>0 then begin
Writeln('');
Writeln('WEEK target was reached');
Writeln(
'...1...2...3...4...5...6...7...8...9..10..11..12..13..14..15..16..17..18..19..20');
for i:=0 to 19 do Write4(vArray(i)); Writeln('');
end;
END;
|