Bibliotheken: Symbol

 

Symbol:

Eine Bibliothek, um mit traditionellen und nutzerdefinierte Symbolen arbeiten zu können

Autor: fxsaber

 

Пример

Wenn ein Backtest auf Kreuzen läuft, zieht der Tester nicht nur das Hauptsymbol, sondern auch ein Hilfssymbol, das die Umrechnung der Gewinnwährung des Hauptsymbols in die Kontowährung ermöglicht. Das Ziehen des Hilfssymbols, die Generierung seiner Ticks und die Synchronisierung mit dem Hauptsymbol beansprucht im Einzellauf- und insbesondere im Optimierungsmodus wertvolle Rechenressourcen (und Zeit). Eine solche Präzision ist jedoch fast immer unnötig. Deshalb möchte ich diese Besessenheit/Unvollkommenheit des MetaTrader 5-Testers umgehen. In MetaTrader 4 ist dies einfach möglich - es gibt eine Möglichkeit, die Kontowährung direkt im Tester zu ändern. MetaTrader 5 hat eine solche Möglichkeit nicht.

Das Demoskript zeigt einen Versuch, diese Einschränkung des Testers zu umgehen - unnötige Berechnungen zu entfernen. Zu diesem Zweck wird eine Kopie des Symbols für den Backtest erstellt, aber die Gewinnwährung wird gleich der Kontowährung gesetzt. Das heißt, die Handelsergebnisse müssen nicht umgerechnet werden. Und der Gewinn wird tatsächlich in Pips berechnet, was in manchen Situationen sehr deutlich sein kann.

Es funktioniert!


Und das ist der einfachste Weg, um den Tester schneller und logischer arbeiten zu lassen.


ZЫ Ich habe mich beeilt. Das neue Kreuz zählt korrekt - es wandelt den Gewinn nicht um. Aber aus irgendeinem Grund zieht es Major mit sich, wenn es nirgendwo anders verwendet wird

2017.09.04 14:46:43.062 Core 1  EURCHF_custom: generate 975389 ticks in 0:00:00.063, passed to tester 3210 ticks
2017.09.04 14:46:43.062 Core 1  EURUSD: generate 979976 ticks in 0:00:00.062, passed to tester 8696 ticks
 

Ich habe den Skriptcode leicht bearbeitet, und zwar in den Zeilen :


const SYMBOL Symb(_Symbol + PostFix); // Erstellt ein Symbol

Symb = _Symbol; // Kopiere alle Eigenschaften und den Balkenverlauf vom Hauptsymbol - Klon.


Ersetzte _Symbol mit "SBER".


Ich habe das Skript auf dem Chart der VDSB-Aktie ausgeführt.

Nach der Ausführung des Skripts öffnete sich der SBER_custom-Chart, und anstelle der SBER-Balken wurden die Balken der VDSB-Aktie angezeigt. Das ist nicht logisch. Ich hatte erwartet, dass SBER..... Balken im Chart angezeigt werden.

Während der Ausführung dieser Zeile Symb = "SBER"; aus irgendeinem Grund wird ein Objekt mit dem Wert Name="VDSB" erstellt, d.h. mit dem Namen des Symbols, auf dem das Skript ausgeführt wird.


Leider ist es mir nicht gelungen, diesen Fehler zu beheben. Könnten Sie bitte den Code korrigieren.

 
pivomoe:

Leider ist es mir nicht gelungen, diesen Fehler zu beheben. Könnten Sie bitte den Code korrigieren?

Selbst wenn Sie das Skript ohne Änderungen auf "SBER" Metaquotes-Demo ausführen, sehen Sie, dass das Ergebnis nicht das ist, was Sie erwarten.

Ich habe herausgefunden, dass CustomRatesReplace für einige Zeichen nicht korrekt funktioniert (anscheinend für alle Nicht-Forex-Zeichen), also müssen die Entwickler den Fehler beheben.

 
fxsaber:

Selbst die Ausführung des Skripts ohne Änderungen auf "SBER" Metaquotes-Demo ist genug, um zu sehen, dass das Ergebnis ist nicht das, was Sie erwarten.

Ich habe herausgefunden, dass CustomRatesReplace für einige Symbole nicht richtig funktioniert (anscheinend für alle Nicht-Forex-Symbole), so dass die Entwickler den Fehler beheben müssen.


Ich habe es mit einem echten BCS-Konto ausgeführt. Das ursprüngliche Skript auf dem SBER-Chart funktioniert. Der SBER_custom-Chart mit SBER-Kursen wird angezeigt. Was bedeutet es, dass die Funktion CustomRatesReplace nicht richtig funktioniert? Bei Bedarf kann ich Ihnen erklären, wie Sie ein echtes BCS-Konto mit Nullsaldo erstellen.

 
pivomoe:

Ich habe es mit einem echten BCS-Konto ausgeführt. Das ursprüngliche Skript funktioniert mit dem SBER-Chart. Der SBER_custom-Chart mit SBER-Kursen wird geöffnet. Was bedeutet es, dass die Funktion CustomRatesReplace nicht richtig funktioniert? Bei Bedarf kann ich Ihnen erklären, wie Sie ein echtes Konto auf BCS mit Nullsaldo erstellen.

Danke, und ich habe einen Fehler! In Symbol.mqh Zeile 126

// return(this.CloneProperties() && (this.CloneHistory() != -1)); // Was
return(this.CloneProperties(Symb) && (this.CloneHistory(Symb) != -1)); // Stahl
 
Ich danke Ihnen für Ihre Schnelligkeit. Alles funktioniert.
 

Ein weiteres Szenario für die Verwendung benutzerdefinierter Symbole (nicht unbedingt mit Hilfe dieser Bibliothek).


Es ist möglich, den regelmäßigen Backtest des Expert Advisors auf frischen historischen Daten vollständig zu automatisieren und die Testergebnisse an den Expert Advisor zu übertragen, um das reale Bild mit dem Tester zu synchronisieren. So lässt sich eine solche Handelslogik realisieren, ohne einen eigenen Tester zu schreiben.

Strategietester (MT4) möglichst genau auf die Arbeit auf einem realen Konto zu übertragen.

Meine Überlegungen:

Im Tester arbeitet der Expert Advisor nicht nur unter idealen Handelsbedingungen, sondern in der Tat in einem anderen Modus - im Echtzeitmodus, d.h. für einen Tick schafft er es, den TS zu berechnen, eine Order zu senden und eine Antwort zu erhalten, aber wenn er tatsächlich auf einem Handelskonto eingesetzt wird, ist das nicht so. Es stellt sich heraus, dass wir zwei verschiedene Roboter haben - einer in Echtzeit, der andere nicht. Das Senden/Ändern einer Order (auch nur einer!) an ein reales Konto = Ping + Ausführungszeit, etc. = bestenfalls 100-500ms, und zur gleichen Zeit kommen Ticks, die gezählt werden müssen - und wir stehen da und warten.... und dann kommen wir zufällig in den Stream (wohin sich der Preis in dieser Zeit relativ zu unseren Tick-Durchschnitten entwickelt hat , weiß ich nicht. + wir müssen einige der schnellsten und in der Regel wichtigsten Ticks verpasst haben). Es stellt sich heraus, dass von unserer Strategie, die wir im Tester verwendet haben, am Ende vielleicht nichts mehr übrig ist.

Deshalb bin ich nach einigem Nachdenken zu folgendem Schluss gekommen:

  1. Im Kampfmodus ist die Handelslogik im Expert Advisor ausgeschaltet, und er funktioniert in der Tat als Kopierwerkzeug.
  2. Das Handelssystem wird auf den Indikator übertragen und dieser generiert Befehle zum Öffnen und Schließen, und er wartet nicht darauf, dass der Expert Advisor diese Befehle ausführt, sondern führt einfach den darin eingebetteten TS unter idealen Bedingungen aus, fast wie in einem Testgerät. Soweit ich weiß, sollte der Indikator keine Ticks verpassen, obwohl ich bezweifle, dass dies technisch möglich ist, aber zumindest sollte er sie weniger verpassen als der Expert Advisor, der diese Funktion von Haus aus hat und in der Dokumentation beschrieben ist. + Auch durch die Trennung der Fehler der TC-Berechnung sollte es weniger Fehler geben, da es keine Unterbrechungen für irgendwelche Operationen gibt, die der TC-Logik untergeordnet sind.

Eine weitere Möglichkeit, dieses Schema zu nutzen:

Eine kostenlose Demo-Version des Expert Advisors wird aus dem Market genommen und im Tester auf frischen Kursen gejagt, der Kopierer übernimmt die Daten aus dem Ergebnis des Testers. Die kostenpflichtige Version ist demnach nicht erforderlich.


Vielleicht ist es notwendig, Market Expert Advisors Backtest auf benutzerdefinierten Symbolen zu verbieten....

 

Im Code gibt es eine Zeile wie diese

const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);

Ich habe Ihr Skript nicht überprüft, aber ich schreibe gerade ein Skript für das Massenkopieren von Zeichen. Die Funktionen CopyRates und Bars können nicht mehr zurückgeben, als unter "Einstellungen->Grafik->Max. Balken im Fenster" angegeben ist.

Was bedeuten diese Doppelpunkte in Ihrem Code?

 
pivomoe:

Ich habe Ihr Skript nicht überprüft, aber ich schreibe gerade ein Skript für das Massenkopieren von Zeichen. Die Funktionen CopyRates und Bars können nicht mehr zurückgeben, als in "Einstellungen->Charts->Max. Balken im Fenster" angegeben ist, daher wird der größte Teil der Historie nicht kopiert.

Ich kopiere genau das, was sich bereits in den Charts befindet. Andernfalls dauert es sehr lange - Paging.

Was bedeuten diese Doppelpunkte in Ihrem Code?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

MQL5 Wie kann man wissen, ob ein Handel am Stop Loss geschlossen wurde oder nicht?

fxsaber, 2017.02.14 20:00

Grob gesagt wird vor dem Doppelpunkt der Name der Klasse angegeben, aus der die entsprechende Methode aufgerufen wird.

Wenn vor dem Doppelpunkt nichts steht, ist die Klasse global.

In diesem Fall können alle Doppelpunkte gelöscht werden. Und es ist praktisch, sie aus dem Grund zu verwenden, dass verschiedene Klassen die gleichen Methoden haben können (einschließlich der virtuellen). Und um einen Fehler zu vermeiden, kann ein Doppelpunkt verwendet werden, um eindeutig anzugeben, welche Methode aufgerufen werden soll.

 

Wir sollten etwas hinzufügen wie:

  bool Template(const string Symb = NULL) const
  {
    return(this.CloneProperties(Symb));
  }

Ansonsten werden manchmal nur Eigenschaften benötigt und keine Balken.