Una buona parte dei software di analisi programmabili per la progettazione dei trading system non possiede un backtesting di portafoglio. Per una parte di questi sono venduti a parte applicativi ad hoc ma anche software che vanno per la maggiore negli ultimi anni, come ad esempio Multicharts, non consentono di testare e ottimizzare strategie direttamente su un portafoglio e di testare logiche di money management che simulino esattamente l’andamento di un conto. Questa è invece una delle caratteristiche vincenti di un software di derivazione americana chiamato Amibroker. Il linguaggio di programmazione, abbreviato con AFL (amibroker Formula Language) assomiglia al C++, ed è certamente meno intuitivo rispetto all’Easy Language o ad altri linguaggi derivati dal Turbo Pascal. Ad aiutare i neofiti viene in aiuto un Wizard che consente di compilare trading system abbastanza semplici attraverso alcune finestre di edit, e degli ottimi manuali. I punti di forza di Amibroker sono a nostro giudizio:
1) la facilità di gestione dei database, attraverso la creazione di cartelle con cui è possibile segmentare a piacimento i mercati per tipologia di asset, settore, area geografica, borsa di riferimento, o semplicemente creando panieri di proprio interesse. I dati possono essere importati sia in formato Ascii sia Metastock;
2) sui diversi panieri è possibile facilmente effettuare delle scansioni ed ottenere delle liste di strumenti finanziari in base ai criteri di scelta impostati oppure effettuare test ed ottimizzare la strategia direttamente sul portafoglio.
Molto deficitaria invece la parte di trading automatico, con un solo broker (Interactive brokers) con cui funziona abbastanza efficacemente.
Riportiamo il codice Amibroker per una strategia sull’Ichimoku, già trattato nei precedenti numeri testato su un paniere di dati giornalieri di titoli azionari italiani.
_SECTION_BEGIN(“Price”);
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat(“{{NAME}} – {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}”, O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, “Close”, ParamColor(“Color”, colorBlack ), styleNoTitle | ParamStyle(“Style”) | GetPriceStyle() );
_SECTION_END();
_SECTION_BEGIN(“Ichimoku Hayo Kinko”);
GraphXSpace =1;
prds = Param(“Standard Line Periods?”, 12,5,26,1);
prds1 = Param(“Turning Line Periods?”, 3,3,10,1);
prds2 = Param(“Delayed Line Periods?”, 11,4,25,1);
prds3 = Param(“Spans Periods?”, 18,10,52,1);
TL = ( HHV( H, prds1) + LLV( L, prds1) )/2;
SL = ( HHV( H, prds) + LLV( L, prds) )/2;
DL = Ref( C, prds2);
Sp1 = Ref( ( SL + TL )/2, -prds2);
Sp2 = Ref( (HHV( H, prds3) + LLV(L, prds3))/2, -prds2);
SetChartOptions( 0, chartShowDates | chartShowArrows | chartLogarithmic | chartWrapTitle );
_N( Title = StrFormat( “{{NAME}} – ” + SectorID( 1 ) + ” – {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol ” + WriteVal( V, 1.0 ) + ” {{VALUES}}”, O, H, L, C, SelectedValue( ROC( C, 1 ) ) ) );
Plot( C, “Close”, colorBlack, styleCandle | styleNoTitle | ParamStyle( “Style” ) | GetPriceStyle() );
if ( ParamToggle( “Tooltip shows”, “All Values|Only Prices” ) )
{
ToolTip = StrFormat( “Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: ” + NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 ) ) );
}
Buy = Cross(Close,IIf(sp1>sp2,sp1,sp2));
Sell = Cross(IIf(sp1<sp2,sp1,sp2),Close);
/* exrem is one method to remove surplus strade signals*/
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);
Filter = Buy OR Sell;
AddTextColumn( FullName(), “Company Name” );
AddColumn( Buy, “Buy”, 1 );
AddColumn( Sell, “Sell”, 1 );
AddColumn( C, “Close”, 1.3 );
AddColumn( H, “High”, 1.3 );
PlotOHLC (Sp1,Sp1,Sp2,Sp2,”Cloud”,IIf(Sp1>Sp2,ParamColor(“Span1 Color”, ColorRGB(0,255,0)),ParamColor(“Span2 Color”,ColorRGB(255,104,32))),styleCloud);
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorLime, 0,L, Offset=-50);
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorWhite, 0,L, Offset=-45);
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);
if( Status(“action”) == actionIndicator )
(
Title = EncodeColor(colorWhite)+ “NICK MA Swing System” + ” – ” + Name() + ” – ” + EncodeColor(colorRed)+ Interval(2) + EncodeColor(colorWhite) +
” – ” + Date() +” – “+”\n” +EncodeColor(colorRed) +”Op-“+O+” “+”Hi-“+H+” “+”Lo-“+L+” “+
“Cl-“+C+” “+ “Vol= “+ WriteVal(V)+”\n”+
EncodeColor(colorLime)+
WriteIf (Buy , ” GO LONG / Reverse Signal at “+C+” “,””)+
WriteIf (Sell , ” EXIT LONG / Reverse Signal at “+C+” “,””)+”\n”);
Pubblicato su B&F, novembre 2012.