Diskussion zum Artikel "Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5" - Seite 29

Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Hallo allerseits,
ich habe Samuels EA derzeit auf einem Demokonto laufen und bin durchaus zufrieden. Gute Programmierung!
Er zeigt immer mal wieder gute Handelsabläufe, aber er hat eine Schwäche:
SELL-Optionen häufen sich bei Wendepunkten im Tal der Chartverläufe und dasselbe an entsprechenden Scheitelpunkten mit BUY-Optionen, die dann erstmal massiv als Negativa zu buche schlagen. Ich würde das gerne umprogrammieren, d. h. BUYs im Tag, SELLs auf dem Scheitel, und scheitere mit meinen Versuchen bislang. Ich beherrsche auch nur rudimentär MQL5.
Kann mir jemand helfen?
SG und vielen Dank!
So etwas funktioniert meist nicht, weil dann auch die anderen Punkte, an denen der EA eine profitable Position eingeht, umgedreht werden ....
Lies aber mal das hier:
EA-freelancer Pflichtenheft : https://www.mql5.com/de/articles/4368
Indi : https://www.mql5.com/de/articles/4304
How to Order a Trading Robot in MQL5 and MQL4 : https://www.mql5.com/de/articles/117
Mit den dortigen Hinweisen kannst Du Deine Idee genauer präzisieren, sei es nur für Dich, um zu sehen, ob es geht, oder sei es, um jemanden zu bitten es zu tun, mit oder ohne Bezahlung.
Hallo an alle (besonders an den lieben Autor)
Ich habe bei diesem Artikel mitgeschrieben. Er hat mir viel Spaß gemacht und ich habe eine Menge daraus gelernt.
Danke, dass Sie einen so informativen Artikel geschrieben haben.
Allerdings habe ich ein Problem. Mein EA hat keine Aufträge erteilt. Ich habe den Code des Autors heruntergeladen, aber auch er hat keine Aufträge platziert.
Da der Artikel 13 Jahre alt ist, nehme ich an, dass der Code inzwischen veraltet ist. Kann mir jemand weiterhelfen?
Mein Code befindet sich in der Datei unten. Vielen Dank an alle im Voraus.
Hallo, ich möchte Sie warnen, dass ich ein Anfänger bin, so schwöre nicht viel, wenn überhaupt)
Ich wollte einen Expert Advisor durch den Generator erstellen (und alles scheint gut zu sein, aber es gibt ein aber)
Ich möchte ein Geschäft nicht sofort öffnen, nachdem das vorherige geschlossen wurde, sondern zum Beispiel nach einer Kerze,
Ich habe versucht, etwas zu schreiben, aber am Ende gibt es einen Fehler.
Kann jemand helfen, mit diesem, oder angeben, was der Fehler und wie man es beheben?
und hier ist der eigentliche Code:
//+------------------------------------------------------------------+
//| ParExpert.mq5 |
//| Copyright 2022, MetaQuotes Ltd. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- verfügbare Signale
#include <Expert\Signal\SignalSAR.mqh>
//--- verfügbare Trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- verfügbares Money Management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs |
//+------------------------------------------------------------------+
//--- Eingaben für Experte
input string Experte_Titel = "ParExperte"; // Name des Dokuments
ulong Expert_MagicNumber = 24195; //
bool Expert_EveryTick = false; //
//--- Eingaben für das Hauptsignal
input int Signal_ThresholdOpen = 10; // Signalschwellenwert zum Öffnen [0...100]
input int Signal_ThresholdClose = 0; // Signalschwellenwert zum Schließen [0...100]
input double Signal_PriceLevel = 0.0; // Preisniveau für die Ausführung eines Geschäfts
input double Signal_StopLevel = 500; // Stop Loss Level (in Punkten)
input double Signal_TakeLevel = 70; // Take Profit-Level (in Punkten)
input int Signal_Expiration = 4; // Verfall von Pending Orders (in Takten)
input double Signal_SAR_Step = 0.02; // Parabolic SAR(0.02,0.2) Geschwindigkeitsinkrement
input double Signal_SAR_Maximum = 0.2; // Parabolic SAR(0.02,0.2) Maximale Geschwindigkeit
input double Signal_SAR_Weight = 0.6; // Parabolic SAR(0.02,0.2) Gewicht [0...1.0]
//--- Eingaben für Trailing
input int Trailing_FixedPips_StopLevel = 0; // Stop Loss Trailing-Level (in Punkten)
input int Trailing_FixedPips_ProfitLevel= 10; // Take Profit Trailing-Level (in Punkten)
//--- Eingaben für Geld
Eingabe double Money_FixLot_Percent = 10.0; // Prozent
Eingabe double Money_FixLot_Lots = 0.1; // Festes Volumen
//--- Eingaben für den Trade Cooldown
input int Expert_TradeCooldown = 1; // Cooldown-Periode zwischen den Trades (in Takten)
//+------------------------------------------------------------------+
//| Globales Expertenobjekt |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Initialisierung des Experten
if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Initialisieren des Experten");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Signal erzeugen
CExpertSignal *signal = new CExpertSignal;
if (signal == NULL)
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Erzeugen des Signals");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//---
ExtExpert.InitSignal(Signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Filter CSignalSAR erstellen
CSignalSAR *filter0 = new CSignalSAR;
if (filter0 == NULL)
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Erstellen von filter0");
ExtExpert.Deinit();
return (INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Filterparameter setzen
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Gewicht(Signal_SAR_Gewicht);
//--- Erzeugen des Trailing-Objekts
CTrailingFixedPips *trailing = new CTrailingFixedPips;
if (trailing == NULL)
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler bei der Erstellung von Trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Trailing zum Experten hinzufügen (wird automatisch gelöscht))
if (!ExtExpert.InitTrailing(trailing))
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Initialisieren der Nachsilbe");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Trailing-Parameter setzen
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Erstellung eines Geldobjekts
CMoneyFixedLot *money = new CMoneyFixedLot;
if (Geld == NULL)
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Erstellen von Geld");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Geld zum Experten hinzufügen (wird automatisch gelöscht))
if (!ExtExpert.InitMoney(money))
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Initialisieren von Geld");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Geld-Parameter setzen
money.Percent(Money_FixLot_Percent);
Geld.Lots(Geld_FixLot_Lots);
//--- Alle Parameter der Handelsobjekte prüfen
if (!ExtExpert.ValidationSettings())
{
//--- fehlgeschlagen
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Einstellen aller notwendigen Indikatoren
if (!ExtExpert.InitIndicators())
{
//--- fehlgeschlagen
printf(__FUNCTION__ + ": Fehler beim Initialisieren der Indikatoren");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Initialisierung der Variablen für die letzte Handelszeit
datetime lastTradeTime = 0;
ExtExpert.SetVariable("LastTradeTime", lastTradeTime);
//--- ok
return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick"-Ereignishandlerfunktion |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Zeit seit dem letzten Handel prüfen
datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");
int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);
if (cooldownBars < Expert_TradeCooldown)
{
//--- Handels-Cooldown-Periode nicht verstrichen, Eröffnung eines neuen Handels überspringen
zurückgeben;
}
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Handel"-Ereignishandlerfunktion |
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Timer"-Ereignishandler-Funktion
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Hallo zusammen😊
@Mario31415927
Das liegt ganz einfach daran, dass im Ticker, jedes Mal, wenn eine neue Periode- bzw. neuer Balken (wie auch immer) die Variablen:
zurückgesetzt werden, unabhängig davon, ob bereits Positionen offen sind oder nicht.
Lässt sich ja im Code relativ schnell finden.
Hier stellt sich mir allerding die Frage, ob das beabsichtig wurde, und wenn ja, wie werden dann alle Positionen wieder geschlossen?
Vielleicht verstehe ich auch den Ordertyp TRADE_ACTION_DEAL in dem Zusammenhang nicht?
Den Ablauf der Handelsorder könnte man auch einfach auf die Handelsklasse Trade anpassen. Wie z.B.:
Schöne Grüße:-)Lies mal: https://www.mql5.com/de/articles/232
Das erklärt den Unterschied und die Zusammenhänge von Orders, Positionen und Deals. Letztere spiegeln die Buchungsvorgänge auf Brokerseite.
Lies mal: https://www.mql5.com/de/articles/232
Das erklärt den Unterschied und die Zusammenhänge von Orders, Positionen und Deals. Letztere spiegeln die Buchungsvorgänge auf Brokerseite.
Hallo Carl,
danke für den Hinweis!
Ich muss mich allerdings berichtigen.
Es ist zwar richtig, dass die Variablen bei jeder neuen Zeitperiode zurückgesetzt werden:
Aber diese werden anschließend wieder gesetzt, wenn dementsprechend eine Position vorliegt.
Bei mir tritt jedoch das Phänomen auf, dass die Buy (POSITION_TYPE_BUY) korrekterweise abgefragt wird, jedoch nicht die Sell (POSITION_TYPE_SELL). Die Variable wir einfach nicht mehr gesetzt??
Muss den Code Schritt- für Schritt durch-debuggen. Das kann doch nur ein logischer Fehler sein😉
Sell_opened = true; // It is a Sell
Ohje, ich steh heute sowas von auf der Leitung.
Es wird ja auch nur einmal abgefragt. Das ist der Fehler;-)
Hier sollten wie folgt alle Positionen abgesucht werden;
Es war tatsächlich ein Fehler, es scheint eine Webdatei zu sein.
Ich habe sie auf der Grundlage des Inhalts selbst neu geschrieben und hochgeladen. Ich weiß nicht, ob es irgendwelche Details gibt, denn ich bin neu auf diesem Gebiet. Hoffentlich hilft es.
Tester - "Nicht unterstützter Füllmodus"
Ich habe es bei 3 verschiedenen Brokern versucht. Wo liegt das Problem?