Das Problem der Umstellung von MT4 auf MT5. Oder, genauer gesagt, die Unfähigkeit, einige Algorithmen in MT5 ohne Fehler auszuführen. - Seite 11

 

Informationen zum Nachdenken.

Ich beobachte einige der auf dem Marktplatz veröffentlichten EA-Entwicklungen. Oder einige Artikel.

In den Anforderungen an die Brokerauswahl für den EA wird häufig ein geringer Spread angegeben.

Und meiner Meinung nach ist der MT5 weitgehend darauf abgestimmt, schnell auf Marktveränderungen zu reagieren. Dies erklärt, warum alle Bremsen, die auf die Aktualisierung von Angeboten warten, ausgeschaltet sind.

Das heißt, wenn eine Kursaktualisierung stattfindet, verweigert das Terminal den Zugang zu den Zeitreihen. Um einige schnelle Algorithmen nicht zu stören.

Dieses Paradigma hat eine Existenzberechtigung. Und der Handel ist kurz. Sie ist schnell eingegeben. Sammeln Sie ein paar Punkte. Schnell aussteigen.

Aber es gibt noch ein anderes Paradigma.

Es gibt einige extreme Situationen auf dem Markt, in denen sich Marktumkehrungen gebildet haben.

Diese Extreme können schon vor einigen Jahren entstanden sein. Aber sie beeinflussen weiterhin die aktuelle Marktsituation.

In diesem Fall können auch kurzzeitige Änderungen im Tick- oder Minutenverlauf berücksichtigt werden. Aber sie sind nicht entscheidend.

In diesem Fall ist es möglich, auf die Aktualisierung von Kursen zu warten, ohne den Handler aufgrund einer Zugriffsunterbrechung zu verlassen. Und es funktioniert nur in MT4.

Einige Bilder mit Erklärungen zu dem, was gesagt wurde.

Wir nehmen den monatlichen tf. Die Extremwerte vom März 1995, Oktober 2000 und Juli 2007 beeinflussen den Markt weiterhin.

Sogar das Extremum vom Februar 1985 hat eine Wirkung:


Es ist zu erkennen, dass Linien, die mit diesen Extremen gebaut werden, vom Markt wahrgenommen werden.

Lassen Sie uns zu anderen Zeitrahmen übergehen. Ungefähr in einem solchen Verhältnis, als ob wir Wellenaufschläge machen würden. Diese Wahl kann zur Entwicklung einer Wellenebene in jeder TF führen

Wöchentlich tf:

D1:

H4:

M30:

M5:

M1:

Wir sehen, dass Extrema, die weit in der Vergangenheit gebildet wurden, die aktuelle Marktdynamik beeinflussen.

----------------------------------

Es sollte ein ständiger Zugang zu Kostenvoranschlägen für solche Konstruktionen bestehen.

Ich werde fortfahren. Im Grunde wird alles, was auf den Bildern zu sehen ist, im manuellen Handel verwendet.

Aber. Es ist möglich, die Eingänge mehrerer neuronaler Netze mit Kursen verschiedener Zeitrahmen zu füttern, wie zum Beispiel in den Bildern dargestellt. Jede NS wird ihre eigenen Daten verarbeiten. Und geben Sie mit ihrem Output ihr eigenes Verständnis von dem, was vor sich geht. Die Ausgaben der neuronalen Netze werden entsprechend der Empfangszeit der Balken synchronisiert.

In diesem Fall haben die Signale der NS eine höhere Priorität als die einer niedrigeren Priorität.

Die von den neuronalen Netzen empfangenen Signale werden unter Berücksichtigung einer gewissen Priorität in den Eingang des folgenden NS eingespeist. Hier kann es Varianten geben.

Die erste Schicht der neuronalen Netze kann z. B. vom Typ LSTM sein. Mit "Schicht" meinen wir in diesem Fall neuronale Netze, die jeweils Angebote aus ihrem Zeitrahmen erhalten. Jedes neuronale Netz der ersten Schicht kann aus mehreren Schichten von Neuronen bestehen.

Das summierende neuronale Netz kann seine eigene Architektur haben. Dies ist eher eine technische Aufgabe.

Es ist zum Beispiel möglich, mit einem Algorithmus der Handelseröffnung zu trainieren. In der ersten Schicht eines neuronalen Netzes. Das heißt, jedes neuronale Netz der ersten Schicht wird separat trainiert. Wir eröffnen den Handel zum Beispiel am Ende eines Balkens im entsprechenden Layer. Sie können sogar Trades in verschiedenen Richtungen eröffnen. Der Handel ist an Bedingungen geknüpft. Am Ende dieser Geschäfte wird ein Signal zur Schulung der NS gesendet.

Auf diese Weise erhält das aggregierte neuronale Netz das Recht, den besten Handelsmodus zu wählen.

Wir erhalten also einen Algorithmus, der dem vom DeepMinde-Team in Alfa Zero implementierten Algorithmus ähnlich ist.

