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

 
Die Datei im Download ist falsch, bitte korrigieren Sie sie.
 

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.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

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.

Dateien:
myFirstEA.mq5  25 kb
 

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();

}

//+------------------------------------------------------------------+

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Joosy #:

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.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

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:

   bool Buy_opened = false, Sell_opened = false; // variables to hold the result of the opened position

Aber diese werden anschließend wieder gesetzt, wenn dementsprechend eine Position vorliegt.

   if(PositionSelect(_Symbol) == true) { // we have an opened position

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //It is a Buy

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // It is a Sell

      }

   }

 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😉

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
         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;

   bool Buy_opened = false, Sell_opened = false; // variables to hold the result of the opened position
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

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.

Dateien:
my_first_ea.mq5  12 kb
 

Tester - "Nicht unterstützter Füllmodus"

Ich habe es bei 3 verschiedenen Brokern versucht. Wo liegt das Problem?