Hello,
In the past division by zero was trapped and
infinity was replaced by zero just to handle such cases. This
prevented
from most problems caused by division by zero but
as someone noted it was "politically incorrect" (:-), because
division by zero by math should lead to infinity.
So for formal reasons I removed this infinity->zero
trap but then users are on their own trapping
division by zero.
Since then I am always thinking of re-introducing
this trap (as a user switch) because it really made
things simpler.
Best regards, Tomasz
Janeczko amibroker.com
----- Original Message -----
Sent: Friday, September 02, 2005 1:21
AM
Subject: Re: [amibroker] Re: Problem
using MA whe computing Composite Indicator - SCORE!
Tomasz,
Excellent information! This helps tremendously.
This is what I like about AB...
I strongly believe a product's quality is only partly measured
by it's features and functions. Since every product on the
planet has it's ideosyncracies, the TRUE measure of a
product's overall quality is the support that you get and whether it
allows you to work around the ideosyncracies to achieve your
goals. This is what makes AmiBroker truly superior!!!
Many thanks and regards,
Dan.
--------------
Original message -------------- Hello,
As to why non-MA
version did not choke: well if you add Null to some other numbers via
AddToComposite it will treat Null value as zero automatically (there
is a special "if" check for this inside AddToComposite). But when
you pass some +/-infinity or Null in the middle of Moving Average then it
will be treated as -1e10 (this is "magic" null value) and you will end up
having weird numbers. This is so because Moving Averages expects Nulls
only at the beginning of the array (that may be there due to result of
other averages or functions requiring some "setup" bars). Such null
values at the beginning are skipped. But once first non-null value is
encountered then smoothing begins and it does not expect infinite/null
values in the middle of the run.
Best regards, Tomasz
Janeczko amibroker.com ----- Original Message ----- From:
"danclark_public" <dan_public@xxxxxxxxxxx> To:
<amibroker@xxxxxxxxxxxxxxx> Sent: Thursday, September 01, 2005
11:44 PM Subject: [amibroker] Re: Problem using MA whe computing
Composite Indicator - SCORE!
> Joe, > > You were
dead-on!!!!!! Using "Nz()" solved it! (Now why the
MA > version choked and the non-MA version did not choke is another
> issue. I'm still clueless on that one.) >
> I very much appreciate your feedback and TJ's feedback. Your
> solution nailed it and TJ's suggestions should help keep me out of
> trouble in the future. > > Best Regards, >
> Dan. > > > > > --- In
amibroker@xxxxxxxxxxxxxxx, "Joe Landry" <jelandry@xxxx>
wrote: >> Hello Dan - Is it possible that you're dividing by zero
in the > statement for CloseLocValue, say for some of the
tickers? >> Possibly using the Nz function ?
like NZ(( (C - TrueLow)-( > TrueHigh -
C) ) / (TrueHigh - TrueLow)) >> >>
CloseLocValue
= ( (C - TrueLow)-( TrueHigh - C) ) / >
(TrueHigh - TrueLow) >> >> Or as one of my friends does
in a moving average routine - he > checks to see if the ticker
is empty and puts in a NULL. >> >> >>
ticker = Foreign(member, "Close"); >>
gainfactor = IIf(IsEmpty(Ref(ticker, -1)), Null, ROC(ticker,
> 1) / 100); >> >> and later as he's accumulating
both the count and the gainfactor > he checks again and makes sure
it's a zero that's added >> in both the count of tickers and in the
accumulated value used in > the average calculation.
>> >> gaintotal = gaintotal +
IIf(IsEmpty(gainfactor), 0, gainfactor); >>
count = count + IIf(IsEmpty(gainfactor), 0,
1); >> >> Just some suggestions where I've run aground
before in > accumulating composites. >> >>
JOE >> >> ----- Original Message -----
>> From: Dan Clark >> To:
amibroker@xxxxxxxxxxxxxxx >> Sent: Wednesday, August
31, 2005 11:14 PM >> Subject: [amibroker] Problem using
MA whe computing Composite > Indicator >> >>
>> Hi, >> >>
>> >> I'm trying to create a Composite Index
and am having a major > problem. I'd appreciate any help
you can give. I hope it's just > a simple user
error. >> >> >>
>> I'm trying to create a Money Flow-related composite
indicator on > Sectors using AddToComposite. It is similar to
the AD line, but > also includes a money amount. Other
than being a little "twitchy", > the basic code works GREAT!
That is, until I add a 3 period, simple > MA on the base stock data
to smooth it out a bit. >> >>
>> >> You would expect an MA to smooth out
the data. However, when I > added a simple MA on the
stock-level data, the data went crazy. > For
example, the "Amount" histogram bars of the Materials Sector DMF >
(the "~DMF_USSEC_Materials") varies between positive 2 million >
dollars to negative 3 million dollars. That's fine. With a
3MA on > the base data, we would expect smoothed data. Instead
the 3MA > Sector data the ("~DMF3_USSEC_Materials") varies between
about minus > 900 million dollars to minus 20 billion
dollars! >> >> >>
>> Below is a test Composite Scan that creates the
Composite Sector > DMF index. I've colored the key code in
red. As you can see, the > only difference between the "Good"
symbols and the "Bad" symbols is > a 3 period smoothing
MA. >> >> >>
>> Just above the Scan code is Chart code that
displays the values > correctly. >>
>> >> >> Note
that I'm using QuotesPlus data, but this should work with > other
data vendors as well. Also, note that the scan stuffs the >
resulting symbols into WatchList 44. I've assigned this to
> the "WLTest" variable. >> >>
>> >> To reproduce the error, >>
>> >> >>
1) Create a new chart showing price
bars. >> >>
2) Add the Chart code to the
Chart. >> >>
3) Paste the Composite Scan Code into an
AFL window and > save it to an AFL file. >>
>> 4) Run an
exploration using "All Symbols" and Range = "1" > last
days. >> >>
5) Navigate to Watch List 44 in the
Workspace and click on > the "~DMF_USSEC_Materials". The
symbols should display a valid > chart. >>
>> 6) Now click on
the 3MA symbol - > "~DMF3_USSEC_Materials". Data now looks
bad. >> >> >>
>> I hope this is just a dumb error on my part.
I've tried about > 20 different solutions and nothing changes the
result. I'd > appreciate any help. >>
>> >> >> Best
regards, >> >> >>
>> Dan. >> >>
>> >> >>
>> Chart Code: >> >> if
(StrLeft(Name(), 4) == "~DMF") >>
>>
{ >>
>>
DMFAmt
=
C
; >>
>>
DMFVolume
=
V
; >>
>>
DMFCount
=
OI
; >> >> >>
>>
Plot(DMFAmt, "DMF Amt", IIf(DMFAmt > 0, colorLime, > colorRed),
styleHistogram); >>
>>
Plot(DMFAmt, "DMF Amt", IIf(DMFAmt > 0, colorLime, > colorRed),
styleLine ); >>
>>
Plot(DMFCount, "DMF Count", colorCustom1, styleLine | >
styleOwnScale); >>
>>
} >> >> else >>
>>
{ >>
>> Plot( C,
"Close", IIf( C > O, ParamColor("Up Color", > colorGreen ),
ParamColor("Down Color", colorRed ) ); >>
>>
} >> >> >>
>> Composite Scan Code: >>
>> // Created by Dan Clark >>
>> >> >>
//Parameters >> >> PriceMin = Param( "Minimum
Price", 3, 1, 100, 1 ); >> >> PriceMax =
Param( "Maximum Price", 60, 1, 1000000, 1 ); >>
>> VolumeMin = Param( "Minimum Volume/1000", 100, 10,
100, 10 ); >> >> >>
>> //Watchlist Numbers >>
>>
WLTest
= 44 ; >> >> >>
>> >> >>
//AddToCompositeFlags >> >>
atcCurrentFlags = atcFlagResetValues +
> atcFlagCompositeGroup + atcFlagEnableInExplore; >>
>> >> >>
>> >> >>
>> //Get group name >>
>> GroupName = GroupID(1); >>
>> >> >> //Init
Utility Variables >> >> >>
>>
SectorSymbol =
NumToStr(SectorID(0), 1.0); >> >>
SectorName
= SectorID(1); >> >>
>> >> >>
>> //Filter the symbols >>
>>
USStock
=
C
>= PriceMin >>
>>
AND
V >=
(VolumeMin * 1000) >>
>>
AND GroupName == "Common Stocks" >>
>>
AND SectorName != "Undefined" >>
>>
; >> >> >>
>> //Set flags >> >>
bUSStock
= USStock[BarCount-1]; >> >>
>> >>
Buy =
0; >> >>
Sell = 0; >>
>> Filter =
USStock; //Buy OR Sell; >> >>
>> >> //Init >>
>> DMFAmtTemp = 0 ;
>> >> DMFVolumeTemp = 0 ; >>
>> DMFCountTemp = 0 ; >>
>> DMFAmt =
0 ; >> >>
DMFVolume = 0 ; >> >>
DMFCount = 0 ; >>
>>
DMF3Amt
= 0 ; >> >>
DMF3Volume = 0 ; >> >>
DMF3Count = 0 ; >> >>
TrueHigh = 0 ; >>
>>
TrueLow
= 0 ; >> >> PriorClose = 0
; >> >> TypicalPrice = 0 ; >>
>> >> >> if
(bUSStock) >>
>>
{ >>
>>
//DMF >>
>> // This
weights the count and the Money Flow (not just > volume) by the
relative position of the close in the True Range >>
>>
PriorClose
= Ref(C, - >
1)
> ; >>
>>
TypicalPrice =
C; //(H + L + C) / >
3
; >>
>>
TrueLow
= L; //IIf( PriorClose > < L, PriorClose, L )
; >>
>>
TrueHigh
= H; //IIf( PriorClose > H, > PriorClose, H )
; >> >> >>
>>
CloseLocValue
= ( (C - TrueLow)-( TrueHigh - > C) ) /
(TrueHigh - TrueLow)
; //Close Location Value > range
from +1 to 0 to -1 >> >> >>
>>
DMFVolume
= CloseLocValue * > (V/1000)
; //Works fine. >>
>>
DMFAmt
= DMFVolume * > TypicalPrice
; //Works fine. >>
>>
DMFCount
= CloseLocValue * >
1 ; //Works
fine. >> >> >>
>>
DMF3Volume
= MA(DMFVolume, >
3) ; //Bad
Data! >>
>>
DMF3Amt
= MA(DMFAmt , >
3) ; //Bad
Data! >>
>>
DMF3Count
= MA(DMFCount , >
3) ; //Bad
Data! >>
>> }
>> >> >>
>> >> >>
>> >> //Add Symbols to USStock Watchlist and
to composite indexes >> >> if
(bUSStock) //Buy[1]) >>
>>
{ >>
>> // Init
Symbols >>
>>
DMFUSMktSym
> =
"~DMF_USMkt";
>>
>>
DMFUSMktName
> =
"~DMF_USMkt";
>> >> >>
>>
DMF3USMktSym
> =
"~DMF3_USMkt";
>>
>>
DMF3USMktName
> =
"~DMF3_USMkt";
>> >> >>
>>
/* >>
>> ** US
Master Indexes >>
>>
*/ >>
>> //creates
DMF >>
>>
AddToComposite(DMF3Amt
, DMF3USMktSym, "C", >
atcCurrentFlags); >>
>>
AddToComposite(DMF3Volume, DMF3USMktSym, "V", > atcCurrentFlags);
>>
>>
AddToComposite(DMF3Count, DMF3USMktSym, "I", >
atcCurrentFlags); >> >> >>
>>
AddToComposite(DMFAmt
, DMFUSMktSym, "C", >
atcCurrentFlags); >>
>>
AddToComposite(DMFVolume, DMFUSMktSym, "V", >
atcCurrentFlags); >>
>>
AddToComposite(DMFCount, DMFUSMktSym, "I", >
atcCurrentFlags); >> >> >>
>>
/* >>
>> ** US
Sector Indexes >>
>>
*/ >>
>>
DMFUSSecSym
= "~DMF_USSec_" + > SectorSymbol; //Advance/Decline line
by sector >>
>>
DMFUSSecName
= "~DMF_USSec_" + >
SectorName;
//Advance/Decline line by sector >> >>
>>
>>
DMF3USSecSym
= "~DMF3_USSec_" + > SectorSymbol; //Advance/Decline line
by sector >>
>>
DMF3USSecName
= "~DMF3_USSec_" + >
SectorName;
//Advance/Decline line by sector >> >>
>> >> >>
>> //creates
DMF by Sector Composite >>
>>
AddToComposite(DMF3Amt
, DMF3USSecSym, "C", >
atcCurrentFlags); >>
>>
AddToComposite(DMF3Volume, DMF3USSecSym, "V", > atcCurrentFlags);
>>
>>
AddToComposite(DMF3Count, DMF3USSecSym, "I", >
atcCurrentFlags); >> >> >>
>>
AddToComposite(DMFAmt
, DMFUSSecSym, "C", >
atcCurrentFlags); >>
>>
AddToComposite(DMFVolume, DMFUSSecSym, "V", >
atcCurrentFlags); >>
>>
AddToComposite(DMFCount, DMFUSSecSym, "I", >
atcCurrentFlags); >> >> >>
>>
>>
>>
/* >>
>> ** Modify
Names >>
>>
*/ >>
>> //Modify
the indices SymbolName >>
>> //
Instantiate Broker.Application >>
>> AB =
CreateStaticObject("Broker.Application"); >>
>> >>
>> cs =
AB.Stocks(DMFUSMktSym); >>
>>
cs.FullName = DMFUSMktName; >> >>
>>
>> cs =
AB.Stocks(DMFUSSecSym); >>
>>
cs.FullName = DMFUSSecName; >> >>
>>
>> cs =
AB.Stocks(DMF3USMktSym); >>
>>
cs.FullName = DMF3USMktName; >> >>
>>
>> cs =
AB.Stocks(DMF3USSecSym); >>
>>
cs.FullName = DMF3USSecName; >> >>
>> >> >>
>>
/* >>
>> ** Add to
Watchlists >>
>>
*/
>>
>> //Add US
Market Indexes >>
>>
CategoryAddSymbol( DMFUSMktSym , categoryWatchlist,
> WLTest); >> >>
>>
>> //Add
Sector Indexes >>
>>
CategoryAddSymbol( DMFUSSecSym , categoryWatchlist, >
WLTest); >> >>
>>
>> //Add US
Market Indexes >>
>>
CategoryAddSymbol( DMF3USMktSym, categoryWatchlist, >
WLTest); >> >>
>>
>> //Add
Sector Indexes >>
>>
CategoryAddSymbol( DMF3USSecSym, categoryWatchlist, >
WLTest); >>
>>
} >> >> >>
>> >> >>
SetOption("NoDefaultColumns", True ); >> >>
AddTextColumn(Name() ,
"Symbol"); >> >>
AddTextColumn(FullName() , "Company"); >>
>>
AddColumn(C
, "Close"); >> >>
AddColumn(V/1000
, "Vol/1000", format = 1.0); >> >>
AddColumn(bUSStock ,
"bUSStock"); >> >> AddColumn(
DMFVolume , "DMFVolume" ,
1.2); >> >> AddColumn(
DMFCount
, "DMFCount" , 1.2); >> >> AddColumn(
DMFAmt , "DMFAmt
" , 1.2); >> >> >>
>> AddColumn(
DMF3Volume
, "DMF3Volume" , 1.2); >> >> AddColumn(
DMF3Count
, "DMF3Count" , 1.2); >> >> AddColumn(
DMF3Amt , "DMF3Amt
" , 1.2); >> >> >>
>>
AddTextColumn(GroupName
, "GroupName"); >> >>
AddTextColumn(SectorSymbol , "SectorSymbol"); >>
>> AddTextColumn(SectorName ,
"SectorName"); >> >>
AddTextColumn(IndustrySymbol ,
"IndustrySymbol"); >> >>
AddTextColumn(IndustryName , "IndustryName"); >> >>
>> >> Please note that this group is for
discussion between users only. >> >> To get
support from AmiBroker please send an e-mail directly to
>> SUPPORT {at} amibroker.com >>
>> For other support material please check
also: >> http://www.amibroker.com/support.html >>
>> >> >> >> >>
------------------------------------------------------------------- >
----------- >> YAHOO! GROUPS LINKS >>
>> a.. Visit your group "amibroker"
on the web. >>
>> b.. To unsubscribe from this
group, send an email to: >>
amibroker-unsubscribe@xxxxxxxxxxxxxxx >>
>> c.. Your use of Yahoo! Groups is
subject to the Yahoo! Terms > of Service. >> >>
>>
------------------------------------------------------------------- >
----------- > > > > > > Please note
that this group is for discussion between users only. > > To
get support from AmiBroker please send an e-mail directly to >
SUPPORT {at} amibroker.com > > For other support material
please check also: > http://www.amibroker.com/support.html >
> > Yahoo! Groups Links > > > >
> > >
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For other support material please check also:
http://www.amibroker.com/support.html
YAHOO! GROUPS LINKS
|