EA N7S_AO_772012 - Seite 30

 
SHOOTER777 >> :

А

leider ist diese Beobachtung unglücklich...auch bemerkt...

 

SHOOTER können Sie uns kurz erklären, was genau die Parametergruppen optimieren

  • x
  • y
  • z
  • X
  • Y
  • Z
Wahrscheinlich verstehe ich einiges davon, aber ich habe noch nicht das ganze Bild im Kopf.
 

Hier ist eine weitere Merkwürdigkeit, oder vielleicht nur ein Fehler

double BTS() {
	if (( prcptrnz1() > 0 || F==0) && bu< HM_Up_X) {
		if ( prcptx1 > 0 && Delta_G12>0) {
			sl = slx; 
			tp = tpx * slx; 
			mn = mnx1; 
			return (1);
		}
	} 
	if (( prcptrnz1() < 0 || F==0) && sll< HM_Dn_Y) {
		if ( prcpty1 > 0 && Delta_G12<0) {
			sl = sly; 
			tp = tpy * sly; 
			mn = mny1;
			return (-1);
		}
	}
	return (0);
}

Es stellt sich heraus, dass, wenn nun F == 0 ist und es überhaupt keine offenen Positionen gibt - dann können wir zuerst in den ersten und dann in den zweiten Block einsteigen, was dann zu falschen Ergebnissen führt.

Oder übersehe ich etwas?

 

Wahrscheinlich aber nicht. Wir können nicht in beide Blöcke gleichzeitig eindringen, weil sie uns nicht reinlassen.

Delta_G12

lässt uns nicht rein.

 
ShestkoFF писал(а) >>

Ich kritisiere nicht gerne Dinge, die funktionieren. Ich werde Ihnen nur einige Kritikpunkte am Code nennen:

Spsb. Ich verstehe die Kritik nicht als Kritik, sondern als Anleitung zum Handeln, d.h. zumindest ein wenig im MQL-Handbuch zu lesen.

  • Ichmöchte nicht alles in Zeilen schreiben, denn dann ist es unmöglich, den Code zu lesen.

Akzeptiert, aber wahrscheinlich in zukünftigen Arbeiten. Zu dieser "Handschrift" kam ich nach einigen anderen, globaleren Projekten und aufgrund der geringen Auflösung meines 12-Zoll-Monitors. Ihre Version sieht zweifellos besser aus, aber ich müsste ständig vor und zurück durch die Liste blättern. Aber da ich nicht für mich selbst hier bin, sage ich es noch einmal - ich werde es im Kopf behalten.

  • Sinnvolle Benennung von Variablen

Siehe oben! Obwohl ich meine Namen mag, muss man sich einfach an sie gewöhnen, so wie wir uns an die Abkürzungen GOELRO, OBHSS, IMHO usw. gewöhnt haben. Wenn Sie genau hinsehen, habe ich einigen Variablen mehr oder weniger sinnvolle Namen gegeben, aber alle Vokale abgekürzt.

  • Machen Sie Variablen nicht global, wenn sie lokal sind.

Ich habe die Variablen noch nicht in den Griff bekommen. Wenn Sie den Code von Grund auf neu schreiben, haben Sie keine Ahnung, wo eine Variable liegen wird, also ist fast alles global.

  • Es macht keinen Sinn, globale Variablen nicht statisch zu machen. Sollte dies nicht der Fall sein, erläutern Sie dies bitte.

empirisch ist es nicht so, ich werde mich daran erinnern, wo ich es gefunden habe - ich glaube, es war in der Funktion BuSll ()

  • Verwenden Sie die in der Sprache definierten Standardkonstanten. Zum Beispiel die Angabe eines Zeitintervalls. double iA_C (int pr){int tmfr=60; return(iAO(Symbol(), tmfr, pr));} Ich denke, es ist besser, es durch double iA_C (int pr){return(iAO(Symbol(), PERIOD_H1, pr));} zu ersetzen.

Ich stimme zu, korrigieren wir es wieder, wenn man einen Block von Null an schreibt, hat man noch keine Ahnung, welche Parameter man der Funktion übergeben wird, und dann wird das Auge "schmutzig" und man achtet nicht auf solche "Kleinigkeiten" ))

 
ShestkoFF писал(а) >>

SHOOTER können Sie uns kurz erklären, was genau die Parametergruppen optimieren

  • x
  • y
  • z
  • X
  • Y
  • Z
Wahrscheinlich verstehe ich das zum Teil, aber ich habe noch nicht das ganze Bild im Kopf.

Die wichtigste treibende und lenkende Kraft des Expert Advisors ist die berüchtigte)) Funktion G12(). In dieser Funktion werden die bevorzugten Handelsrichtungen anhand von Indikatoren berechnet. Aber eine Richtung ist nicht genug - wir brauchen Einstiegspunkte. Bei "Klassikern" wird auf einem Zeitrahmen entweder nach Patterrons gesucht, oder der Indikator selbst wird angepasst, wenn es externe Parameter gibt, wenn es zwei oder mehr gibt, werden diese ebenfalls optimiert. Ich habe eine weitere für mich neue Methode ausprobiert NN

Hier diese Funktion

double prcptrnAC(int q1,int q2,int q3,int q4,int pr,int at)

{double qw = (q1-50)+((q2-50)*iA_C(pr)+(q3-50)*iA_C(2*pr)+(q4-50)*iA_C(3*pr))/iA_C(1);

if (MathAbs(qw)>at) return(qw);else return(0);}

