Thought I'd share the following code. 
PS
//Simple 
  application of the new Gfx functions, basically calculating
//the 
  correlation matrix of any WL of choice. You can easily adjust
//this code 
  to move to Var-Covar matrix, etc.
// PS 
  28/05/07
GfxSetOverlayMode(2); // Show Only Matrix
function 
  NrSecs(ListType,ListNr)
{
global 
  NrPosPrices;
if(ListType==1) ExtrList = 
  CategoryGetSymbols
(categoryGroup,ListNr);
else 
  if(ListType==2)ExtrList = 
  CategoryGetSymbols
(categoryWatchlist,ListNr);
else 
  if(ListType==3)ExtrList = 
  CategoryGetSymbols
(categoryIndustry,ListNr);
NrSecurs=0;
NrPosPrices=0;
for( 
  n=0; (Ticker=StrExtract( ExtrList, n))!= ""; 
  n++)
{
NrSecurs=NrSecurs+1;
SetForeign(Ticker);
Prijs=C;
RestorePriceArrays();
NrPosPrices=NrPosPrices+IIf(Prijs!=Null 
  AND 
Prijs>0,1,0);
}
return NrSecurs;
}
function 
  PrintTxtInCell( Str, row, Col, CellWidth, CellHeight, 
HorzAdj, VertAdj, 
  Formaat ) 
{ 
GfxDrawText( Str, Col * CellWidth + HorzAdj, row * 
  CellHeight + 
VertAdj, (Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, 
  Formaat); 
} 
function PrintInCell( val, row, Col, CellWidth, 
  CellHeight, HorzAdj, 
VertAdj ) 
{ 
GfxDrawText( NumToStr(val), 
  Col * CellWidth + HorzAdj, row * 
CellHeight + VertAdj, (Col + 1 ) * 
  CellWidth, (row + 1 ) * 
CellHeight, 1|32|4); 
} 
//CH = 
  Param("CellH",20,10,100,5); 
//CW = 
  Param("CellW",100,10,300,5);
HA=0;
VA=0;
String = "" 
  ;
for ( x = 0 ; x < 200 ; x++ ) 
{ 
WList = CategoryGetName( 
  categoryWatchlist, x );
if (WList != "" )
{
String = String + WList 
  +"," ;
// Creates a list of WatchLists, NOT symbols 
  !!!
}
}
WatchList = ParamList ( "Watch List", String ); 
  
WLnr=CategoryFind(WatchList,categoryWatchlist);
WLSymbols 
  = CategoryGetSymbols(categoryWatchlist,WLnr);
NrSymbs = 
  NrSecs(2,WLNr);
CW= Status("pxwidth")/(NrSymbs+1);// In 
  order to allow Rowheadings
CH = 
  Status("pxheight")/(NrSymbs+1);//Colheadings
//GfxSetTextAlign(6 
  | 24);
RetLB = Param("RetLB",1,1,100);
CorrLB = 
  Param("CorrLB",30,5,256);
Start = 
  BarCount-RetLB;
ActBar = 
  Min(BarCount-1,LastValue(SelectedValue(BarIndex())));
ActD 
  = LastValue(SelectedValue(DateTime()));
GfxSelectFont( "MS 
  Serif", CH/4,800);
PrintTxtInCell( "CorrM 
  @:\n"+NumToStr(ActD,formatDateTime), 0, 0,CW, 
CH, HA, VA, 
  1);
for ( x = 0 ; (Ticker = StrExtract ( WLSymbols, x ))!="" ; x++ ) 
  
{
SetForeign(Ticker);
RetTick = ROC(C,RetLB);
FN = 
  FullName();
RestorePriceArrays();
GfxSelectFont( "MS Serif", 
  CH/4,800);
PrintTxtInCell( Ticker, 0, x+1 ,CW, CH, HA, VA,1|32|4 
  );
GfxSelectPen( colorBlue ); 
for( i = 0; (Ticker2 = StrExtract 
  ( WLSymbols, i))!="" ; i++ )
{
SetForeign(Ticker2);
RetTick2 = 
  ROC(C,RetLB);
FN2 = 
  FullName();
RestorePriceArrays();
if (Ticker2 == Ticker) 
  Corr=1;
else Corr = Correlation(RetTick, RetTick2, 
  CorrLB);
GfxSelectFont( "MS Serif", CH/4,800);
PrintTxtInCell( 
  Ticker2, i+1, 0, CW, CH, HA, 
VA,1|32|4); 
GfxSelectFont( "MS Serif", 
  CH/4);
Kleur = IIf(Corr[ActBar]>=0, 
  colorGreen,colorRed);
GfxSetTextColor(Kleur);
PrintInCell( 
  Corr[ ActBar ], i+1, x+1, CW, CH, HA, 
VA); 
//PrintInCell( Corr[ ActBar 
  ] , i+1, x+1);
GfxSetTextColor(colorBlack);
GfxMoveTo( 0, 
  (i+1) * CH); 
GfxLineTo( (x+2) * CW, (i+1) * CH );// Columns
} 
  
GfxMoveTo( 0, (x+1)*CH); // Move to end of last column
//GfxLineTo( 
  6 * CW, i * CH ); 
}
for( Col = 1; Col < NrSymbs+2; Col++ ) 
{ 
  
GfxMoveTo( Col * CW, 0); 
GfxLineTo( Col * CW, (NrSymbs+1) * CH ); 
  
} 
Title="";