Optimizer bringt Error 10

      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

      1. mult = 2;
      2. period = 10;
      3. dec = 4;
      4. // 2nd phase ##################
      5. SetCustomBacktestProc( "" );
      6. if ( Status( "action" ) == actionPortfolio )
      7. {
      8. bo = GetBacktesterObject();
      9. // run default backtest procedure without generating the trade list
      10. bo.Backtest( True );
      11. // iterate closed trades
      12. for ( trade = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) )
      13. {
      14. foreignATR = StaticVarGet( trade.Symbol + "ATR" );
      15. trade.AddCustomMetric( StrFormat("Entry %g*ATR(%g)", mult, period),
      16. Lookup( foreignATR, trade.EntryDateTime ),
      17. dec );
      18. }
      19. // iterate open positions
      20. for ( trade = bo.GetFirstOpenPos( ); trade; trade = bo.GetNextOpenPos( ) )
      21. {
      22. foreignATR = StaticVarGet( trade.Symbol + "ATR" );
      23. trade.AddCustomMetric( StrFormat("Entry %g*ATR(%g)", mult, period),
      24. Lookup( foreignATR, trade.EntryDateTime ),
      25. dec );
      26. }
      27. // generate trade list
      28. bo.ListTrades();
      29. }
      30. //1st Phase ##################
      31. Buy = Cross( MACD(), Signal() );
      32. Sell = Cross( Signal(), MACD() );
      33. Short = Cover = 0;
      34. 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?!"
      Ich hab dir deinen Fehler doch schon gezeigt.

      Der Optimizer macht einfach mehrere (so viele wie unterschiedliche Parameterpärchen vorhanden sind) Backtests.
      Und bereitet die Ergebnisse graphisch auf.

      Das hat nichts mit Loop's oder sonstigen zu tun.

      BTW: N-Stop ist nicht gleich NOT-Stop, als Not-Stop bezeichne ich einen Stop (in Pips oder % oder Punkten gemessen) der in nicht mehr als 10% (?) der Fälle zum Einsatz kommt. Quasi ein Schutz vor massiven Kursschwankungen.

      Aber ernsthaft ..... 27.000 optimization steps ????

      Das dauert bei mir 45min ( für ca. 3500 Balken -> 14 Jahre im Daily) ...... für EINE Optimierung .... wie stellst du dir einen Walkforward vor?

      Ich bin drauf gekommen, dass Systeme mit max. 3 zu optimierenden Variablen besser sind -> KISS !!

      Außerdem hast du nichtmal einen Not-Stop.

      Grüße
      Christoph
      windowSize1 = Optimize( "Window Size", 90, 5, 100, 2 );
      sigma1 = Optimize( "Sigma", 13, 1, 20, 1 );
      Offset1 = Optimize( "Offset", 0.55, 0.05, 1.0, 0.05 );

      windowSize2 = Optimize( "Window Size2", 6, 5, 100, 2 );
      sigma2 = Optimize( "Sigma2", 5, 1, 20, 1 );
      Offset2 = Optimize( "Offset2", 0.6, 0.05, 1.0, 0.05 );

      Füge die fett gedruckten "2" hinzu.
      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.


      Quellcode

      1. OptimizerSetEngine( "cmae" );
      2. function ALMA( priceField, windowSize, sigma, Offset )
      3. {
      4. m = floor( Offset * ( windowSize - 1 ) );
      5. s = windowSize / sigma;
      6. if ( status( "actionex" ) == actionExOptimizeSetup )
      7. {
      8. _TRACE ( "statusaction:" + Status( "actionex" ) +
      9. ", barcount before:" + BarCount +
      10. ", windowsize before:" + windowsize );
      11. }
      12. else
      13. {
      14. _TRACE ( "statusaction:" + Status( "actionex" ) +
      15. ", barcount after:" + BarCount +
      16. ", windowsize after:" + windowsize );
      17. }
      18. w = 0;
      19. wSum = 0;
      20. outalma = Null;
      21. for ( i = 1; i < windowSize; i++ )
      22. {
      23. w[i] = exp( -( ( i - m ) * ( i - m ) ) / ( s * s ) );
      24. wSum += w[i];
      25. }
      26. for ( i = 1; i < windowSize; i++ )
      27. {
      28. w[i] = w[i] / wSum;
      29. }
      30. for ( j = 0; j < BarCount; j++ )
      31. {
      32. alSum = 0;
      33. if ( j < windowSize )
      34. {
      35. outalma[j] = Null;
      36. }
      37. else
      38. {
      39. for ( i = 1; i < windowSize; i++ )
      40. {
      41. alSum += priceField[j - ( windowSize - 1 - i )] * w[i];
      42. }
      43. outalma[j] = alSum;
      44. }
      45. }
      46. // }
      47. return outalma;
      48. }
      49. windowSize1 = Optimize( "Window Size", 90, 5, 100, 2 );
      50. sigma1 = Optimize( "Sigma", 13, 1, 20, 1 );
      51. Offset1 = Optimize( "Offset", 0.55, 0.05, 1.0, 0.05 );
      52. windowSize2 = Optimize( "Window Size", 6, 5, 100, 2 );
      53. sigma2 = Optimize( "Sigma", 5, 1, 20, 1 );
      54. Offset2 = Optimize( "Offset", 0.6, 0.05, 1.0, 0.05 );
      55. ma1 = ALMA( C, windowSize1, sigma1, Offset1 );
      56. ma2 = ALMA( C, windowSize2, sigma2, Offset2 );
      57. Plot(ma1, "ALMA", ParamColor("Color", colorBlue), ParamStyle("Style"));
      58. Plot(ma2, "ALMA", ParamColor("Color", colorBlue), ParamStyle("Style"));
      59. Buy = Cross( MA1, MA2 );
      60. Sell = 0;
      61. Short = Cover = 0;
      62. HoldDays = Optimize( "HoldDays", 20, 1, 20, 1 );
      63. ApplyStop( stopTypeNBar, stopModeBars, HoldDays, priority = 1, volatile = False, delay = 0 );


      Bringt im Optimizer die Nullen bzw N/A:

      candletalk.de/attachment/22068…e71689db1d31b403bbb5a0ce7


      Scheinbar ähnliches Problem ergibt sich, wenn ich folgende Custom Metrics in das durch trash abgeänderte Script dazu schreibe.


      Custom Metrics mit Alma ohne Loop:

      Quellcode

      1. function ALMA( input, range, Offset, sigma )
      2. {
      3. local m, im, s, Coeff;
      4. m = floor( Offset * (range - 1) );
      5. s = range / sigma;
      6. for( i = 0; i < Min( range, BarCount ); i++ )
      7. {
      8. im = i - m;
      9. Coeff[ i ] = exp( - ( im * im )/ ( 2 * s * s ) );
      10. }
      11. return FIR( input, Coeff, range );
      12. }
      13. function kpi()
      14. {
      15. bo2 = GetBacktesterObject();
      16. e = Foreign( "~~~Equity", "C" );
      17. startbar = LastValue(BarsSince(Ref(e,-1)==0 AND e!=Ref(e,-1)));
      18. spy = Foreign( "$SPX","Close");
      19. refline = Cum( 1 );
      20. Firstentry = " ";
      21. mo = Month();
      22. dy = DaysSince1900();
      23. MonChange = mo != Ref( mo, -1 );
      24. MaxMoProfit = MinMoProfit = 0;
      25. dt = DateTime();
      26. stats = bo2.GetPerformanceStats( 0 );
      27. trade = bo2.GetFirstTrade();
      28. Days = 0;
      29. Daysn = 0;
      30. Ratio = 0;
      31. CAGR = 0;
      32. CAR = 0;
      33. Years = 0;
      34. Lastexit = 0;
      35. SumMChg = 0;
      36. NoMonth = 0;
      37. WinMonth = 0;
      38. Startbar = 0;
      39. if (trade)
      40. {
      41. Lastdate_open = trade.entrydatetime;
      42. Lastdate_closed = trade.entrydatetime;
      43. for( Lasttrade = bo2.GetFirstTrade(); Lasttrade; Lasttrade = bo2.GetNextTrade() )
      44. {
      45. LastDate_closed = Max(LastDate_closed,LastTrade.Exitdatetime);
      46. }
      47. for( openpos = bo2.GetFirstOpenPos(); openpos; openpos = bo2.GetNextOpenPos() )
      48. {
      49. LastDate_open = Max(LastDate_open,Openpos.Exitdatetime);
      50. }
      51. Lastdate = Max(Lastdate_closed,Lastdate_open);
      52. Entryd = DateTimeConvert(0,trade.entrydatetime);
      53. Days = BarsSince(DateNum()==entryd);
      54. Daysn = StrToNum( WriteVal(Days,5.5));//Daysn = StrToNum( WriteVal(Days,5.5));
      55. Text = StrRight(NumToStr( trade.entrydatetime, formatDateTime ),4);
      56. Years = DateTimeDiff(Lastdate,trade.entrydatetime) / 31557600;
      57. Ratio = stats.getvalue("EndingCapital") / stats.getvalue("InitialCapital");
      58. CAR = ((Ratio ^ (1/Years))-1)*100;
      59. CAGR = NumToStr(CAR,1.2);
      60. firstentry = NumToStr( trade.entrydatetime, formatDateTime );
      61. Lastexit = NumToStr( Lastdate, formatDateTime);
      62. }
      63. LastMoValue = e[ startbar ];
      64. for( i = startbar + 1; i < BarCount; i++ )
      65. {
      66. if( MonChange [ i ] || i == BarCount - 1 )
      67. {
      68. Chg = 100 * ( -1 + e[ i-1 ] / LastMoValue );
      69. SumMChg = SumMChg + Chg;
      70. NOMonth = NoMonth + 1;
      71. WinMonth = WinMonth + IIf(Chg>=0,1,0);
      72. MaxMoProfit = Max( MaxMoProfit, Chg );
      73. MinMoProfit = Min( MinMoProfit, Chg );
      74. LastMoValue = e[ i - 1];
      75. }
      76. }
      77. MaxEQ = Highest( e );
      78. barmax = BarsSince(Maxeq > Ref(Maxeq,-1));
      79. RecoveryStr = NumToStr(Highest( barmax),1.0);
      80. Datemax = Ref(dt,-BarsSince(barmax==Highest(barmax)));
      81. Datemaxst = NumToStr( Datemax, formatDateTime );
      82. DD = 100 * ( e - MaxEQ ) / MaxEq;
      83. MaxDDdate = Ref(dt,-BarsSince(dd==Lowest( DD )));
      84. MaxDDdatest = NumToStr( MaxDDdate, formatDateTime );
      85. r2 = Correlation( e, refline, Daysn ) ^ 2;
      86. SPYcorel = NumToStr(Correlation( e, spy, Daysn ) ,1.2);
      87. sr = stats.getvalue("SharpeRatio");
      88. dvr = NumToStr(r2 * sr,1.2);
      89. srStr = NumToStr(sr,1.2);
      90. r2Str = NumToStr(r2,1.2);
      91. returnpro = stats.getvalue("NetProfitPercent");
      92. proz_w = NumToStr(stats.getvalue("WinnersPercent"),1.2);
      93. proz_Avg = NumToStr(stats.getvalue("AllAvgProfitLossPercent"),1.2);
      94. TotalTrades = NumToStr(stats.getvalue("WinnersQty") + stats.getvalue("LosersQty"),1.0,False);
      95. MaxDD = NumToStr(Lowest(DD),1.2) ;
      96. RAR = NumToStr(stats.getvalue("RAR"),1.2);
      97. UI = NumToStr(stats.getvalue("UlcerIndex"),1.2);
      98. UIP = NumToStr(CAR / stats.getvalue("UlcerIndex"),1.2);
      99. Monthtotal = NumToStr(NoMonth, 2.0) ;
      100. Monthwin = NumToStr((WinMonth/Nomonth)*100,2.0) ;
      101. Monthavg = NumToStr(SumMchg/NoMonth,1.2) ;
      102. Length = NumToStr(stats.getvalue("AllAvgBarsHeld"),1.1);
      103. bo2.AddCustomMetric( "RAR", RAR);
      104. bo2.AddCustomMetric( "CAR", CAGR);
      105. bo2.AddCustomMetric( "DVR",dvr);
      106. bo2.AddCustomMetric( "SR", srStr);
      107. bo2.AddCustomMetric( "R2", r2str);
      108. bo2.AddCustomMetric( "Ulcer", UI);
      109. bo2.AddCustomMetric( "UlcerPerf", UIP);
      110. bo2.AddCustomMetric( "%W", proz_w);
      111. bo2.AddCustomMetric( "%Avg",proz_avg);
      112. bo2.AddCustomMetric( "MaxDD [" + MaxDDdatest+"] %", MaxDD);
      113. bo2.AddCustomMetric( "Max. recovery ["+Datemaxst+"] (bars)", RecoveryStr );
      114. bo2.AddCustomMetric( "LastExit", LastExit );
      115. bo2.AddCustomMetric( "Years#", NumToStr(Years,2.1) );
      116. bo2.AddCustomMetric( "Month#", Monthtotal);
      117. bo2.AddCustomMetric( "Month_Win%", Monthwin);
      118. bo2.AddCustomMetric( "Month_Avg%", Monthavg);
      119. bo2.AddCustomMetric( "Month_Max%", MaxMoProfit );
      120. bo2.AddCustomMetric( "Month_Min%", MinMoProfit );
      121. bo2.AddCustomMetric( "SPY corel", spycorel);
      122. bo2.AddCustomMetric( "TotalTrades", TotalTrades );
      123. bo2.AddCustomMetric( "FirstTrade", firstEntry );
      124. };
      125. windowSize1 = Optimize( "Window Size", 90, 5, 90, 2 );
      126. sigma1 = Optimize( "Sigma", 13, 1, 20, 1 );
      127. Offset1 = Optimize( "Offset", 0.55, 0.05, 1.0, 0.05 );
      128. windowSize2 = Optimize( "Window Size", 6, 5, 90, 2 );
      129. sigma2 = Optimize( "Sigma", 5, 1, 20, 1 );
      130. Offset2 = Optimize( "Offset", 0.6, 0.05, 1.0, 0.05 );
      131. ma1 = ALMA( C, windowSize1, sigma1, Offset1 );
      132. ma2 = ALMA( C, windowSize2, sigma2, Offset2 );
      133. Buy = Cross( MA1, MA2 );
      134. Sell = 0;
      135. Short = Cover = 0;
      136. HoldDays = Optimize( "HoldDays", 20, 1, 20, 1 );
      137. ApplyStop( stopTypeNBar, stopModeBars, HoldDays, priority = 1, volatile = False, delay = 0 );
      138. SetCustomBacktestProc("");
      139. if ( Status( "action" ) == actionPortfolio )
      140. {
      141. bo = GetBacktesterObject();
      142. bo.Backtest(True);
      143. kpi();
      144. bo.listtrades();
      145. }


      Ergebnisse mit dem Backtest:

      candletalk.de/attachment/22070…e71689db1d31b403bbb5a0ce7

      Der Backtest funktioniert, aber der Optimizer stellt sich quer. Hier bringt der Optimizer:
      Error 52.
      Invalid argument value for `Correlation()` function: `range` must be greater than zero (and not Null).


      Durch Probieren habe folgende Quelle als Problem für den Optimizer eingerenzen können:

      candletalk.de/attachment/22069…e71689db1d31b403bbb5a0ce7

      Wenn ich da versuchsweise die Daysn mit 1 addiere füllt der Optimizer wieder 0 / N/A. Welche Abänderungen im Code sind notwendig damit der Optimizer funktioniert.

      Danke schonmal im Vorraus


      P.S.: Ich hoffe trash hat nach dem lesen seinen Blutdruck wieder unter Kontrolle bekommen und ist in der Lage mich blasses Anfängerlicht nicht als Hoffnungslosen Fall sterben zu lassen. JA, aller Anfang ist nunmal schwer.





      BTW, die ALMA Funktion in Posting #1 hat einen Fehler.

      falsch

      Quellcode

      1. w = exp(-((i-m)*(i-m))/(s*s)); // 2 should be there?


      korrekt

      Quellcode

      1. w[i] = exp(-((i-m)*(i-m))/(s*s)); // 2 should be there?


      Wahrscheinlich, weil keine Code-Tags verwendet wurden, hat sich das eingeschlichen.

      Aber ALMA geht viel kürzer und korrekter, siehe hier amibroker.com/guide/afl/fir.html Funktion ganz unten.
      Aber es geht auch noch kompakter und scheinbar ohne Loop.

      Quellcode

      1. function ALMA( input, range, Offset, sigma )
      2. {
      3. m = floor( Offset * ( range - 1 ) );
      4. s = range / sigma;
      5. im = Cum( 1 ) - 1 - m;
      6. Coeff = exp( - im ^ 2 / 2 / s ^ 2 );
      7. return FIR( input, Coeff, range );
      8. }


      Desweiteren habe ich noch einen schweren Fehler in deinem Code gesehen. Niemals nie verwende Sell = BarsSince( Buy ) >= HoldDays und Ähnliches für nbar Stop. Never! Ganz schnell vergessen.

      Für nBar Stop verwende bspw ApplyStop

      Quellcode

      1. Sell = 0;
      2. HoldDays = Optimize( "HoldDays", 5, 1, 20, 1 );
      3. ApplyStop( stopTypeNBar, stopModeBars, HoldDays, priority = 1, volatile = False, delay = 0 );



      Hier der komplette Code (kannst natürlich auch ALMA von der AB Webseite verwenden):

      Quellcode

      1. function ALMA( input, range, Offset, sigma )
      2. {
      3. m = floor( Offset * ( range - 1 ) );
      4. s = range / sigma;
      5. im = Cum( 1 ) - 1 - m;
      6. Coeff = exp( - im ^ 2 / 2 / s ^ 2 );
      7. return FIR( input, Coeff, range );
      8. }
      9. OptimizerSetEngine( "cmae" );
      10. //p = ParamField("Price Field");
      11. windowSize1 = Optimize( "Window Size 1", 9, 5, 201, 2 );
      12. sigma1 = Optimize( "Sigma 1", 6, 1, 20, 1 );
      13. Offset1 = Optimize( "Offset 1", 0.85, 0.05, 1.0, 0.05 );
      14. windowSize2 = Optimize( "Window Size 2", 30, 5, 201, 2 );
      15. sigma2 = Optimize( "Sigma 2", 10, 1, 20, 1 );
      16. Offset2 = Optimize( "Offset 2", 1, 0.05, 1.0, 0.05 );
      17. ma1 = ALMA( C, windowSize1, sigma1, Offset1 );
      18. ma2 = ALMA( C, windowSize2, sigma2, Offset2 );
      19. Buy = Cross( MA1, MA2 );
      20. Sell = 0;
      21. Short = Cover = 0;
      22. HoldDays = Optimize( "HoldDays", 5, 1, 20, 1 );
      23. // https://www.amibroker.com/guide/afl/applystop.html
      24. ApplyStop( stopTypeNBar, stopModeBars, HoldDays, priority = 1, volatile = False, delay = 0 );
      25. if ( Status( "action" ) == actionIndicator )
      26. {
      27. SetChartOptions( 0, chartShowDates | chartShowArrows | chartWrapTitle );
      28. Plot( C, "", colorDefault, styleCandle );
      29. Plot( ma1, "\nAlma 1", colorRed, styleline );
      30. Plot( ma2, "Alma 2", colorYellow, styleline );
      31. _N( Title = StrFormat( "{{NAME}} - {{INTERVAL}} - {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%), Vol %g {{VALUES}}",
      32. O, H, L, C, SelectedValue( ROC( C, 1 ) ), V ) );
      33. }

      "I'm a trader, baby. So, why don't you kill me?!"

      Die Lösung aus der Krise

      Hier scheint ja beinahe wieder totale Hilflosigkeit zu herrschen. :)

      Komplex? Ich glaube, du hast noch nie wirklich Komplexes gesehen, wenn bei dir komplex schon bei "Länger als 10 Zeilen" beginnt.
      Desweiteren taucht das nicht bei komplexen Sachen wie deinem nicht komplexen Codebsp. auf, sondern weil man zumindest schon mal nicht in der Lage ist, wenigstens Mittel zu nutzen, die Infos ausgeben und aufzeigen, weshalb/wann da so eine Meldung auftaucht. Ganz einfach wäre es natürlich, wenn man gleich zum Support gegangen wäre. Da hätte man innerhalb kurzer Zeit die Antwort schon längst parat gehabt. Wenn man weniger hilflos ist und nicht gleich nach wenigen Minuten hippelig und kribbelig wird, sondern immernoch cool the pelvis like Elvis bewegt (noch nicht kreischen), dann geht's auch ohne Support. Wie gesagt, forscht man halt erst mal nach, weshalb da Barcount kleiner 201 (windowsize) ist.



      Et voila, _Trace gibt im Log Fenster Folgendes aus. Während Optimization Setup läuft, ist Barcount immer 100, danach normal entsprechend der Anzahl von Bars des Symbols in der Datenbank. Ups, na das war aber schon mal ganz schön schwer bis hier her. Wirklich?



      Jetzt kann man halt weiter fragen, weshalb das so ist oder man kann zum Bsp. jetzt zum Support gehen und dort um Aufklärung bitten und schon mal damit prahlen, dass man etwas selbst herausgefunden hat (siehe oben), statt mit leeren Taschen und Dackelblick dazustehen. Oder man denkt erst mal kurz weiter nach (wieder ohne Support).

      Na dann denken wir mal kurz weiter. Während der kurzen Setupperiode, in der zum Bsp die gesetzten Optimize Variablen eingelesen werden, wird höchstwahrscheinlich (weil nicht unsinnig verschwenderisch der komplette Barcount bspw. 100.000 Bars benötigt wird) programmintern stattdessen aus Geschwindigkeitsgründen auf 100 heruntergesetzt und nachdem Setup abgeschlossen ist wieder der bestehende Barcount eingesetzt.

      So und nun könnte man ja wieder zum Support gehen bzw prahlen und nachprüfen, ob man wirklich so schlau war.

      Und natürlich dürfen die Groupies nun anfangen zu kreischen. :P

      *Kreisch off*

      PS: Bitte nächstes Mal Code tags verwenden. Danke!

      *Kreisch on*

      Elvis has left the building ...
      "I'm a trader, baby. So, why don't you kill me?!"
      Ich bin zwar kein Profi, aber ich würde den Fehler so deuten:
      Dein code will auf den Wert eines Bars zugreifen welcher nicht existiert.
      Bsp: Dein code startet am ersten Bar deiner History und möchte aber auf den Bar davor zugreifen.

      Ich denke der Fehler liegt in der "windowSize".

      Probier eventuell mal den Code erst zu starten wenn "windowsize" > "BarCount()"....

      Hoffe ich konnte helfen

      Optimizer bringt Error 10

      Hallo,

      folgender (untenstehender)Fehler taucht beim optimieren von komplexeren Indikatoren wie den "Arnaud Legoux Moving Average (ALMA" auf, den ich hier stellvertretend in ein simples Crossoversystem gepackt habe. Wer von euch erfahrenen Programmierern kann diesen Fehler deuten oder Tipps geben, wie man den abstellen kann.


      Error 10.
      Array subscript out of range.
      You must not access array elements outside 0..(BarCount-1) range. You attempted to access non-existing 100-th element of array.





      Dazu den Code:

      OptimizerSetEngine( "cmae" );

      function ALMA(priceField, windowSize, sigma, Offset)
      {
      m = floor(Offset * (windowSize - 1));
      s = windowSize / sigma;

      w = 0;
      wSum = 0;

      for(i = 1; i < windowSize; i++)
      {
      w = exp(-((i-m)*(i-m))/(s*s)); // 2 should be there?
      wSum += w[i];
      }

      for(i = 1; i < windowSize; i++)
      {
      w[i] = w[i] / wSum;
      }

      outalma = Null;

      for(j = 0; j < BarCount; j++)
      {
      alSum = 0;

      if(j < windowSize)
      {
      outalma[j] = Null;
      }
      else
      {
      for(i = 1; i < windowSize; i++)
      {
      alSum += priceField[j - (windowSize - 1 - i)] * w[i];
      }

      outalma[j] = alSum;
      }
      }

      return outalma;
      }

      //p = ParamField("Price Field");
      windowSize1 = Optimize("Window Size", 9, 5, 201, 2);
      sigma1 = Optimize("Sigma", 6, 1, 20, 1);
      Offset1 = Optimize("Offset", 0.85, 0.05, 1.0, 0.05);

      windowSize2 = Optimize("Window Size", 30, 5, 201, 2);
      sigma2 = Optimize("Sigma", 10, 1, 20, 1);
      Offset2 = Optimize("Offset", 1, 0.05, 1.0, 0.05);

      ma1 = ALMA(C, windowSize1, sigma1, Offset1);
      ma2 = ALMA(C, windowSize2, sigma2, Offset2);

      Buy = Cross( MA1, MA2 );

      HoldDays = Optimize("HoldDays",5,1,20,1);
      Sell = BarsSince( Buy ) >= HoldDays;
      Bilder
      • Fehlerbild.jpg

        200,11 kB, 900×679, 277 mal angesehen