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

[amibroker] Re: any ideas to reduce runtime for the price RS ranking code?



PureBytes Links

Trading Reference Links

Hermann &  All,

I have tried two differents codes to built an average of top n tickers 
of a watchlist (  looks like a real time composite)
unfortunately the two codes return wrong results.

I have tried your code  and a Tomasz code written with osaka plugin ( 
the formulas are below )
I have reduced  The watchlist zero to 5 tickers and  want the average 
for an idicator of the 3 first tickers for each bar.
I have choosen the RSI ( a positive indicator)
So i can check manually the result

for example the image attached  speak itself for the last bar .

I hope the next pastis.dll will save us... ^_^  ( thanks dingo for all 
these information)




FORMULAS

//////////OSAKA////////////
/*
As for hints: you would do the following:
1. iterate through watch list and store scores (in case of osaka plugin 
osTabSetNumber)
2. find top ranked symbols (this can be done even entriely in AFL as 
Dimitris has shown,
or using Osaka plugin sort capability - osTabSort function)
3. create average from top ranked symbols.
Below is the code that uses Osaka plugin 1.4.

*/

osInitialize();
List = GetCategorySymbols(categoryWatchlist, 0 ); // <-- change wl 
number here
table=osTabCreate();
// setup columns
osTabAddColumn( "Ticker", 2, table, 25 );
for( j = 0; j < BarCount; j++ )
{
osTabAddColumn( "Score"+j, 1, table );
osTabAddColumn( "Close"+j, 1, table );
}
// CALCULATING SCORES and saving them to the table
for(i=0; ( ticker = StrExtract( List, i ) ) != ""; i++)
{
SetForeign(ticker);
osTabSetString( ticker, i, 0, table );
score = RSIa(C,14); // YOUR SCORE CALCULATION HERE
for( j = 0; j < BarCount; j++)
{
osTabSetNumber( abs( Nz( score[ j ] ) ), i, 2 * j + 1, table );
osTabSetNumber( Close[ j ], i, 2 * j + 2, table ); // for calculation of 
average
}
}
// you can export for debugging
// osTabExport( "test.csv", ",", table );
// SORTING SCORES AND finding top ranks:
average = 0; // init avarage
for( j = 0; j < BarCount; j++)
{
osTabSort( table, 2 * j + 1, False );
average[ j ] = 0;
topnum = 3; // TOPNUM
for( k = 0; k < topnum ; k++ ) //
{
fc = osTabGet( k, 2 * j + 2, table );
average[ j ] = average[ j ] + fc;
}
average[ j ] = average[ j ]/topnum; // calculate average from top N 
symbols at given bar
}
osTabDelete( table );
Filter=1;
AddColumn(average, "AVG top10 (each bar different)" );
Plot( average, "AVG top10 (each bar different)", colorRed );

///////////END OSAKA //////////////////////////


///////////////HERMAN/////////////////
function GetScore( )
 {
 return RSIa(C,14); // Substitute your function
 }
 
function padString( InString, Length )
 {
 SpaceFill = "          ";
 SL = StrLen(InString);
 NS=StrLeft(SpaceFill, Length-SL);
 return NS+Instring;
 }
 
procedure getPositionScores( WatchList, BarNum, NumTickers )
 {
 TickerList= GetCategorySymbols( categoryWatchlist, WatchList);
 CurrentTicker = Name();
 TickerScoreList = "";
 
 // Create Scores array
 for( n=0; (Ticker=StrExtract( TickerList, n)) != ""; n++)
  {
  SetForeign(Ticker);
  TickerScores[n] = LastValue(ValueWhen(BarIndex() == BarNum, 
SelectedValue(GetScore())));
  TickerIndex[n] = n;
  }
 
 TickerCount= n;
 
 // Sort Tickers by rank
 for(i = n; i>=0; i--)
  {
  for (j = 1; j <= i; j++)
   {
   if (TickerScores[j-1] > TickerScores[j])
    {
    temp = TickerScores[j-1]; TickerScores[j-1] = TickerScores[j]; 
TickerScores[j] = temp;
    temp = TickerIndex[j-1]; TickerIndex[j-1] = TickerIndex[j]; 
TickerIndex[j] = temp;
    }
   }
  }
 
 TopTickerList  = TopTickerNum = TopTickerScore = "";
 i=0; P=10; TopComposite = 0;
 if( NumTickers > TickerCount ) NumTickers = TickerCount;
 
 // Format Top numTickers and create composite
 for(n=TickerCount; n>=TickerCount-NumTickers; n--)
  {
  T5[i++] = TickerIndex[n];
  TopTickerList = TopTickerList + 
PadString(StrExtract(Tickerlist,T5[i-1]),P)+",";
  TopTickerScore = TopTickerScore + 
PadString(NumToStr(TickerScores[n],1.3),P)+",";
  TopTickerNum = TopTickerNum + 
PadString(NumToStr(TickerIndex[n],1.0),P)+",";
  TopComposite = TopComposite + getScore();
  }
 
 VarSet("TopComposite",TopComposite/numtickers);
 StaticVarSetText("TopTickerList",TopTickerList);
 StaticVarSetText("TopTickerScore ",TopTickerScore );
 StaticVarSetText("TopTickerNum ",TopTickerNum );
 }
 
WatchList = Param("WatchList",0,0,1,1);
BarNum = SelectedValue(BarIndex());
NthScore = Param("Nth TickerDown",3,0,100,1);
// TOPNUM
getPositionScores( WatchList, BarNum, NthScore );
TopTickerScore =StaticVarGet("TopTickerScore ");
TopTickerList=StaticVarGet("TopTickerList");
TopTickerNum =StaticVarGet("TopTickerNum ");
Plot(VarGet("TopComposite") ,"",2,1);
 
Title =
TopTickerList + "\n"+
TopTickerScore + "\n"+
TopTickerNum + "\n"+
"Number "+NumToStr(NthScore+1,1.0)+" from the Top: 
"+StrExtract(TopTickerList ,NthScore);
//////////////////END HERMAN/////////////////////////////




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