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

RE: [amibroker] Re: Simple Programming Language Question



PureBytes Links

Trading Reference Links

Mike:

How very generous of you to take the time to do this.
It works just as you say, and this will be a great learning tool for me.
I told someone I did not see how to convert the Gfx code to an explore
because I kept visualizing "symbols" down the first column; you made "Years"
into a pseudo symbol of sorts and showed me how this could be done.

This is not all that I need to do and the code is thus insufficient for my
ultimate purposes, although it may provide the calculations I need.

In msg http://finance.groups.yahoo.com/group/amibroker/message/125800
I share some code which allows other monthly stats to be developed.  I have
expanded these kinds of stats and it looks like a handy way to rank systems
which select stocks/funds vs indeces.  My problem is that my code is not
calculating the monthly percent gains correctly (especially the first month
when the data series starts), and I have tried a variety of calculation
approaches to get the right value.   I was hoping that I could convert the
methodology in TJs Gfx code to my calculation needs.  Your code translation
may help me.  I still need an array of monthly gains so I can count the
number that are up, number down, avg up month, avg down month, etc., etc.

In any case, I appreciate your help and it will give me new learning.
Ken 

-----Original Message-----
From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
Of Mike
Sent: Friday, June 27, 2008 5:54 AM
To: amibroker@xxxxxxxxxxxxxxx
Subject: [amibroker] Re: Simple Programming Language Question

Ken,

The following code should give you a good head start. It will produce an
exploration very similar to what the table option would have generated in
Tomasz's original graphics code.

A few notes on the code:

- I have not tested it for correctness, so be sure to test it out before
accepting the results. At a minimum, I believe that the concepts should all
be there.

- The code works on any single symbol. Select the "current symbol" in the
"Apply To" of the AA, enter any "from: to:" range spanning at least 2 days
(or "n last days" with a value >= 2) then click Explore.

- For consistency, I have left the majority of Tomasz's logic in place.
However, you could probably get rid of the static variables entirely and
just immediately populate the arrays for Years, months, Annual in the same
loop that the static values would otherwise be calculated.

- You will need the most recent beta release for the AddSummaryRows function
to work (just remove this line if you are not up to that release).

- There is a bug in the implementation of AddSummaryRows such that the
column total is always divided by the number of rows (when calculating
average), even if some of those rows have NULL values. 
Ideally, rows with null values should not be included in the denominator
when calculating the average (as is the case in Excel). 
Therefore, to truely get the same results as Tomasz's original work, you
will need to track the number of non null values for each month array and do
the division yourself rather than relying upon AddSummaryRows.

Mike

--------

eq = Close;

yr = Year();
mo = Month();

YearChange = yr != Ref( yr, -1 );
MonChange = mo != Ref( mo, -1 );

FirstYr = 0;
LastYr = 0;

startbar = 0;
endbar = 0;

FirstBar = Status("firstbarinrange");
LastBar = Status("lastbarinrange");

////////////////////////////
// SKIP non-trading bars
////////////////////////////
for( i = 0; i < BarCount; i++ )
{
  if( FirstBar[ i ] )
  {
    startbar = i;
  }
  if( LastBar[ i ] )
  {
    endbar = i;
    break;
  }
}


////////////////////////////
// collect yearly / monthly changes in symbol // into dynamic variables
////////////////////////////

LastYrValue = eq[ startbar  ];
LastMoValue = eq[ startbar  ];

MaxYrProfit = MinYrProfit = 0;
MaxMoProfit = MinMoProfit = 0;

for( i = startbar + 1; i <= endbar; i++ ) {
  if ( YearChange[ i ] || i == endbar )
  {
    Chg = 100 * ( -1 + eq[ i ] / LastYrValue );
    VarSet("ChgYear"+ yr[ i - 1 ], Chg );

    MaxYrProfit = Max( MaxYrProfit, Chg );
    MinYrProfit = Min( MinYrProfit, Chg );

    if( FirstYr == 0 ) FirstYr = yr[ i - 1 ];
    LastYr = yr[ i ];

    LastYrValue = eq[ i ];
  }

  if( MonChange [ i ] || i == endbar )
  {
    mon = mo[ i - 1 ];

    Chg = 100 * ( -1 + eq[ i ] / LastMoValue );

    VarSet("ChgMon" + yr[ i - 1 ] + "-" + mon, Chg );
    VarSet("SumChgMon"+ mon, Chg + Nz( VarGet("SumChgMon"+ mon ) ) );
    VarSet("SumMon" + mon, 1 + Nz( VarGet("SumMon"+ mon ) ) );
 
    MaxMoProfit = Max( MaxMoProfit, Chg );
    MinMoProfit = Min( MinMoProfit, Chg );

    LastMoValue = eq[ i ];
  }
}

////////////////////////////
// Transfer dynamic variable values into arrays and add to exploration.
////////////////////////////

Years = 0;
Jan = Feb = Mar = Apr = May = Jun = Jul = Aug = Sep = Oct = Nov = Dec = 0;
Annual = 0; index = startbar;

for ( y = FirstYr; y <= LastYr; y++ )
{
  Years[ index ] = y;
  Jan[ index ] = VarGet("ChgMon" + y + "-" + 1);
  Feb[ index ] = VarGet("ChgMon" + y + "-" + 2);
  Mar[ index ] = VarGet("ChgMon" + y + "-" + 3);
  Apr[ index ] = VarGet("ChgMon" + y + "-" + 4);
  May[ index ] = VarGet("ChgMon" + y + "-" + 5);
  Jun[ index ] = VarGet("ChgMon" + y + "-" + 6);
  Jul[ index ] = VarGet("ChgMon" + y + "-" + 7);
  Aug[ index ] = VarGet("ChgMon" + y + "-" + 8);
  Sep[ index ] = VarGet("ChgMon" + y + "-" + 9);
  Oct[ index ] = VarGet("ChgMon" + y + "-" + 10);
  Nov[ index ] = VarGet("ChgMon" + y + "-" + 11);
  Dec[ index ] = VarGet("ChgMon" + y + "-" + 12);
  Annual[ index ] = VarGet("ChgYear" + y );

  index++;
}

Filter = Years;

SetOption("NoDefaultColumns", true);
AddColumn(Years, "Year", 4.0);
AddColumn(Jan, "Jan%", 1.1);
AddColumn(Feb, "Feb%", 1.1);
AddColumn(Mar, "Mar%", 1.1);
AddColumn(Apr, "Apr%", 1.1);
AddColumn(May, "May%", 1.1);
AddColumn(Jun, "Jun%", 1.1);
AddColumn(Jul, "Jul%", 1.1);
AddColumn(Aug, "Aug%", 1.1);
AddColumn(Sep, "Sep%", 1.1);
AddColumn(Oct, "Oct%", 1.1);
AddColumn(Nov, "Nov%", 1.1);
AddColumn(Dec, "Dec%", 1.1);
AddColumn(Annual, "Yr. Profit%", 1.1);
AddSummaryRows(2);



