Bibliotheken: BestInterval - Seite 14

 
gspencer:
Ich weiß nichts über die Codierung oder die Arbeit mit EAs im Meta Editor, aber Ihr Konzept mit dem BestInterval gefällt mir sehr. Wäre es zu viel Aufwand für Sie, mir zu erklären, wie ich es zu den EAs hinzufügen kann, die ich gerne testen möchte?

Versuchen Sie, die Diskussion in diesem Thread zu verstehen.

Библиотеки: BestInterval
Библиотеки: BestInterval
  • 2018.10.12
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: BestInterval
 
// Anzeige des BestInterval-Balance-Diagramms im Diagramm

#property strict
#property script_show_inputs

input int inAmountIntervals = 3; // Wie viele Handelsintervalle im schlimmsten Fall weggeworfen werden sollen

#include <Graphics\Graphic.mqh> // https://www.mql5.com/de/articles/2866

void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

#include <MT4Orders.mqh> // Nicht erforderlich, wenn MT4.
#include <fxsaber\BestInterval\BestInterval.mqh> // Berechnung des besten Handelsintervalls

void OnStart()
{
  BESTINTERVAL BestInterval; // Erstellt ein Objekt zur Berechnung des besten Handelsintervalls
  
  BestInterval.Set(); // Eine Geschichte des Bietens veröffentlicht
          
  for (int i = 0; i < inAmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // Wenn etwas weggeworfen wurde
      Print(BestInterval.ToString());       // Drucken wir die erhaltenen Handelsdaten aus
    else
      break;                                // Sonst sind wir raus
      
  double Profits[];
  double Balance[];
  
  const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Wir haben die Gewinne der BestInterval-Transaktion
  Balance[0] = 0;  
  
  // Berechnen Sie die Gleichgewichtskurve
  for (int i = 1; i < Size; i++)
    Balance[i] = Balance[i - 1] + Profits[i - 1];
    
  ToChart(Balance); // Visualisiert.
}
 
Wenn Sie dies am Ende eines EA aus der Standardlieferung einfügen
// Übertragen Sie Zitate von jedem Durchgang des Optimierers an das Terminal. Wenden Sie BestInterval auf sie an und visualisieren Sie sie.

#include <MT4Orders.mqh>                         // https://www.mql5.com/de/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/de/code/22710
#include <TypeToBytes.mqh>                       // https://www.mql5.com/de/code/16280
#include <Graphics\Graphic.mqh>                  // https://www.mql5.com/de/articles/2866

input int inAmountIntervals = 1; // Wie viele Handelsintervalle im schlimmsten Fall weggeworfen werden sollen

// Gibt den Graphen aus
void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

// Sammelt die Geschichte des Handels
int GetDeals( DEAL_BASE &Deals[] )
{  
  const int Total = ArrayResize(Deals, OrdersHistoryTotal());
  int Amount = 0; 
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Deals[Amount].OpenTime = OrderOpenTime();
      Deals[Amount++].Profit = OrderProfit() + OrderCommission() + OrderSwap();
    }
      
  return(ArrayResize(Deals, Amount));    
}

// Von hier aus (Agent) werden wir Daten an das Terminal senden
double OnTester()
{
  DEAL_BASE Deals[];
  
  if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // Wenn Optimierung, gesammelter Handelsverlauf
  {    
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Deals; // Legen Sie den Gebotsverlauf in einen Container
  
    FrameAdd(NULL, 0, 0, Container.Data); // Senden von Daten vom Agenten an das Terminal
  }
  
  return(0);
}

// Hier (Terminal) Daten von Agenten empfangen
void OnTesterPass()
{    
  ulong Pass;
  string Name;
  long ID;
  double Value;

  CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205

  while (FrameNext(Pass, Name, ID, Value, Container.Data))
  {
    Print("Pass = " + (string)Pass); // Passnummer
    
    DEAL_BASE Deals[];
   
    // Empfangene Daten vom Agenten
    Container[0].Get(Deals);
          
    BESTINTERVAL BestInterval; // Erstellt ein Objekt zur Berechnung des besten Handelsintervalls
    
    BestInterval.Set(Deals);   // Die übermittelte Gebotshistorie veröffentlichen

    Print(BestInterval.ToString() + "\n");           // Drucken wir die erhaltenen Handelsdaten aus
            
    for (int i = 0; i < inAmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval())        // Wenn etwas weggeworfen wurde
        Print(BestInterval.ToString() + "\n");       // Drucken wir die erhaltenen Handelsdaten aus
      else
        break;                                       // Sonst sind wir raus
        
    double Profits[];
    double Balance[];
    
    const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // Wir haben die Gewinne der BestInterval-Transaktion
    Balance[0] = 0;  
    
    // Berechnen Sie die Gleichgewichtskurve
    for (int i = 1; i < Size; i++)
      Balance[i] = Balance[i - 1] + Profits[i - 1];
      
    ToChart(Balance); // Visualisiert.    
  }
}


einfügen, sehen Sie im Terminalprotokoll (am Beispiel der gleitenden Standard-Durchschnitte) etwa Folgendes

Pass = 0
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98
SUMMARY: 00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 18:00 - 18:00, CountHours = -1
17:40:01 - 17:42:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67
SUMMARY: 00:00:00 - 23:59:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67

Pass = 1
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97
SUMMARY: 00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 09:00 - 10:00, CountHours = 0
08:27:01 - 10:14:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14
SUMMARY: 00:00:00 - 23:59:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14