Sie sollten ein solches Netz auf die gesamte Historie für alle ausgewählten Zeiträume trainieren. Es ist lediglich zu beachten, dass alle Zeitreihen im MT5 auf Minuten basieren. Das ist nicht wahr. Die NCC-Dateien über Eurodollars bis 1993 bestehen aus Zeitreihen. Es muss einen Algorithmus geben, der den wahren Zeitrahmen der Zeitreihe rekonstruiert.

Sie können auf einem Währungspaar trainieren. Und testen Sie es an einem anderen.

------------------------------

Zusammenfassung. Warum ist es bei diesem Ansatz notwendig, schnell auf die Geschehnisse auf dem Markt zu reagieren?

 
Eugeni Neumoin:


Entschuldigung für das Off-Topic, aber solange das Thema interessant ist, kann ich nicht aufhören


Sieg:

Nun, ich meine so:

MQL hat typename() - es gibt String-Typ-Namen zurück, funktioniert sogar

void OnStart()
  {
   Print(typename(Txt()));      // в логе будет       string
  }
string Txt()
{
return(" Txt ");
}

Kenntnis des Typs MyFunc() - Schreiben eines Makros (((, ... Natürlich kann ich alle Makros vom Typ _Try_helper schreiben ... Im Allgemeinen bin ich wahrscheinlich nicht sehr unternehmungslustig, denn ich weiß nicht, wie

 
Igor Makanu:

Entschuldigung für das Off-Topic, aber so lange es ein interessantes Thema ist, kann ich nicht aufhören


Das ist in Ordnung.

 
Igor Makanu:

MQL hat typename() - es gibt String-Typ-Namen zurück, funktioniert sogar

Kenntnis des Typs MyFunc() - Schreiben eines Makros (((, ... Natürlich kann ich alle Makros vom Typ _Try_helper schreiben ... Nun, ich schätze, ich bin kein Spieler, denn ich weiß nicht, wie man

typename() in µl hilft nicht weiter, da es zur Kompilierzeit keinen geeigneten Typ für die Deklaration einer Variablen liefert, sondern ihn nur ausgibt. Es bleiben also Try_d(), Try_i(), ... . Ich weiß nicht, wie man in µl die Funktionalität von decltype erreichen kann.

 
Vict:

typename() in µl hilft nicht weiter, da es Ihnen zur Kompilierzeit keinen geeigneten Typ für die Deklaration einer Variablen liefert, sondern ihn nur ausgibt. Damit bleiben uns nur noch Try_d(), Try_i(), ... . Ich weiß nicht, wie man in µl die Funktionalität von decltype erreichen kann.

Hmm, ich fühle mich überhaupt nicht wie ein Spieler, ich würde sogar sagen, absolut kein Spieler! ))) - Ich weiß nicht, wie, das ist, wie etwas funktionieren wird (ich verstehe wirklich nicht, wie es auf der Maschinenebene "all spinning" ist - ich denke, wir haben eine streng typisierte Sprache?)

void OnStart()
{
  int i = func(1);
  double d = func(1.123);
  string s = func("s");
  Print("i = ",i);
  Print("d = ",d);
  Print("s = ",s);
}

template<typename T>
T func(T invalue)
{
   string s = typename(T);
   if(s=="int") return(invalue);
   if(s=="double") return(invalue);
   if(s=="string") return("Hello word!!!");
return(NULL);
}

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) i = 1

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) d = 1.123

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) s = Hallo Wort!!!


können Sie auch einen Zeiger auf die Funktion beschreiben

typedef void(*TFuncvoidPTR)(void);

und weitere Verwendung

TFuncvoidPTR      func[];
....
func[0]();
 
Vict:

typename() in µl hilft nicht, da es zur Kompilierzeit nicht den für die Variablendeklaration geeigneten Typ liefert, sondern ihn nur ausgibt. Damit bleibt uns nur noch, Try_d(), Try_i(), ... zu multiplizieren. . Ich weiß nicht, wie man in µl die Funktionalität von decltype erreichen kann.

Eine Schablonenfunktion mit einer statischen Variablen vom Typ T.

 
Igor Makanu:

Ich danke Ihnen!

Ich habe Ihre Beiträge gelesen, leider haben Sie in vielerlei Hinsicht recht, gestern habe ich in diesem Thread viel mit Moderator Artem korrespondiert, das Ergebnis des Gesprächs: wenn es so implementiert ist, dann sollte es auch so funktionieren... Generell gilt, wie in der alten Werbung: "Sie wissen einfach nicht, wie man sie kocht!

Imho, die Ergebnisse von MQL5 Compiler sind wirklich fantastisch (es ist sehr produktiv!), aber seine Verwendung als Trading-Terminal... Nun, sagen wir es mal so: es erfordert eine sehr, sehr gute technische Ausbildung und den Wunsch, ~30% mehr Code zu schreiben als "im alten Terminal" ( - auch dieser Satz ist ein gut etablierter Ausdruck im Forum)

Ay-yi-yi... Das habe ich nicht gesagt :)

Ich wollte damit sagen, dass wir das nutzen sollten, was wir haben, um das gewünschte Ergebnis zu erzielen.

