Bibliotheken: BestInterval - Seite 24

 
Enrique Dangeroux:
Kleine kosmetische Korrektur, int => bool. Oder wenn ich vorschlagen darf, stattdessen AmountDeleteIntervals zurückzugeben.

Danke, ich werde das korrigieren müssen.

 

Bitte beachten Sie AverageHolding als Ergänzung der Bibliothek

Intervall.mqh

  datetime AverageHolding;

  void CalculateFinal( void )
  {
    this.ProfitMinus = this.Profit - this.ProfitPlus;

    this.ProfitFactor = this.ProfitMinus ? -this.ProfitPlus / this.ProfitMinus : DBL_MAX;
    this.Mean = this.Total ? this.Profit / this.Total : 0;

    this.TotalMinus = this.Total - this.TotalPlus;
    
    this.AverageHolding = this.Total ? this.AverageHolding / this.Total : 0;

    return;
  }

  void Calculate( const DEAL &Deals[], const int Left, const int Right )
  {
    this.Init();

    for (int i = Left; i < Right; i++)
      if (!Deals[i].IsNull())
      {
        if (Deals[i].Profit > 0)
        {
          this.ProfitPlus += Deals[i].Profit;

          this.TotalPlus++;
        }
        
        this.AverageHolding += Deals[i+1].OpenTime - Deals[i].OpenTime;
        this.Profit += Deals[i].Profit;
        this.Total++;
      }

    this.CalculateFinal();

    this.OpenTime = Deals[Left-1].OpenTime + 1;
    this.CloseTime = Deals[Right].OpenTime - 1;

    
    return;
  }



BestInterval.mqh

#define  MACROS_GET(A, B)         \
  B Get##A( void ) const         \
  {                              \
    return(this.FullInterval.A); \
  }

  MACROS_GET(Profit, double)
  MACROS_GET(ProfitPlus, double)
  MACROS_GET(ProfitMinus, double)

  MACROS_GET(Total, int)
  MACROS_GET(TotalPlus, int)
  MACROS_GET(TotalMinus, int)

  MACROS_GET(ProfitFactor, double)
  MACROS_GET(Mean, double)

  MACROS_GET(MaxDrawDown, double)
  MACROS_GET(RecoveryFactor, double)
  
  MACROS_GET(AverageHolding, datetime)
#undef  MACROS_GET
 
Enrique Dangeroux:

Bitte berücksichtigen Sie AverageHolding als Ergänzung der Bibliothek

Durchschnittliche Haltedauer einer geschlossenen Position - wozu dient sie?

So sollte sie nicht berechnet werden. Sie müssen die Schließungszeit kennen.

 
fxsaber:

Durchschnittliche Lebensdauer einer geschlossenen Position - wofür ist sie gut?

Ich beziehe mich auf die durchschnittliche Lebensdauer einer Position (OrderCloseTime - OrderOpentime). Dies kann als benutzerdefiniertes GA-Kriterium nützlich sein. Zum Beispiel kann man GA dazu bringen, die Transaktionshäufigkeit zu erhöhen, kombiniert mit einer Mindestgewinnschwelle pro Transaktion.


fxsaber:

Das ist nicht, wie es zu berechnen. Sie müssen die Schlusszeit kennen.

Für das DEAL IN / OUT Netting-Konto reicht die Eröffnungszeit für die Berechnung aus, für eine korrekte Implementierung müssen Sie die Schlusszeit verwenden, die derzeit in der Bibliothek nicht berücksichtigt wird.

Es gibt ein Problem, das bleiben wird. Der Tester erzwingt das Schließen der letzten Position. Die Genauigkeit der Atomuhr ist vielleicht nicht für alle Strategien erforderlich, aber sie bleibt ein Problem. Auch GA kann zu einer höheren Handelsfrequenz getrieben werden, indem einfach 0 zurückgegeben wird, wenn BestInterval.GetTotal () <xxx, zum Beispiel wie Sie in einem Beitrag geschrieben haben.

Auf diese Weise sieht es so aus, als würde es sich nicht lohnen, während der Ärger weitergeht.

 
Enrique Dangeroux:

Ich beziehe mich auf die durchschnittliche Lebensdauer einer Position (OrderCloseTime - OrderOpentime). Dies kann als benutzerdefiniertes GA-Kriterium nützlich sein. Zum Beispiel kann man GA dazu bringen, die Transaktionshäufigkeit zu erhöhen, kombiniert mit einer Mindestgewinnschwelle pro Transaktion.

Geben Sie das Optimierungskriterium als schematischen Quellcode der OnTester-Funktion an.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: BestInterval

fxsaber, 2019.12.05 13:48 PM.

Zu sagen, dass ich zufrieden bin, ist eindeutig eine Untertreibung.... BestInterval ist jetzt großartig. Und die Änderungen sind minimal. Wie immer, ein Beispiel.


Hier ist ein 24-Stunden-Durchlauf.


Wir wenden das klassische BestInterval an.

Profit = 8018.00 = 8018.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.09.14 - 2019.12.04)
00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09
SUMMARY: 00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09

Profit = 10721.00 = 8018.00 + 2703.00 (33.71%) - Amount of Delete Intervals = 1 (2019.09.14 - 2019.12.04), 13:00 - 08:00, CountHours = 18
00:00:00 - 08:03:48 : Profit = 3278.00 (30.58%), Total = 161 (79.50%), PF = 2.21, Mean = 20.36, DD = 518.00, RF = 6.33
13:07:59 - 23:59:59 : Profit = 7443.00 (69.42%), Total = 389 (74.55%), PF = 2.14, Mean = 19.13, DD = 417.00, RF = 17.85
SUMMARY: 00:00:00 - 23:59:59 : Profit = 10721.00 (100.00%), Total = 550 (76.00%), PF = 2.16, Mean = 19.49, DD = 536.00, RF = 20.00

Wir sehen, dass der Gewinn um ein Drittel gestiegen ist, und andere Indikatoren sind besser geworden.


Aber wir wollten Flexibilität. Und hier ist sie.

Profit = 8018.00 = 8018.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.09.14 - 2019.12.04)
00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09
SUMMARY: 00:00:00 - 23:59:59 : Profit = 8018.00 (100.00%), Total = 739 (73.34%), PF = 1.44, Mean = 10.85, DD = 1317.00, RF = 6.09

Profit = 4868.00 = 8018.00 + -3150.00 (-39.29%) - Amount of Delete Intervals = 1 (2019.09.14 - 2019.12.04), 20:00 - 01:00, CountHours = 4
00:00:00 - 01:31:54 : Profit = 1067.00 (21.92%), Total = 32 (87.50%), PF = 4.63, Mean = 33.34, DD = 177.00, RF = 6.03
19:29:54 - 23:59:59 : Profit = 3801.00 (78.08%), Total = 118 (83.90%), PF = 5.53, Mean = 32.21, DD = 249.00, RF = 15.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4868.00 (100.00%), Total = 150 (84.67%), PF = 5.29, Mean = 32.45, DD = 310.00, RF = 15.70


Der Gewinn ist nicht gestiegen, er ist gesunken! Aber sehen Sie sich die anderen Indikatoren an. Anstatt das Intervall mit dem höchsten Gewinn und der höchsten Anpassungswahrscheinlichkeit zu finden, wurde ein viel engeres Intervall gefunden, das aber viel besser ist als das klassische.


Die Neuerung wird wie folgt hinzugefügt

#define  BESTINTERVAL_SLIPPAGE // Erstellen eines künstlichen Filters zur Berechnung von BestInterval.


Die Qualität der Marktmusterforschung ist nun sehr viel besser. Das hat erhebliche Auswirkungen auf die Arbeit mit mehreren Testern.


Interessant ist, dass, wenn man das gefundene so schmackhafte Intervall in den TS stopft und beginnt, es auf maximalen Gewinn darin zu optimieren, mit hoher Wahrscheinlichkeit ein Bullshit gefunden wird.


Und noch eine Bemerkung. BestInterval ignoriert zum Beispiel Trades, die zwischen Mitternacht und einer Stunde geöffnet sind. Das bedeutet nicht, dass BestInterval Sie einen Handel eröffnen lässt, wenn ein Eröffnungssignal um zwei Uhr nachts kommt. Bibla wird sie nur öffnen, wenn die ignorierte Position von Mitternacht "geschlossen" ist. Daher kann man oft sehen, dass die Optimierung eines TS mit einem starr festgelegten Intervall zu schlechteren Ergebnissen führt, als BestInterval zeigt.


Das offensichtlichste Beispiel ist ein TS für einen Gegentrend auf einen Trend. Nehmen wir an, der TS gibt ein VERKAUFSSIGNAL, und der Trend geht nach oben. BestInterval wird diese Signale ignorieren.

 

Ich habe eine solche Besonderheit festgestellt, die auf meiner Erfahrung beruht.