eine Art Perzeptron, das darauf ausgelegt ist, etwas zu bekommen..... Hier finden Sie einige Antworten auf viele Fragen, und zwar besser, als ich sie beantwortet hätte. Wie man eine profitable Handelsstrategie findet" und Neural Net Recipes. Zugegeben, ich selbst habe alles schräg gelesen und bin durch das Studium der Arbeiten anderer interessanter geworden, siehe unten.

Dieser EA ist "erstellt auf" MTS "Neural network + MACD" von Batohov, MTS "Сombo", "Combo_Right" & AI von Reshetov, PROphet von PraVedNiK,RSI_Test von zerkmax, auto_optimization.mqh von Igor Malcev und einigen anderen.

 
ShestkoFF писал(а) >>

Hier ist eine weitere Merkwürdigkeit, oder vielleicht nur eine Panne

Es stellt sich heraus, dass, wenn nun F == 0 ist und es überhaupt keine offenen Positionen gibt - dann können wir zuerst in den ersten und dann in den zweiten Block einsteigen, was dann zu falschen Ergebnissen führt.

Oder verstehe ich vielleicht etwas nicht?

F == 0 nur in den ersten beiden Optimierungsphasen, wenn zusätzlich zu Delta_G12 noch Trd_Up_X und Trd_Dn_Y vorhanden sind.

Wenn alle sechs Schritte ordnungsgemäß durchlaufen werden und die Optimierungssetdateien nacheinander verwendet werden, sollte F immer gleich 1 sein.

Und bei der Überprüfung des Codes habe ich einen weiteren Fehler gefunden. Ich sehe, dass die neuesten Versionen schlechter funktionieren. Dieser Fehler trat in den Versionen 7 und 9 auf.

Hat das jemand bemerkt?

 
SHOOTER777 >> :

Hier diese Funktion

double prcptrnAC(int q1,int q2,int q3,int q4,int pr,int at)

{double qw = (q1-50)+((q2-50)*iA_C(pr)+(q3-50)*iA_C(2*pr)+(q4-50)*iA_C(3*pr))/iA_C(1);

if (MathAbs(qw)>at) return(qw);else return(0);}

eine Art Perceptron genannt und soll .... etwas bringen.

Das ist mir im Moment noch ein Rätsel. Natürlich weiß ich, wozu es dient und wozu es gut ist. Aber die Formel selbst ist etwas ungewöhnlich.
Das Ergebnis der Arbeit der Neuronen sollte eine Zahl sein, die sich aus der Summe der Eingänge der Neuronen multipliziert mit den Gewichten dieser Eingänge ergibt.
D.h. logischerweise müsste es in etwa so aussehen:

double qw = (q1-50) * iA_C(1) + (q2-50) * iA_C(pr) + (q3-50) * iA_C(2 * pr) + (q4-50) * iA_C(3 * pr)

Offensichtlich handelt es sich bei beiden um eine Funktion von 4 Variablen (oder sind es 8?), die an der Ermittlung des Maximums (des sich daraus ergebenden Gleichgewichts) beteiligt ist, aber es ist trotzdem seltsam :)

 
ShestkoFF писал(а) >>

Diese Funktion ist mir immer noch ein Rätsel. Natürlich verstehe ich, was sie tut und warum sie das tut. Aber die Formel selbst ist etwas ungewöhnlich.
Das Ergebnis der Arbeit der Neuronen sollte eine Zahl sein, die sich aus der Summe der Eingänge der Neuronen multipliziert mit den Gewichten dieser Eingänge ergibt.
Logischerweise müsste es also in etwa so aussehen:

double qw = (q1-50) * iA_C(1) + (q2-50) * iA_C(pr) + (q3-50) * iA_C(2 * pr) + (q4-50) * iA_C(3 * pr)

Offensichtlich sind beide eine Funktion von 4 Variablen (oder sind es 8?), die an der Ermittlung des Maximums (resultierendes Gleichgewicht) beteiligt sind, aber es ist trotzdem seltsam :)

Sie haben eine vereinfachte Version der Funktion angegeben, zumindest habe ich sie so verstanden

Hier wird das Thema diskutiert

MTS 'Sombo'.

Fairerweise muss man sagen, dass es sich nicht um ein neuronales Netz in seiner reinsten Form handelt. Erstens fehlt ein Schwellenwert, ohne den die Teilungsfähigkeit des NS viel geringer ist. Zweitens ist es meiner Meinung nach sinnvoll, eine Schwelle für die Aktivierung des Ausgangs hinzuzufügen. Was bedeutet das? Das Signal wird nur dann zum Handel zurückgegeben, wenn die Aktivierungsschwelle überschritten wird. Zum Beispiel:

double res = (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 // )/Close[0] - T); // Division durch Close[0] zur Vereinheitlichung
if (MathAbs(res) > ActivityThreshold) return(res); // ActivityThreshold -- Aktivierungsschwelle

 
gorby777 писал(а) >>

In früheren Versionen wurde Close(0) in der Perceptron-Formel z1 verwendet, in 7 und 9 jedoch Close(1). Ist es das, worüber wir hier reden?

Nein, ich glaube nicht, dass es darum geht, schließlich gibt es eine Vorschrift, an geformten Stäben zu arbeiten.

Aber die Tatsache, dass die Flagge Flq=false; eine für Kaufen und Verkaufen hat einen großen Einfluss auf die Trennung dieser beiden Handelsrichtungen und damit auf die Ergebnisse.

Grund der Beschwerde: