Diskussion zum Artikel "Neuronale Netze leicht gemacht (Teil 47): Kontinuierlicher Aktionsraum"

 

Neuer Artikel Neuronale Netze leicht gemacht (Teil 47): Kontinuierlicher Aktionsraum :

In diesem Artikel erweitern wir das Aufgabenspektrum unseres Agenten. Der Ausbildungsprozess wird einige Aspekte des Geld- und Risikomanagements umfassen, die ein wesentlicher Bestandteil jeder Handelsstrategie sind.

In unserem vorherigen Artikel haben wir den Agenten nur darauf trainiert, die Handelsrichtung zu bestimmen. Der Handlungsspielraum des Agenten war auf nur 4 Optionen beschränkt:

  • Kaufen, 
  • Verkaufen, 
  • Halten/Warten,
  • Schließen aller Positionen.

Hier gibt es keine Kapital- und Risikomanagementfunktionen. Wir haben bei allen Handelsgeschäften die Mindestlosgröße verwendet. Dies reicht zwar aus, um Trainingsansätze zu bewerten, aber nicht, um eine Handelsstrategie zu entwickeln. Eine profitable Handelsstrategie muss einfach einen Geldmanagement-Algorithmus haben.

Darüber hinaus müssen wir, um eine stabile Handelsstrategie zu entwickeln, die Risiken kontrollieren. Auch dieser Block fehlt in unseren Entwürfen. Der EA bewertete die Marktsituation bei jeder neuen Handelskerze und traf eine Entscheidung über eine Handelsoperation. Aber jeder kommende Balken birgt Risiken für unser Konto. Kursbewegungen innerhalb eines Balkens können sich nachteilig auf unseren Saldo auswirken. Aus diesem Grund ist es immer empfehlenswert, Stop-Loss zu verwenden. Dieser einfache Ansatz ermöglicht es uns, die Risiken pro Handel zu begrenzen.

Nach etwa 3000 Durchläufen war ich in der Lage, ein Modell zu erstellen, das in der Lage war, auf der Trainingsmenge Gewinne zu erzielen. Während des Trainingszeitraums von 5 Monaten tätigte das Modell 334 Transaktionen. Mehr als 84 % von ihnen waren rentabel. Das Ergebnis war ein Gewinn von 33 % des Anfangskapitals. Gleichzeitig betrug der Drawdown vom Saldo weniger als 1 % und 7,6 % vom Kapital. Der Gewinnfaktor lag bei über 26 und der Erholungsfaktor bei 3,16. Die nachstehende Grafik zeigt einen steigenden Saldo. Die Saldenkurve liegt fast immer unter der Kapitalkurve, was darauf hindeutet, dass die Positionen in die richtige Richtung eröffnet werden. Gleichzeitig beträgt die Belastung der Einlage etwa 20 %. Dies ist ein recht hoher Betrag, der jedoch den kumulierten Gewinn nicht übersteigt.

Ergebnisse des Modelltrainings

Ergebnisse des Modelltrainings

Leider fielen die Ergebnisse der EA-Arbeit außerhalb des Trainingssets eher bescheiden aus.


Autor: Dmitriy Gizlyk

 
Hallo. Der Expert Advisor hört nach 30-50 Durchläufen auf, Trades zu eröffnen. Ist das normal oder sollte etwas korrigiert werden? Ich habe 5-7 Versuche mit neuen Modelldateien gemacht. Wenn es ein wenig mehr Pässe ist weiterhin Geschäfte zu öffnen, und wenn es ein wenig weniger ist. Aber immer noch stoppt die Eröffnung von Geschäften. Ich habe versucht, eines der Modelle in 4000 Durchgängen zu trainieren. Das Ergebnis ist das gleiche - eine gerade Linie.
 
Viktor Kudriavtsev #:
Hallo. Der Expert Advisor hört nach 30-50 Durchläufen auf, Trades zu eröffnen. Ist das normal oder sollte etwas korrigiert werden? Ich habe 5-7 Versuche mit neuen Modelldateien gemacht. Wenn es ein wenig mehr Pässe ist weiterhin Geschäfte zu öffnen, und wenn es ein wenig weniger ist. Aber immer noch stoppt die Eröffnung von Geschäften. Ich habe versucht, eines der Modelle in 4000 Durchgängen zu trainieren. Das Ergebnis ist das gleiche - eine gerade Linie.

Guten Tag, Victor.

Die Ausbildung eines Modells ist ein ziemlich langer Prozess. Der Trainingskoeffizient ist in der Bibliothek auf 3,0e-4f eingestellt. D.h. wenn Sie das Modell nur an einem Beispiel trainieren, lernt es dieses in etwa 4000 Iterationen. Eine so geringe Lernrate wird verwendet, damit das Modell die Gewichte mitteln kann, um die Anpassung an die Trainingsstichprobe zu maximieren.