Den Rest meiner Gefühle behalte ich für mich.

 
Igor Makanu:

Ich habe nicht gesagt, dass Moderator Artem so etwas gesagt hat, ich habe nur das Ergebnis des Gesprächs geschrieben - ich denke, das ist mein Urteil, das ich nur auf der Grundlage meiner Gefühle und der Analyse des Gesprächs bilden kann .... ))))

d.h. ich weiß nicht, was im Kopf von jemandem passiert ist, ich kann nur meinen eigenen Kopf sehen... zum Glück vorerst nur im Spiegel )))

Ich hätte es geglaubt, wenn anstelle von

das Ergebnis des Gesprächs: Wenn es so umgesetzt wird, dann sollte es auch funktionieren... wie in der alten Werbung "Sie wissen nur nicht, wie man sie kocht!"

war

Meine Schlussfolgerung ist: Wenn es so umgesetzt wird, dann sollte es auch so funktionieren... Es ist wie in dem alten Werbespot: "Ich weiß nur nicht, wie man sie kocht!"

Und so stellt sich heraus, dass ein Kopf aus dem Spiegel zitiert angeblich Moderator Artem...

Und gut, wenn es ein Gespräch unter vier Augen war. Aber öffentlich Rückschlüsse auf meine Worte zu ziehen, die ich nicht gesagt habe, bedeutet, mich öffentlich mit meiner angeblich völlig falschen Meinung in Verbindung zu bringen - ich habe eine völlig andere als die, die angeblich in dem Zitat geäußert wurde.

Ich kann meine Meinung sagen:

Lassen Sie uns das Beste aus dem machen, was wir im Moment haben, jammern Sie nicht, helfen Sie, Fehler zu finden und fragen Sie mit Vorfreude nach Korrekturen - sie werden behoben und neue nette Funktionen erscheinen.

 
Artyom Trishkin:

Ich würde es glauben, wenn anstelle von

es war

Aber wie sich herausstellte, zitierte ein Kopf aus dem Spiegel angeblich den Moderator Artem...

Und gut, wenn es ein Gespräch unter vier Augen war. Aber öffentlich Rückschlüsse auf meine Worte zu ziehen, die ich nicht gesagt habe, bedeutet, mir öffentlich meine angeblich völlig falsche Meinung zu unterstellen - ich habe eine ganz andere als die, die in dem Zitat angeblich geäußert wird.

Ich kann meine Meinung sagen:

Ich beschwere mich nicht, ich helfe bei der Suche nach Fehlern und bitte um deren Behebung - sie werden behoben, und es kommen neue coole Funktionen hinzu.

hmm, wie kompliziert die Dinge geworden sind.... hinter mir aufgeräumt, meine Meinung... wen interessiert das? was wird sich ändern? die entwickler haben ihre eigene vision von ihren produkten, es ist ihr geschäft und meine meinung ... wenn du den Thread nicht in 2 Tagen aktualisierst, wird er nicht mehr ganz oben stehen


... Wie wird es sich ändern ... Nun, heute ein guter Mann@Vict- zeigte mir einige einfache Debugging-Techniken, und vor allem - ich kann Lesbarkeit meines Codes zu erreichen - das hat meine Meinung von MQL5 verändert, und im Allgemeinen, die Mitglieder des Forums

Ich halte jetzt den Mund, zum Glück gibt es ein Forum mit einer langen Geschichte, man kann nicht zurückgehen und zu viele Antworten auf meine Fragen in der Suche nach diesem Forum lesen.

 
Igor Makanu:

fxsaber hat recht - es gibt eine Möglichkeit

 template <typename T> T Try_helper(T val, bool assign) {
   static T sval;
   if (assign)
      sval = val;
   return sval;
}
#define  Try(EXPR, MES)                    \
   Try_helper(EXPR, true);                \
   if (Try_helper(EXPR, false) <= 0.0) {  \
     printf("Error: %s ", MES);           \
     return;                              \
   }

double f(double) {return DBL_MAX;}
ulong f(ulong) {return ULONG_MAX;}

void OnStart()
{

   double d = Try(f(0.), "double error");
   ulong u = Try(f(0), "ulong error");
}

Es ist ein bisschen kitschig - EXPR wird zweimal berechnet, aber es ist trotzdem flexibler. Man kann nicht sagen, dass es universell ist (nur für arithmetische Typen. Der Fehlerwert muss gleich sein, was unangenehm ist. Ich habe versucht, dies durch explizite Spezialisierung der Struktur/Funktion zu vermeiden, aber das ist möglicherweise nicht möglich.

template <typename T> bool Try_helper_is_valid(T val);
template <> bool Try_helper_is_valid<string>(string val) {val==""?false:true;}  // compile-time error

template <typename T>
struct S;
template <>
struct S<string> {...};      // compile-time error

Nun, es scheint, dass man überall Fallen findet, egal wo man in den µl gräbt. Wahrscheinlich ist es besser, sich auf ein kleines, hoch spezialisiertes Makro mit einem festen Typ zu beschränken.

Grund der Beschwerde: