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

[amibroker] Re: Simple Programming Language Question



PureBytes Links

Trading Reference Links

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

<*> 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/