Das Fehlen von Transaktionen ist kein Grund, den Lernprozess abzubrechen. Der Trainingsprozess des Modells ähnelt einer "Versuch-und-Irrtum"-Methode. Das Modell probiert nach und nach alle möglichen Optionen aus und sucht nach einem Weg, die Belohnung zu maximieren. Bei der Entwicklung des Lernprozesses haben wir eine Strafe für das Ausbleiben von Trades eingebaut, die das Modell dazu anregen soll, Positionen zu eröffnen. Wenn das Modell bei einem bestimmten Durchgang keine Geschäfte tätigt, sollte die Strafe nach einer oder mehreren Wiederholungen ihre Wirkung zeigen und das Modell aus diesem Zustand herausbringen. Um diesen Prozess zu beschleunigen, können Sie die Strafe für fehlende Abschlüsse erhöhen. Dabei sollten Sie jedoch darauf achten, dass sie nicht höher ist als der mögliche Verlust aus einem Handel. Andernfalls wird das Modell unrentable Positionen eröffnen, um die Strafe für ihre Abwesenheit zu vermeiden.

 

Dmitriy Gizlyk Vielen Dank für den ausführlichen Artikel. Ich habe das Modell zwischen dem 1. Januar 2023 und dem 31. Mai 2023 nachtrainiert und DDPGAct.nnw und DDPGCrt.nnw erstellt. Beim Testen des EA mit test.ex5 ist jedoch kein einziger Trade zustande gekommen.

Ich habe die folgenden Schritte unternommen:

  1. Study.mq5 und test.mq5 von https://www.mql5.com/de/articles/download/12853.zip herunterladen, entpacken und kompilieren.
  2. Führen Sie in Strategy Tester Study.ex5 einmal aus, wie in https://c.mql5.com/2/55/Study.png angegeben.
  3. Optimieren Sie in Strategy Tester die Datei Study.ex5, wie unter https://c.mql5.com/2/55/Study_opt.png angegeben ; siehe die angehängte Datei Optimized.png
  4. Führen Sie in Strategy Tester test.ex5 (Optimierung: Deaktiviert) für denselben Zeitraum zwischen dem 1. Januar 2023 und dem 31. Mai 2023 aus.
  5. (Kein Fehler und überhaupt kein Handel!)

Ich versuche, mit den folgenden PrintFormat-Zeilen zu debuggen:

...
   double sell_sl = NormalizeDouble(Symb.Bid() + ActorResult[5], Symb.Digits());
   PrintFormat("ActorResult[0]=%f  ActorResult[1]=%f ActorResult[2]=%f buy_sl=%f",ActorResult[0], ActorResult[1],  ActorResult[2], buy_sl);
   PrintFormat("ActorResult[3]=%f  ActorResult[4]=%f ActorResult[5]=%f sell_tp=%f",ActorResult[0], ActorResult[1],  ActorResult[2], sell_tp);
//---
   if(ActorResult[0] > 0 && ActorResult[1] > 0 && ActorResult[2] > 0 && buy_sl > 0)
      Trade.Buy(buy_lot, Symb.Name(), Symb.Ask(), buy_sl, buy_tp);
   if(ActorResult[3] > 0 && ActorResult[4] > 0 && ActorResult[5] > 0 && sell_tp > 0)
      Trade.Sell(sell_lot, Symb.Name(), Symb.Bid(), sell_sl, sell_tp);
...

Ich habe das Folgende überprüft:

...
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072910
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070290
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072830
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070210
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072450
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.069830
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072710
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070090
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.073750
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.071130
...

Kann ich bitte wissen, was schief gelaufen ist oder übersehen wurde?

Vielen Dank!

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2023.11.30
  • www.mql5.com
Trader's profile
Dateien:
Optimized.png  187 kb
 

Hallo. Ich habe den Eindruck, dass es nicht daran liegt, dass das Modell keine Geschäfte eröffnet, sondern dass es nicht darauf ausgelegt ist, Gewinne zu erzielen. Die gerade Linie auf dem Screenshot sagt genau das aus. Es muss etwas an den Reward-Regeln geändert werden.

float reward = (account[0] - PrevBalance) / PrevBalance;

if(Konto[0] == PrevBalance)
if((kauf_wert + verkauf_wert) == 0)

Belohnung -= 1;

Ich habe diese Varianten ausprobiert

float reward = (Konto[0] - PrevBalance) / PrevBalance;

if(Konto[0] == PrevBalance)

if((Kauf_Wert + Verkauf_Wert) == 0)

Gewinn -= 1;

if(kauf_gewinn<10)

Belohnung -= 1;

if(kauf_gewinn>10)

Rendite += 1;

if(verkauf_gewinn<10)

Belohnung -= 1;

if(verkauf_gewinn>10)

Belohnung += 1;

Das hilft mir nicht weiter. Bitte sagen Sie mir, was zu tun ist.

Dateien: