Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Stochastic Net - Bibliothek für den MetaTrader 4

Ansichten:
701
Rating:
(8)
Veröffentlicht:
2016.04.05 15:39
dpnn.dll (68 KB)
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Dieses Stochastic Neuronales Netz wurde in Form einer DLL-Bibliothek für Expert Advisers in MQL4 geschrieben. Diese Bibliothek kann gleichzeitig mehrere Netze umfassen. Ich habe versucht, das Netz so unabhängig wie möglich zu machen, dennoch entschied ich der besseren Kontrolle wegen einige Funktionen einem externen Management zugänglich zu machen. Ich präsentiere es in dieser Form. Dieses Netzes kann seine Größe situationsbedingt ändern. Das Netz kann das primäre Training auslassen, es wird während des Arbeitsprozesses trainiert. In diesem Fall werden die Neuronen unabhängig voneinander erzeugt, trainiert und wieder gelöscht. Ein neues Netz sollte für jede Klasse erzeugt werden. Zum Beispiel für die Erzeugung der Signale Überkaufens und Überverkaufens, sollten Sie ein Netz für den ersten und ein zweites für den zweiten Fall schaffen.

Training

Ein normalisierter Einheitsvektor wird dem Netz übergeben. Die Ausgabe ist eine Zahl [0..1], die die Zugehörigkeit des Eingabevektors zu der Klasse des Netzes kennzeichnet. In dem Moment, wenn das Netz das Muster mit der angegebenen Wahrscheinlichkeit während des Trainings nicht gefunden hat, wird es das durch das neuen Neurons automatisch seinem Gedächtnis hinzufügen. Im Falle eine primären Training empfehle ich 2-3 Wiederholungen. Jedenfalls, sobald das Netz gut lernt, wird die primäre Information erscheinen. Gewöhnlich braucht es nicht mehr als 5 Wiederholungen.

Vorhersage oder Klassifikation um genau zu sein.

Das Ziel der Klassifikation ist die Vorlage des Eingabemusters das zur Klasse des Netzes passt. Wenn das Netz gelernt hat, die Signale die Umkehr eines Abwärts- in einen Aufwärtstrend zu klassifizieren, muss dies mit hohen Ausgabewert nahe 1 begleitet werden. Ich warte mit dem weiteren Vorgehen auf Reaktionen aus dem Netz über die Verwendung durch EAs und den Programmieren.

Die wichtigsten Funktionen für das Arbeiten mit dem Netz

Die CreateNet -Funktion dient zur Erstellung des Netzes.

double CreateNet (string NN, // wir erzeugen ein Netz mit dem Namen NN int InputVectorSize, // mit der Anzahl Neuronen im Eingabevektor<InputVectorSize>
double MinTV, // die Schwelle bei Konflikten von Neuronen
double MaxTV, // die Schwelle für die Individualität
double MW, // das Kriterium der Neuronen-Schwäche
int NL); // die Lebensdauer der Neuronen (in Bar), bei 0 leben sie für immer

Der Einfachheit halber habe ich beschlossen mich auf die Namen des Netzes zu beziehen. Ich erinnere daran, dass Sie mit einer ganzen Gruppe von Neuronalen Netzen arbeiten können. Die Einstellungen für jedes Netz werden bei der Erstellung angegeben und bleiben unbeachtet, bis sie gelöscht werden.

Die Individualität-Schwelle ist notwendig für die Entscheidungen über das Erzeugen neuer Nervenzellen im Verlauf des Trainings. Normalerweise gleich 0,95. Wenn der kleinerer Wert angegeben wird (geringeres Maß der Individualität) versucht das Netz sich anzupassen, so dass nicht eine große Anzahl von Neuronen mit der größere Zahl von Varianten entsprechen würde. In diesem Fall verringert sich die Genauigkeit der Vorhersage. Wenn der Wert der MaxTV hoch ist, wird das Netz sich bemühen, eine neues Neuron für fast jeden Vektor zu erstellen, und das Netz kann so sehr groß werden. Das Netz wird ständig angepasst, so dass die Neuronen nicht miteinander in Konflikt stehen (die Muster sollten nicht miteinander vergleichbar sein). MinTV wurde zu diesem Zweck implementiert, ich setze es gewöhnlich gleich 2. Es reicht, die MaxTV, MinTV und MW-Parameter einmal zu definieren. Weiter ist die Anwendung der Optimierung für die Suche nach besseren Werte der Parameter nicht notwendig.

