[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] Re: Problem using MA whe computing Composite Indicator - SCORE!



PureBytes Links

Trading Reference Links

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