Und auf dem Chart ist der BestInterval-profit-Chart des entsprechenden Durchgangs


 

Ich kam zufällig vorbei. Ich habe es gelesen.

In der Beschreibung steht: "

  • Die Idee ist die des Autors. Es kann Analogien geben.

"

Etwas allgemeineres habe ich in einem Blog auf Englisch beschrieben(Teil 1, Teil 2). Querschnitte nur für Zeitintervalle zu erstellen, ist ein hochspezialisierter Ansatz. Die Idee ist, dass Querschnitte für andere Parameter ebenso interessant sein könnten.

 
Stanislav Korotky:

Ich kam zufällig vorbei. Ich habe es gelesen.

In der Beschreibung steht: "

  • Die Idee ist die des Autors. Es kann Analogien geben.

"

Etwas allgemeineres habe ich im englischen Blog beschriebenPositionseröffnung war (wir schreiben ihn in den OrderComment). Dementsprechend können alle Positionen in der Handelshistorie mit diesen MA-Werten verglichen werden.

Und dann wenden wir BestInterval auf diese MAs an. Und am Ausgang erhalten wir die Bereiche von МАшки, in denen Positionen eröffnet werden sollten, und in denen nicht.


Natürlich können Sie anstelle eines MA eine beliebige numerische Funktion verwenden. Als Ergebnis können Sie coole Filter finden, die die Zeit übertreffen.

 
fxsaber:

Leider hindert mich die Sprachbarriere daran, in Ihre Arbeit einzusteigen. Was das Interesse an anderen Filtern angeht, so stimme ich natürlich zu

Seit wann gibt es eine solche Barriere? ;-) Das war doch vorher klar. Oder habe ich mein Englisch vermasselt?

 
Stanislav Korotky:

Seit wann gibt es eine solche Barriere? ;-) Früher war das klar. Oder habe ich mein Englisch vermasselt?

Es gab immer eine Barriere. Manchmal bin ich gleich weitergegangen und habe den Quellcode gelesen.

 
fxsaber:

Leider hindert mich die Sprachbarriere daran, in Ihre Arbeit einzusteigen. Was das Interesse an anderen Filtern angeht, so stimme ich natürlich zu

Gott ist Ihr Richter.

 
Memo
#include <fxsaber\BestInterval\BestInterval.mqh>

void OnStart()
{
  BESTINTERVAL BestInterval;

  // Entsprechende Werte für das gesamte BestInterval
  Print(BestInterval.GetTotal());          // Anzahl der geschlossenen Positionen.
  Print(BestInterval.GetTotalPlus());      // Anzahl der profitablen geschlossenen Positionen.
  Print(BestInterval.GetTotalMinus());     // Anzahl der unrentablen geschlossenen Positionen.
  Print(BestInterval.GetMean());           // Math. Erwartung
  Print(BestInterval.GetProfit());         // Gewinn
  Print(BestInterval.GetProfitFactor());   // Gewinnfaktor
  Print(BestInterval.GetProfitPlus());     // Gewinn aus positiven Transaktionen
  Print(BestInterval.GetProfitMinus());    // Verlust von negativen Transaktionen
  Print(BestInterval.GetRecoveryFactor()); // Rückgewinnungsfaktor
  Print(BestInterval.GetMaxDrawDown());    // Maximaler absoluter Saldoabzug

  Print(BestInterval.GetAmountDeleteIntervals()); // Anzahl der entfernten fehlerhaften Intervalle

  INTERVAL Intervals[];

  const int Size = BestInterval.GetIntervals(Intervals); // Abrufen der Intervalle, aus denen sich das BestInterval zusammensetzt

  // Für jedes Intervall werden die Indizes gedruckt
  for (int i = 0; i < Size; i++)
  {
    Print(Intervals[i].Total);          // Anzahl der geschlossenen Positionen.
    Print(Intervals[i].TotalPlus);      // Anzahl der profitablen geschlossenen Positionen.
    Print(Intervals[i].TotalMinus);     // Anzahl der unrentablen geschlossenen Positionen.
    Print(Intervals[i].Mean);           // Math. Erwartung
    Print(Intervals[i].Profit);         // Gewinn
    Print(Intervals[i].ProfitFactor);   // Gewinnfaktor
    Print(Intervals[i].ProfitPlus);     // Gewinn aus positiven Transaktionen
    Print(Intervals[i].ProfitMinus);    // Verlust von negativen Transaktionen
    Print(Intervals[i].RecoveryFactor); // Rückgewinnungsfaktor
    Print(Intervals[i].MaxDrawDown);    // Maximaler absoluter Saldoabzug

    Print(Intervals[i].OpenTime);       // Intervall offene Zeit.
    Print(Intervals[i].CloseTime);      // Intervall-Schlusszeit.
  }
}
 
Stanislav Korotky:

Querschnitte nur nach Zeitintervallen zu erstellen, ist ein sehr spezieller Ansatz. In der Tat können Querschnitte nach anderen Parametern nicht weniger interessant sein.

Ich habe viel nachgedacht, aber mir ist noch nichts eingefallen, was sich so effektiv filtern lässt wie die Zeit.

Dieses Etwas sollte nicht Teil der Strategie sein und das Marktverhalten direkt beeinflussen.

Stack? andere Datafeeds?

und noch eine Frage - macht es Sinn, Hypercubes zu machen? theoretisch sollte es auch individuell gut gefiltert werden.