Der Stärkste überlebt! Dieses Prinzip wird auch hier verwendet. Die schwachen Neuronen sind diejenigen, deren Gewicht unter dem Mindestwert von MW gesunken ist. Diese Neuronen tragen höchstwahrscheinlich die schädliche Informationen und sollte sterben, um keine falsche Signale zu erzeugen.

Falls erforderlich, können ältere Neuronen löschen und so die "alten Stereotypen" loswerden. Dafür sollten Sie die Lebensdauer der Neuronen in den Bars (NL) angeben. Wenn ein neues Neuron erzeugt wurde, merkt es sich diesen Zeitpunkt und erlaubt so später sein Löschen. Daher ist die Angabe des Zeitfaktors obligatorisch, bei der Eingabe beliebiger Daten ins Netz.

Wir verwenden die DestroyNet -Funktion, um das Netz zu löschen. Es ist ganz einfach. Vergessen Sie nicht, die unnötige Netze zu löschen, andernfalls bleiben sie im Arbeitsspeicher des PCs, bis die MetaTrader geschlossen werden muss.

int DestroyNet (String NN); // Löscht das <NetName>-Netz, gibt die Anzahl der verbleibenden Netze zurück

Nicht implementiert ist die Überprüfung von Eindeutigkeit der Namen, Sie können viele Netze mit demselben Namen erstellen. Dennoch werden sich die Netze durch eine Seriennummer voneinander unterscheiden.

string NetName(int i); // Gibt den Namen des Netzes durch die angegebene Seriennummer zurück
int GetNetsNumber(); // Gibt die Gesamtanzahl der Netze in der Bibliothek zurück
int NetNumber (String NetName); // Gibt die fortlaufende Zahl des <NetName> in der Bibliothek des Netzes

Sie sollten das Netz mit Hilfe der Funktion TrainNet trainieren. Die richtige Antwort ist wahrscheinlich für die Einführung der Order notwendig. Zum Beispiel übernehmen wir für die BUY-Signale 1 und -1 für die Verkauf-Signale. Wenn für BUY und SELL verschiedene Netze verwendet werden, wird das innerhalb des Netzes nicht berücksichtigt. Wir nehmen die aktuelle Uhrzeit oder der Open-Zeit der Bar.

double TrainNet(string NetName,
double& iX[], // der eingegebene, normalisiert Vektor der InputVectorSize Größe
int T, // true answer
datetime sT); // Zeitpunkt der Erzeugung des Vektors

Im Verlauf des Trainings können Sie ermitteln, ob das Netz das Muster erkannt und sich angepasst hat, oder es hat es als ein neues hinzugefügt. Verwenden Sie die SizeOfNet-Funktion zu diesem Zweck.

int SizeOfNet(string NetName); // Gibt die Anzahl der Gauss-Neuronen zurück

Sie die Antwort der GetPredict-Funktion lesen. Ihre Parameter sind die gleichen wie die von TrainNet. Wenn Sie den gleichen Vektor eingeben, mit dem das Netz trainiert wurde, dann erhalten Sie der Rückgabewert 1.

double GetPredict(string NetName, // Liefert die Wahrscheinlichkeit [0.. 1] der Zugehörigkeit des Eingangs Vektors zur Klasse
double& iX[],
datetime sT);

Und diese Funktionen sind für die interne Funktionsweise des Netzes erforderlich. Verwenden Sie sie nur so, wie das Beispiel zeigt.

void Shrink(string NetName);
void WReset(string NetName);
void AEqual(string NetName);
void CW(string NetName);
void KillWeaks(string NetName);
void KillOlds(string NetName,datetime sT);

Beispiele zur Verwendung

Das Beispiel der init()-Funktion

Print("Net Created with number: ",CreateNet("OverBought",24,0.2,0.95,0.001,Period()*60*1000)); // Erstellen Sie ein Netz für die Verkauf-Signale
Print("Net Created with number: ",CreateNet("OverSold",24,0.2,0.95,0.001,Period()*60*1000)); // Erstellen Sie ein Netz für die Kauf-Signale

//~~
Print("Initial training started ...");
for (int R = 1; R <= Repetitions; R++) // Prozess des primären Trainings
{ // on the history data
WReset("OverBought"); // Die Werte der Wichtungen auf 0 setzen
InitialTraining("OverBought",HistoryBars,-1); // Starte das Training
Shrink("OverBought"); // Anpassung des Netzes
AEqual("OverBought"); // Setz alle Wichtungen auf 1
CW("OverBought"); // Berechne die Wichtungen
KillWeaks("OverBought"); // Lösche die schwachen Neuronen
CW("OverBought"); // Berechne die Wichtungen

WReset("OverSold"); // Setzt die Werte der Wichtungen auf 0
InitialTraining("OverSold",HistoryBars,1); // Starte das Training
AEqual("OverSold"); // Setzt die Werte der Wichtungen auf 1
Shrink("OverSold"); // Anpassung des Netzes
CW("OverSold"); // Berechne die Wichtungen
KillWeaks("OverSold"); // Lösche die schwachen Neuronen
CW("OverSold"); // Berechne die Wichtungen
FlushReport("OverSold",R); // Ausgabe des Reports in einer Datei

}

Beispiel der start()-Funktion

KillOlds("OverBought",iTime(Symbol(),0,1)); // Lösche die alten Neuronen
PostTraining("OverBought",-1); // Das Training fortsetzen während des Prozesses
Shrink("OverBought"); // Anpassung des Netzes
AEqual("OverBought"); // Setzt alle Wichtungen auf 1
CW("OverBought"); // Berechne die Wichtungen
KillWeaks("OverBought"); // Lösche die alten Neuronen
CW("OverBought"); //Berechne die Wichtungen

KillOlds("OverSold",iTime(Symbol(),0,1));
PostTraining("OverSold",1); // Das Training fortsetzen während des Prozesses
AEqual("OverSold"); // Setzt alle Wichtungen auf 1
Shrink("OverSold"); //Anpassung des Netzes
CW("OverSold"); // Berechne die Wichtungen
KillWeaks("OverSold"); // Lösche die alten Neuronen
CW("OverSold"); // Berechne die Wichtungen

//--------------------------------------------------------------------
double OverBought = Predict("OverBought");
double OverSold = Predict("OverSold");
Out = (OverBought - OverSold)/(OverBought+OverSold);

Das Beispiel der deinit()-Funktion

Print("Destroying net=>",Destroy ("OverBought")); // Löscht, was wir verlängert haben
Print("Destroying net=>",Destroy ("OverSold")); // Löscht, was wir verlängert haben

Die Arbeitsfähigkeit des Netzes wird erfolgreich überprüft. Die guten Ergebnisse hängen von der Methode der Erzeugung des Eingangs Vektors ab. Es ist wichtig zu verstehen, dass die Vektoren, die vorher bekannt sind, dass sie die Bedingungen der Klasse beantworten, während des Trainings eingegeben werden sollten. Einfach gesagt, wenn ein Netz für Verkauf-Signale entsteht, sollte die Bar für den Trainingsvektor in der Tat ein Verkauf-Signal beinhalten. Andernfalls würde das Netz widersprüchliche Signale sammeln und Sie nicht das gewünschte Ergebnis erhalten.

Ich lade Sie ein, folgende Fragen zu diskutieren:

1. Die Formung des Eingabevektors - derzeit benutze ich 24 Parameter (die Differenz zwischen den gleitenden Durchschnitten), normalisiert zur Einheitlichkeit für den Bereich der 24 Bars. D. h. ich berechnen eine 24 x 24-Matrix. Dann normalisiere ich es und verwende die letzten Werte.

2. Die Bestimmungen über die "richtige Antwort" - d.h. wenn der ausgegebene Vektor das Signal ist. Ich benutze AMA derzeit. So weiß ich, ob ein Signal existiert, bereits nach zwei Bars.

Das war's

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/8514

RSI_Test RSI_Test

Beruht auf dem RSI Indikator.

Suchmuster Suchmuster

Der Indikator sucht nach den Mustern und zeigt das Ende der D- und C-Punkte auf dem Schirm.

Starter Starter

Starter Expert Advisor.

ZerolagStochs ZerolagStochs

Ein Analogon der Schnittpunkte der beiden Stochastiks.