Diskussion zum Artikel "Entwicklung eines Expertenberaters für mehrere Währungen (Teil 17): Weitere Vorbereitung auf den realen Handel"
Yuri hallo! Ich studiere Ihren Code und ich verstehe ein bisschen nicht.... In der Datei SimpleVolumesStrategy.mqh im Konstruktor hast du einen Parameter:
// Registrierung des neuen Bar-Event-Handlers für den minimalen Zeitrahmen IsNewBar(m_symbol, PERIOD_M1);
Warum machen Sie das? Warum genau die Periode M1, und nicht die aktuelle, auf der diese Strategieinstanz gestartet wird? So wie ich das verstehe, wird der Expert Advisor in diesem Fall nicht nach den Eröffnungen eines bestimmten TFs arbeiten, sondern einfach nach M1. Oder verstehe ich etwas falsch?
Und der zweite Punkt - in der Funktion SignalForOpen() hier:
// Wenn die aktuelle Lautstärke den eingestellten Wert überschreitet, dann if(m_volumes[0] > avrVolume * (1 + m_signalDeviation + m_ordersTotal * m_signaAddlDeviation)) { // Wenn der Eröffnungskurs der Kerze niedriger ist als der aktuelle Kurs (Schlusskurs), dann if(iOpen(m_symbol, m_timeframe, 0) < iClose(m_symbol, m_timeframe, 0)) { signal = 1; // Kaufsignal } else { signal = -1; // sonst ein Verkaufssignal } }
Sie haben Bar 0 (aktuell) in den Berechnungen angegeben, obwohl es mir scheint, dass es Bar 1 (zuletzt geschlossen) sein sollte. Es ist nur so, dass Bar 0 auf dem ersten Tick (wenn wir mit Eröffnungskursen arbeiten) keinen Körper hat, und daher ist der Eröffnungskurs immer gleich dem Schlusskurs. Und er kann kein Volumen haben, weil er noch nicht gebildet wurde. Vielleicht verstehe ich etwas falsch, aber es funktioniert irgendwie.... Ich würde gerne verstehen, warum das so ist?
Und auch, wenn ich einige Parameter (neu) in dieser Strategie werfen wollen, muss ich es in der SimpleVolumesStage1.mq5 Expert Advisor in den Einstellungen erstellen und übergeben Sie es an eine String-Variable gibt, und dann in dieser Klasse (SimpleVolumesStrategy.mqh) in den Konstruktor in der richtigen Reihenfolge zu analysieren und das ist es? Oder muss ich es irgendwo anders vorschreiben?
Hallo, Victor.
Die Arbeit des Expert Advisors besteht aus zwei Teilen: der Eröffnung virtueller Positionen und der Synchronisierung der geöffneten virtuellen Positionen mit den realen Positionen. Die eingestellte TF wird nur im ersten Teil verwendet, um das Eröffnungssignal zu bestimmen. Und die Synchronisierung sollte idealerweise bei jedem Tick oder zumindest bei jedem neuen Balken des minimalen Zeitrahmens M1 erfolgen, da eine virtuelle Position jederzeit TP oder SL erreichen kann.
In der Methode VirtualAdvisor::Tick() wird zu Beginn geprüft, ob ein neuer Balken für alle überwachten Symbole und Zeitrahmen, einschließlich M1, aufgetreten ist. Wenn dies nicht der Fall ist, führt der Expert Advisor keine weiteren Aktionen aus. Erst wenn ein neuer Balken auf M1 auftritt, wird er etwas anderes tun. In diesem Fall können Sie im OHLC-Modus auf M1 optimieren und erhalten fast die gleichen Ergebnisse, wenn der EA auf dem Chart arbeitet (wo es alle Ticks gibt). Und die Optimierung ist auf diese Weise viel schneller. Die von Ihnen erwähnte Codezeile ist nur ein Sicherheitsnetz für den Fall, dass wir einen neuen Balken auf M1 in der Strategie nicht verfolgen müssen. Auf diese Weise ist gewährleistet, dass er zumindest auf einem Symbol verfolgt wird.
Wenn Sie möchten, können Sie diese Funktionsweise natürlich über die Variable useOnlyNewBars_ = false deaktivieren. Dann wird der Expert Advisor die Positionen bei jedem verfügbaren Tick überprüfen und synchronisieren.
Die Eröffnung eines neuen M1-Balkens kann innerhalb eines Balkens eines höheren Zeitrahmens erfolgen. Beachten Sie, dass SignalForOpen() den aktuellen Zeitrahmen verwendet, der normalerweise H1, M30 oder M15 ist. Daher werden die Eröffnungs- und Schlusskurse des aktuellen Zeitrahmens nicht mehr übereinstimmen. Außerdem erfolgt diese Prüfung nur, wenn das Tick-Volumen des aktuellen Balkens im aktuellen Zeitrahmen das typische Tick-Volumen eines Balkens deutlich überschritten hat. Dies kann nicht beim ersten Tick geschehen, wenn das Tick-Volumen nur 1 beträgt.
Auf jeden Fall.
Die Arbeit des Expert Advisors besteht aus zwei Teilen: der Eröffnung virtueller Positionen und der Synchronisierung der geöffneten virtuellen Positionen mit den realen Positionen. Die eingestellte TF wird nur im ersten Teil verwendet, um das Eröffnungssignal zu bestimmen. Und die Synchronisierung sollte idealerweise bei jedem Tick oder zumindest bei jedem neuen Balken des Mindestzeitrahmens M1 erfolgen, da die virtuelle Position jederzeit TP oder SL erreichen kann.
In der Methode VirtualAdvisor::Tick() wird zu Beginn geprüft, ob ein neuer Balken für alle überwachten Symbole und Zeitrahmen, einschließlich M1, aufgetreten ist. Wenn dies nicht der Fall ist, führt der Expert Advisor keine weiteren Aktionen aus. Erst wenn ein neuer Balken auf M1 auftritt, wird er etwas anderes tun. In diesem Fall können Sie im OHLC-Modus auf M1 optimieren und erhalten fast die gleichen Ergebnisse, wenn der EA auf dem Chart arbeitet (wo es alle Ticks gibt). Und die Optimierung ist auf diese Weise viel schneller. Die von Ihnen erwähnte Codezeile ist nur ein Sicherheitsnetz für den Fall, dass wir einen neuen Balken auf M1 in der Strategie nicht verfolgen müssen. Auf diese Weise ist gewährleistet, dass er zumindest auf einem Symbol verfolgt wird.
Wenn Sie möchten, können Sie diese Funktionsweise natürlich über die Variable useOnlyNewBars_ = false deaktivieren. Dann wird der Expert Advisor die Positionen bei jedem verfügbaren Tick überprüfen und synchronisieren.
Ich verstehe. Aber können wir zum Beispiel die Synchronisierung der Positionen bei jedem Tick funktionieren lassen, und die Öffnung der virtuellen (neuen) Positionen erfolgt, wenn ein neuer Balken auf dem in der Strategie angegebenen TF (m15,m30,h1) auftritt?
Die Eröffnung eines neuen M1-Balkens kann innerhalb eines Balkens eines höheren Zeitrahmens erfolgen. Beachten Sie, dass SignalForOpen() den aktuellen Zeitrahmen verwendet, der normalerweise H1, M30 oder M15 ist. Daher werden die Eröffnungs- und Schlusskurse des aktuellen Zeitrahmens nicht mehr übereinstimmen. Außerdem erfolgt diese Prüfung nur, wenn das Tick-Volumen des aktuellen Balkens im aktuellen Zeitrahmen das typische Tick-Volumen eines Balkens deutlich überschritten hat. Dies kann nicht beim ersten Tick geschehen, wenn das Tick-Volumen nur 1 beträgt.
Ich verstehe Sie hier ein wenig nicht. Ja, SignalForOpen() verwendet die TF, die in den Einstellungen der aktuellen virtuellen Strategieinstanz festgelegt ist, das kann ich sehen. Aber wenn ich z.B. möchte, dass der Expert Advisor ausschließlich mit den geschlossenen letzten Bars arbeitet, dann muss ich hier angeben
if(m_volumes[0] > avrVolume * (1 + m_signalDeviation + m_ordersTotal * m_signaAddlDeviation)) { // Wenn der Eröffnungskurs der Kerze niedriger ist als der aktuelle Kurs (Schlusskurs), dann if(iOpen(m_symbol, m_timeframe, 0) < iClose(m_symbol, m_timeframe, 0)) {
Ich sollte Einheiten anstelle von Nullen angeben? Verstehe ich das richtig?
Können wir zum Beispiel erreichen, dass die Positionssynchronisierung bei jedem Tick funktioniert und die Eröffnung virtueller (neuer) Positionen erfolgt, wenn ein neuer Balken auf dem in der Strategie angegebenen TF (m15,m30,h1) auftritt?
Ja, dies ist der Fall, wenn useOnlyNewBars_ = false. Diese Variable wird von den Strategien nicht verwendet, sie bestimmen selbst, wann sie auf ein Eröffnungssignal prüfen und wann sie Positionen eröffnen, wenn ein Signal früher empfangen wird. Zum Beispiel nur, wenn ein neuer Balken auf H1 auftritt. In diesem Fall müssen Sie den Code so ändern, dass das in der Mitte des Balkens empfangene Signal bis zum Beginn des nächsten Balkens überlebt. Jetzt wird das empfangene Signal sofort verwendet (führt zur Eröffnung virtueller Positionen), es wird also nirgendwo gespeichert.
Ich verstehe Sie hier nicht ganz. Ja, SignalForOpen() verwendet die TF, die in den Einstellungen der aktuellen Instanz der virtuellen Strategie eingestellt ist, das sehe ich. Aber wenn ich zum Beispiel möchte, dass der EA ausschließlich auf den letzten geschlossenen Bars arbeitet, dann sollte ich hier Einheiten anstelle von Nullen angeben? Verstehe ich das richtig?
Wenn Sie mit den Worten"EA arbeitet strikt auf geschlossenen letzten Balken" meinen, dass wir, wenn das Tick-Volumen den Schwellenwert auf dem aktuellen Balken überschreitet, um die Richtung des Signals zum Öffnen zu bestimmen, den vorherigen Balken nehmen und seine Richtung betrachten, dann haben Sie alles richtig verstanden.
Hallo Yuri. Ich habe einen Fehler beim Ausführen des Expert Advisors SimpleVolumesStage3.mq5 und beim Speichern der Informationen in der Datenbank:
2024.09.11 21:02:09.909 Core 1 2024.09.06 23:54:59 2024.09.11 21:02:09.909 Core 1 2024.09.06 23:54:59 database error, FOREIGN KEY constraint failed 2024.09.11 21:02:09.909 Core 1 2024.09.06 23:54:59 CDatabase::Execute | ERROR: 5619 in query 2024.09.11 21:02:09.909 Core 1 2024.09.06 23:54:59 INSERT INTO strategy_groups VALUES(0, 'EA_EG_EU (H1, M30, M15, 9x16 items)') 2024.09.11 21:02:09.909 Core 1 final balance 24603.99 USD
Was bedeutet er und wie kann ich ihn beheben? Die Tabelle wurde der Datenbank mit Ihrer Abfrage aus dem Artikel hinzugefügt.
Yuri, ich habe mir Ihren Code angesehen und ich sehe, dass der Fehler etwas früher in der Funktion CDatabase::Insert auftritt, das Protokoll schreibt dies:
2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 CDatabase::Insert | ERROR: Reading row for request 2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 INSERT INTO passes VALUES (NULL, 0, 0, 10000.00,0.00,11096.20,21542.31,-10446.11,92.51,-63.35,630.89,39.00,444.04,53.00,-376.27,52.00,-376.27,52.00,9430.69,569.31,5.69,5.69,569.31,9325.11,683.96,6.83,6.83,683.96,2.15,2.06,16.22,3.44,3736.76,8435.00,5170.00,3042.00,2128.00,2766.00,2404.00,1706.00,1336.00,6.00,4.00,99.11,8122.90,'class CVirtualStrategyGroup([ 2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 class CVirtualStrategyGroup([ 2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 class CVirtualStrategyGroup([ 2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 class CSimpleVolumesStrategy("CADCHF",16385,220,1.40,1.70,150,2200.00,200.00,46000,24) 2024.09.12 20:14:11.248 Core 1 2024.09.06 23:54:59 ],66.401062),class CVirtualStrategyGroup([ ..... 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 ],13.365410),class CVirtualStrategyGroup([ 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 class CSimpleVolumesStrategy("CADJPY",15,132,0.40,1.90,0,7200.00,600.00,45000,27) 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 ],13.365410), 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 ],2.970797), 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 ],1.462074)', 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 '', 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 '2024.09.06 23:54:59') RETURNING rowid; 2024.09.12 20:38:26.905 Core 1 2024.09.06 23:54:59 failed with code 5039
Cannot execute
if(DatabaseReadBind(request, row)) {
Worauf kann das zurückzuführen sein? Die zweite Stufe ist bestanden und der Test selbst ist bestanden (die Expert Advisor Trades und Pässe aus der Datenbank werden geladen).
Hallo Victor.
Ich werde bald zurückkommen, um an diesem Projekt weiterzuarbeiten und werde versuchen, die Fehler zu beheben, die ich gefunden habe. Danke, dass du sie gefunden hast. Es ist mir gelungen, einige der Fehler, die du vorhin beschrieben hast, zu reproduzieren. Es stellte sich heraus, dass sie damit zusammenhingen, dass in späteren Teilen Änderungen vorgenommen wurden, die auf eine Sache abzielten, aber darüber hinaus Auswirkungen auf andere Dinge hatten, die im nächsten Artikel nicht berücksichtigt wurden. Dieser Einfluss führte zu Fehlern. Im nächsten Artikel werden wir alle Schritte der automatisierten Optimierung noch einmal durchgehen und alle festgestellten Fehler beseitigen.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Entwicklung eines Expertenberaters für mehrere Währungen (Teil 17): Weitere Vorbereitung auf den realen Handel :
In einem der vorangegangenen Artikel haben wir uns bereits mit den EA-Verbesserungen beschäftigt, die für die Arbeit auf echten Konten notwendig sind. Bis jetzt haben wir uns hauptsächlich darauf konzentriert, akzeptable EA-Ergebnisse im Strategietester zu erzielen. Der echte Handel erfordert viel mehr Vorbereitungen.
Neben der Wiederherstellung des EA-Betriebs nach dem Neustart des Terminals, der Möglichkeit, leicht abweichende Namen von Handelsinstrumenten zu verwenden, und der automatischen Beendigung des Handels, wenn die festgelegten Indikatoren erreicht sind, stehen wir auch vor folgendem Problem: Um den Initialisierungs-String zu bilden, verwenden wir Informationen, die wir direkt aus der Datenbank erhalten, in der alle Ergebnisse der Optimierungen von Handelsstrategie-Instanzen und ihren Gruppen gespeichert sind.
Um den EA auszuführen, müssen wir eine Datei mit der Datenbank im gemeinsamen Terminalordner haben. Der Umfang der Datenbank beträgt bereits mehrere Gigabyte und wird in Zukunft noch wachsen. Es ist also nicht sinnvoll, die Datenbank zu einem integralen Bestandteil des EA zu machen - nur ein sehr kleiner Teil der dort gespeicherten Informationen wird für den Start benötigt. Daher ist es notwendig, einen Mechanismus zur Extraktion und Verwendung dieser Informationen in der EA zu implementieren.
Autor: Yuriy Bykov