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

[amibroker] writing a pyrapoint script with AFL?



PureBytes Links

Trading Reference Links

Hi,

With the following code, it takes me over 40 minutes to run a 
database of 700 tickers. This code calculates 2 ratings, one for 
stocks and one for indices.

Can anyone suggest some good ways to reduce the runtime ?

TIA.
Charles

/*
** Price Relative Strength Ranking
**
*/

// use this function to calculate self relative strength
// The funciton takes care of stocks with several quote length
// It returns the calculated relative strength array
function selfRelStrength (myArray)
{
	sRelStren = IIf((IsNull(ROC(myArray, 260)) == False), 	
	
						ROC(myArray, 
260) + ROC(myArray, 195) + ROC(myArray, 130) + 2 * ROC(myArray, 65),
							
		IIf (	(IsNull(ROC(myArray, 195)) == False), 
	
							
	 ROC(myArray, 195) + 2 * ROC(myArray, 130) + 2 * ROC
(myArray, 65),					
							
	 2 * ROC(myArray, 130) + 3 * ROC(myArray, 65) ));	
	

	return sRelStren;
}


//replace your watchlist number with 0
//list = CategoryGetSymbols( categoryWatchlist, 0 );
list = CategoryGetSymbols( categoryMarket , 0 ) + CategoryGetSymbols
( categoryMarket , 1 );


Count = 0;
rank = 0;
relval = 0;
n = 0;

CountIdx = 0;
rankIdx = 0;
relvalIdx = 0;
nIdx = 0;

// price change for the current symbol
OwnVal = selfRelStrength(C);
 
for( i = 0; ( sym = StrExtract( list, i ) ) != ""; i++ )
{
	
	SetForeign(sym);

	if (IsIndex()) {
		relValIdx	= Nz(selfRelStrength(C));

		RestorePriceArrays();

		nIdx 	  	= Nz(IIf(relValIdx != 0, 1, 0));
		// count if there is a price change

		// now, add up counts for all symbols with price 
change in the specified period
		CountIdx = CountIdx + nIdx;

		rankIdx = IIf (relValIdx > OwnVal, rankIdx + 1, 
rankIdx);
	}
	else {
	
		relVal	= Nz(selfRelStrength(C));

		RestorePriceArrays();

		n 	  	= Nz(IIf(relVal != 0, 1, 0));
		// count if there is a price change

		// now, add up counts for all symbols with price 
change in the specified period
		Count = Count + n;

		rank = IIf (relVal > OwnVal, rank + 1, rank);
	}
}

rankPerc = int(100 * (Count - rank) / Count);

rankPercIdx = int(100 * (CountIdx - rankIdx) / CountIdx);

// filter out any stocks that dont have recent quotes (1 month)
// this is done via comparing with $compx
CurrentDay = Now(3);		// get system date with dateNum 
format
CurrDayAgo = CurrentDay - 100;

LastDay = LastValue(DateNum());

// donot rank DATAONLY tickers (in Market #3)
Filter = (CurrDayAgo <= LastDay) AND (MarketID() != 3);

if (Status("action") == 4) {
// code running in exploration
SetOption("nodefaultcolumns", True );
AddTextColumn(Name(),"Ticker");
AddColumn(Close,"Close", 1.2);
// AddColumn(Count,"count", 1.0);
AddColumn(rank,"rank#", 1.0);

AddColumn(Ownval,"Perf",1.2);
AddColumn(rankPerc,"rank%",1.0);
AddTextColumn(IndustryID(1),"Industry");

AddColumn(rankIdx,"rankIdx#", 1.0);
AddColumn(rankPercIdx,"rankIdx%",1.0);
}




------------------------ Yahoo! Groups Sponsor --------------------~--> 
Yahoo! Domains - Claim yours for only $14.70
http://us.click.yahoo.com/Z1wmxD/DREIAA/yQLSAA/GHeqlB/TM
--------------------------------------------------------------------~-> 

Check AmiBroker web page at:
http://www.amibroker.com/

Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
Yahoo! Groups Links

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

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