--- In amibroker@xxxxxxxxxxxxxxx, Ken Close <ken45140@xxx> wrote:
>
> Thanks for the translation...
> 
> Here is the code portion for just the calculations in his Profit
Table
> example.  I would like to turn this into an Exploration (and not a
gfx
> graphical display).  I am darned if I have found where to put in
some
> AddColumn statements (and whatever else in order to make an
Exploration, by
> days, which has a yearly change column and a monthly change
column.)  Not
> asking anyone to show me how to do it (I will succeed, I will
succeed,....)
> but it is interesting code that I am sure some of you understand in
a blink,
> but not me...Been working on this for several days now...
> 
> SetBarsRequired(1000000,1000000);
> //eq = Foreign("~~~EQUITY", "C" );
> eq = Foreign("AGEQT", "C");
> yr = Year();
> mo = Month();
> 
> YearChange = yr != Ref( yr, -1 );
> MonChange = mo != Ref( mo, -1 );
> 
> FirstYr = 0;
> LastYr = 0;
> 
> startbar = 0;
> 
> ////////////////////////////
> // SKIP non-trading bars
> ////////////////////////////
> for( i = 0; i < BarCount; i++ )
> {
>   if( eq[ i ] )
>   {
>     startbar = i;
>     break;
>   }
> }
> 
> ////////////////////////////
> // collect yearly / monthly changes in equity // into dynamic 
> variables ////////////////////////////
> 
> LastYrValue = eq[ startbar  ];
> LastMoValue = eq[ startbar  ];
> 
> MaxYrProfit = MinYrProfit = 0;
> MaxMoProfit = MinMoProfit = 0;
> 
> for( i = startbar + 1; i < BarCount; i++ ) {
>   if( YearChange[ i ] || i == BarCount - 1 )
>   {
>     Chg = 100 * ( -1 + eq[ i ] / LastYrValue );  < < < < < Year's
change
>     VarSet("ChgYear"+ yr[ i - 1 ], Chg );
> 
>     MaxYrProfit = Max( MaxYrProfit, Chg );
>     MinYrProfit = Min( MinYrProfit, Chg );
> 
>     if( FirstYr == 0 ) FirstYr = yr[ i - 1 ];
>     LastYr = yr[ i ];
> 
>     LastYrValue = eq[ i ];
>   }
> 
>   if( MonChange [ i ] || i == BarCount - 1 )
>   {
>     mon = mo[ i - 1 ];
> 
>     Chg = 100 * ( -1 + eq[ i ] / LastMoValue );   < < < < < < 
Months change 
> 
>     VarSet("ChgMon" + yr[ i - 1 ] + "-" + mon, Chg );
>     VarSet("SumChgMon"+ mon, Chg + Nz( VarGet("SumChgMon"+
mon ) ) );
>     VarSet("SumMon" + mon, 1 + Nz( VarGet("SumMon"+ mon ) ) );
>  
>     MaxMoProfit = Max( MaxMoProfit, Chg );
>     MinMoProfit = Min( MinMoProfit, Chg );
> 
>     LastMoValue = eq[ i ];
>   }
> }
> 
> -----Original Message-----
> From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]
On Behalf
> Of dingo
> Sent: Thursday, June 26, 2008 4:51 PM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: RE: [amibroker] Re: Simple Programming Language Question
> 
> Looks to me like he's saying "if the year has changed" or "we're at
the end
> of the data .."
> 
> d
> 
> > -----Original Message-----
> > From: amibroker@xxxxxxxxxxxxxxx
> > [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of Ken Close
> > Sent: Thursday, June 26, 2008 4:05 PM
> > To: amibroker@xxxxxxxxxxxxxxx
> > Subject: RE: [amibroker] Re: Simple Programming Language Question
> > 
> > Thanks for the confirmation.
> > The statement makes less sense to me now. 
> >   > if( YearChange[ i ] || i == BarCount - 1 ) Oh, well....
> > 
> > -----Original Message-----
> > From: amibroker@xxxxxxxxxxxxxxx
> > [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of sidhartha70
> > Sent: Thursday, June 26, 2008 12:40 PM
> > To: amibroker@xxxxxxxxxxxxxxx
> > Subject: [amibroker] Re: Simple Programming Language Question
> > 
> > Ken,
> > 
> > You are correct in that it is,
> > 
> > IF YearChange(i)    OR   i equals BarCount -1 
> > 
> > the || = OR
> > 
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "Ken Close" <ken45140@> wrote:
> > >
> > > Middle or high level AFL program folks (like me) should not mess
> > around in
> > > the low level area...
> > >  
> > > That said, can someone help me with this simple question.
> > >  
> > > What does the double pipe symbol mean in a comparison statement?
> > >  
> > > Two on-line references say it is an OR function
> > >  
> > > But what does this line from the ProftiTable.afl that
> > Tomasz wrote mean:
> > >  
> > > if( YearChange[ i ] || i == BarCount - 1 )
> > > 
> > > Is this IF YearChange(i)    OR   i equals BarCount -1   ???
> > > 
> > > It hardly makes sense if this is correct.
> > > 
> > > I thought it means If YearChange(i) is not equal to BarCount -1,
> > saying the
> > > if function is executed when this happens.
> > > 
> > > Any help?   Thanks.
> > > 
> > > Ken
> > >
> > 
> > 
> > 
> > ------------------------------------
> > 
> > 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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> > http://www.amibroker.com/devlog/
> > 
> > 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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> > http://www.amibroker.com/devlog/
> > 
> > For other support material please check also:
> > http://www.amibroker.com/support.html
> > Yahoo! Groups Links
> > 
> > 
> > 
> > No virus found in this incoming message.
> > Checked by AVG. 
> > Version: 8.0.101 / Virus Database: 270.4.1/1521 - Release
> > Date: 6/26/2008 11:20 AM
> > 
> 
> 
> ------------------------------------
> 
> 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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
> 
> 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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/