freddy_0815 schrieb:
Hallo,
nochmal zur Frage zur Funktion des Optimizers (es lässt mir einfach keine Ruhe). Nach meinem Verständnis durchläuft er nur einzelne Backtests mit den im Optimizer befindlichen Parametern (Startwert, Endwert und Schrittweite). Damit sollte auch der Alma – Loop, wenn man mal die Barcountlimitierung außen vor lässt, funktionieren. Mit dem herabsetzen des windowsizes auf unter 100 sollte dies problemlos möglich sein. Das funktioniert aber leider so nicht. Es werden nur Nullen ausgeschrieben. Wo liegt der Unterschied zwischen dem Backtester und dem Optimizer, wenn der Backtest das gewünschte Ergebnis bringt, aber der Optimizer die Ergebnisfelder mit Nullen und N/A füllt.
Das wurde doch unten schon durchgekaut mit Grund und Lösung. Jetzt wird das Gleiche noch mal gepostet. Es wird beim zweiten Mal auch nicht besser. Entweder man versteht es oder nicht. AmiBroker hatte auch noch mal einen Artikel im September geschrieben. amibroker.com/kb/2014/09/22/do…ptions-on-number-of-bars/
Ich übernehme daraus noch mal fettgedruckt
"This all means that one should never make any assumptions on number of bars your formula would get, because if you do, the formula will fail. The formula should be written so it is able to execute without errors with BarCount as small as 1 (ONE)."
Nicht nur die zwei Sätze sondern den kompletten Artikel lesen. Man kann aber auch weiter sturr bleiben und zigfach das gleiche Falsche posten. Meine Zeit ist es nicht.
Was deine zweite Sache angeht. Der Grund ist, dass dein Code wieder Fehler hat, was dann halt zu Fehlermeldungen, Falschausgabe führt.
Noch etwas ... Custom Backtest Prozedur ist die zweite Backtest Phase. Die erste Phase sind deine Standard Signale etc. Um Variablen von der ersten Phase zur zweiten (Verarbeitung der gesammelten Daten) zu übergeben verwendet man z.B. Static Variables. Dazu gibt es bereits auch Artikel zum Bsp siehe AmiBroker Users Knowledge Base, AmiBroker Users Knowledge Base, AB forum, Dokumentation.
Simples high-level Bsp. um eine ATR Spalte in der Reultate Liste auszugeben
Quellcode
- mult = 2;
- period = 10;
- dec = 4;
- // 2nd phase ##################
- SetCustomBacktestProc( "" );
- if ( Status( "action" ) == actionPortfolio )
- {
- bo = GetBacktesterObject();
- // run default backtest procedure without generating the trade list
- bo.Backtest( True );
- // iterate closed trades
- for ( trade = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) )
- {
- foreignATR = StaticVarGet( trade.Symbol + "ATR" );
- trade.AddCustomMetric( StrFormat("Entry %g*ATR(%g)", mult, period),
- Lookup( foreignATR, trade.EntryDateTime ),
- dec );
- }
- // iterate open positions
- for ( trade = bo.GetFirstOpenPos( ); trade; trade = bo.GetNextOpenPos( ) )
- {
- foreignATR = StaticVarGet( trade.Symbol + "ATR" );
- trade.AddCustomMetric( StrFormat("Entry %g*ATR(%g)", mult, period),
- Lookup( foreignATR, trade.EntryDateTime ),
- dec );
- }
- // generate trade list
- bo.ListTrades();
- }
- //1st Phase ##################
- Buy = Cross( MACD(), Signal() );
- Sell = Cross( Signal(), MACD() );
- Short = Cover = 0;
- StaticVarSet( Name() + "ATR", ATR( period ) * mult );
Zudem kannst du dir ganzen NumTostr Zeilen sparen, denn erstens ist es Variant Wert und zweitens hat die AddCustomMetric Funktion einen Parameter für Dezimalstellen.
bool AddCustomMetric( string Title, variant Value, [optional] variant LongOnlyValue, [optional] variant ShortOnlyValue , [optional] variant DecPlaces = 2, [optional] variant CombineMethod = 2 )
amibroker.com/guide/a_custombacktest.html
Dein ganzes Konstrukt ist einfach suboptimal.
"I'm a trader, baby. So, why don't you kill me?!"