Wenn das Optimierungskriterium nichts mit der Glattheit der Profilkurve zu tun hat. Und das beste Ergebnis ergibt trotzdem eine glatte Kurve, dann ist es keine Anpassung.

Ein Beispiel: Das Kriterium ist der maximale Gewinn. Und der beste Durchlauf ergibt eine gerade aufsteigende Kurve. Das ist keine Anpassung.

Aber wenn das Kriterium minimaler R^2 ist. Und der beste Durchlauf ergibt eine gerade Kurve nach oben. Das ist wahrscheinlich eine Anpassung.


Ich habe ein Dilemma: Ist BestInterval ein unabhängiges Optimierungskriterium oder nicht? Vor allem mit dem Trick der Slippage-Zuweisung.

 
Ein konkretes Beispiel für das oben Gesagte. Ich nahm einen 24-Stunden-TS und optimierte ihn auf EURUSD, mit BestInterval und SlipPage ~ -12 Pips. Dies ist das Bild.
Profit = 490.00 = 490.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2020.07.01 - 2020.08.14)
00:00:00 - 23:59:59 : Profit = 490.00 (100.00%), Total = 183 (69.95%), PF = 1.03, Mean = 2.68, DD = 2441.00, RF = 0.20
SUMMARY: 00:00:00 - 23:59:59 : Profit = 490.00 (100.00%), Total = 183 (69.95%), PF = 1.03, Mean = 2.68, DD = 2441.00, RF = 0.20

Profit = 4858.00 = 490.00 + 4368.00 (891.43%) - Amount of Delete Intervals = 1 (2020.07.01 - 2020.08.14), 18:00 - 12:00, CountHours = 17
00:00:00 - 11:42:21 : Profit = 2925.00 (60.21%), Total = 68 (75.00%), PF = 1.89, Mean = 43.01, DD = 847.00, RF = 3.45
17:53:40 - 23:59:59 : Profit = 1933.00 (39.79%), Total = 36 (77.78%), PF = 2.06, Mean = 53.69, DD = 859.00, RF = 2.25
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4858.00 (100.00%), Total = 104 (75.96%), PF = 1.95, Mean = 46.71, DD = 916.00, RF = 5.30

D.h. er sagt, wenn man alle Trades ignoriert, die nicht in das Intervall 18:00-12:00 fallen, wird alles schön in der Historie sein.


Ich nähe dieses Intervall in den TS ein, so dass der TS nicht mehr rund um die Uhr läuft, und optimiere ihn für maximalen Gewinn.

Profit = 1924.00 = 1924.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2020.07.01 - 2020.08.14)
00:00:00 - 23:59:59 : Profit = 1924.00 (100.00%), Total = 163 (69.94%), PF = 1.20, Mean = 11.80, DD = 2075.00, RF = 0.93
SUMMARY: 00:00:00 - 23:59:59 : Profit = 1924.00 (100.00%), Total = 163 (69.94%), PF = 1.20, Mean = 11.80, DD = 2075.00, RF = 0.93

Der beste Pass der Genetik ist, um es milde auszudrücken, Quatsch.


ZY Dies ist immer noch ein schwaches Beispiel. Es tritt auf, wenn BestInterval PF > 3 hat und Optimiser PF < 1 ergibt.

 
fxsaber:

Ich habe ein Dilemma, ist BestInterval ein unabhängiges Optimierungskriterium oder nicht? Vor allem mit seinem Slippage-Aufgaben-Chip.

Slippage ist in der Tat eine Provision. Je höher die Provision, desto schöner ist das Ergebnis, das BestInterval in der Historie anzeigt.

Es scheint, dass die Provision nichts mit den Marktmustern zu tun hat.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Expert Advisors: Validieren

fxsaber, 2020.08.23 07:44 AM

Wahrscheinlich habe ich nicht mit CloseBy Trades gerechnet, als ich es geschrieben habe. Ich kann mich an nichts mehr erinnern. Es ist sehr wahrscheinlich, dass BestInterval das gleiche Gebrechen hat. Ich bin nicht bereit, es zu bearbeiten. Vielen Dank für die Information.


Es sieht so aus, als ob Sie recht hätten. BestInterval liefert unterschiedliche Ergebnisse sowohl in Bezug auf den potenziellen Gewinn als auch auf die Zeitintervalle für Netting und Hedging. Ich habe mir die Details noch nicht angeschaut, aber die Deals-Liste sieht auf den ersten Blick falsch aus, die Eröffnungszeit für CloseBy-Closes fällt meist auf die Eröffnungszeit der Closing-Order.