Diskussion zum Artikel "Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben" - Seite 2

[Gelöscht]  
Yedelkin:
Wenn das Bid bei der Eröffnung bei 1,2695 liegt, haben wir bereits automatisch 5 Pips Verlust. Wenn der SL gleichzeitig 50 Pips beträgt, wie vom Entwickler vorgesehen, dann müssen 45 weitere Pips in die ungünstige Richtung vergehen, bevor er ausgelöst wird. D.h., wenn der Stop-Loss ausgelöst wird, sollte Bid nicht bei 1,2645, sondern bei 1,2650 und Ask bei 1,2655 liegen.

1. Über den Verlust von 5 Pips bei der Eröffnung.

Sie haben Recht mit dem Verlust, wenn wir die Position im gleichen Moment (bedingt) schließen, erhalten wir einen Verlust in Höhe des Spreads, also genau 5 Pips.

Denn Long-Positionen werden zum Geldkurs (Gegenkurs) geschlossen.

Zumindest logischerweise sollten wir in diesem Fall diesen Verlust erhalten (und das ist richtig).

Dies gilt auch für das Schließen mit einer Gegenorder. Was glauben Sie, welches Ergebnis wir erhalten, wenn der Gegenauftrag zum Preis von 1,2695 ausgelöst wird (wo sich der Geldkurs im Moment befindet)?

Nun, Sie werden doch nicht behaupten, dass der Eröffnungskurs von SHORT-Positionen Ask?

2. Lassen Sie uns den BU-Schluss behandeln

Wir erinnern uns, dass wir eine Buy-Position bei 1,27 eröffnet haben (dieser Preis ist jetzt ein BU-Level für uns).

Es ist vernünftig anzunehmen, dass der BU-Schluss erfolgt, wenn der Bid-Kurs 1,27 erreicht (d.h. er steigt um genau 5 Pips an).

Überprüfen wir unsere Aussage, indem wir den CU mit Hilfe einer Gegenorder schließen. Der Eröffnungskurs einer solchen Position sollte bei 1,27 liegen, und wie wir wissen, werden Verkaufsaufträge zum Geldkurs erteilt. Derzeit liegt der Geldkurs bei 1,2695. Um in der BU zu schließen, müssen also 5 Pips überschritten werden, so dass es keinen Fehler in den Berechnungen gibt und die Aussage korrekt ist.

3. über SL und TP

Hier gelten zwei Aussagen:

а. Longs öffnen zum Ask und schließen zum Bid; Shorts öffnen zum Bid und schließen zum Ask.

б. Der Abstand zu TP und SL wird aus dem Eröffnungskurs berechnet, die Berechnung berücksichtigt die Richtung der Position.


In genauer Übereinstimmung mit der zweiten Aussage werden wir die SL- und TP-Preise für unser Beispiel bestimmen. Beim Eröffnungskurs von 1,27 ist SL = 1,2650 und TP = 1,28 (gemäß den oben beschriebenen Bedingungen).

Gemäß der ersten Anweisung wird die LONG (und in unserem Beispiel ist es die LONG) unter der Bedingung eröffnet, dass Ask gleich 1,27 ist (und Bid gleich 1,2695, basierend auf dem Spread von 5 Pips). 4.

4. nun wollen wir bestimmen, unter welchen Bedingungen unser SL und TP ausgelöst werden.

Unsere Position wird geschlossen, wenn eine der Bedingungen erfüllt ist (wenn es keine anderen Faktoren gibt):

Bei TP - Wenn Bid 1,28 erreicht (100 Pips von 1,27), liegt Ask zu diesem Zeitpunkt bei 1,2805 (die erste Aussage und die Größe des Spreads gelten hier).

Überprüfen wir unsere Aussage, indem wir mit einer Gegenposition auf TP schließen. Der Eröffnungskurs einer solchen Position sollte bei 1,28 liegen, und wie wir wissen, werden Verkaufsaufträge zum Bid platziert. Derzeit liegt das Bid bei 1,2695. Um auf TP zu schließen, ist es daher notwendig, 5 Pips (zur Deckung von Verlusten auf dem Spread) + 100 Pips zur Fixierung des Gewinns abzugeben.

Auf SL - Wenn der Preis das SL-Niveau erreicht, das, wie wir uns erinnern, bei 1,2650 liegt.


Lassen Sie uns nun verstehen, welcher Preis das sein wird. Logischerweise sollte es der Geldkurs sein (der dem Eröffnungskurs der Gegenorder entspricht).

Wir erinnern uns, dass der Geldkurs derzeit (gemäß der Bedingung der Positionseröffnung) bei 1,2695 liegt. Daher muss der Preis 45 Pips überschreiten, bevor der SL ausgelöst wird.

Wir werden also einen Verlust in Höhe des Spreads (5 Pips) + 45 Pips, die der Kurs vor dem Auslösen des SL passieren musste, verbuchen.

Unter diesem Gesichtspunkt haben Sie Recht.

Überprüfen wir unsere Aussage, indem wir eine SL-Position mit einer Gegenposition schließen. Der Eröffnungskurs einer solchen Position sollte bei 1,2650 liegen, und wie wir wissen, werden Verkaufsaufträge zum Bid eröffnet. Derzeit liegt der Geldkurs bei 1,2695. Um auf SL zu schließen, muss man also 45 Pips abgeben. Wenn SL ausgelöst wird, wird ein Verlust von 50 Pips verzeichnet (5 Pips auf den Spread + 45 Pips auf die Bewegung gegen uns).

PS

Aber unter diesem Gesichtspunkt ist dieses Beispiel für MQL4 für mich nicht sehr klar.

int ticket;

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
    {
     ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #"+counter,16384,0,Green);
     if(ticket<0)
       {
        Print("OrderSend failed with error #",GetLastError());
        return(0);
       }
    }

Genauer gesagt, ich bin nicht sehr klar, auf der Grundlage welcher Logik und welche Aussagen SL und nur es berücksichtigt wird.

Aber anhand dieses Beispiels (und nur anhand dieses Beispiels) komme ich zu folgendem Ergebnis

//Basisches Beispiel
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL = Bid-Loss*Point,TP = Ask+Profit*Point,"My order #"+counter,16384,0,Green);
//Auftrag zur Eröffnung einer Marktposition
ticket=OrderSend(Symbol(),OP_BUY,1,1.27,3,1.2645 = 1.2695-50*Point,1.28 = 1.27+100*Point);

Auf der Grundlage der Werte Open = 1,27, SL = 1,2645 und TP = 1,28 verstehe ich folgendes:

1. Die Position wird eröffnet, wenn Ask den Preis von 1,27 erreicht (in unserem Fall ist er bereits dort);

2. Die BU-Ebene befindet sich auf dem Preis von 1,27 und um darauf zu schließen, sollte der Kurs des Symbols (in unserem Fall EUR) um die Spread-Größe (in unserem Fall 5 Pips) steigen;

3. Im Moment der Eröffnung erhalten wir sofort einen Verlust in Höhe des Spreads (falls wir die Position SOFORT schließen), da die offene Position, basierend auf logischen Anweisungen, mit einer Gegenorder geschlossen werden sollte. Im MQL4-Code sieht eine solche Operation wie folgt aus

//Basisches Beispiel
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0);
//Schließung einer Position auf dem Markt mit einem Gegenauftrag
ticket=OrderSend(Symbol(),OP_SELL,1,1.2695,3,0,0);

4. TP wird ausgelöst, nachdem der Kurs das Niveau von 1,28 erreicht hat. Logischerweise sollte dies der Geldkurs sein, da die Gegenorder zu diesem Kurs eröffnet wurde (der Handel wird ausgeführt, wenn der Geldkurs den Wert von 1,28 erreicht). Auf dieser Grundlage sollte der Abschluss im MQL4-Code wie folgt aussehen

//Schließung einer TP-Position mit einem Marktauftrag (Gegenauftrag)
ticket=OrderSend(Symbol(),OP_SELL,1,1.28,3,0,0);
//Schließung einer Position mit einem Counter-Pending-Auftrag (Limiter)
ticket=OrderSend(Symbol(),OP_SELLLIMIT,1,1.28,3,0,0);

5. SL wird ausgelöst, wenn der Kurs des gehandelten Symbols (in unserem Fall EUR) um 50 Pips gegenüber dem Eröffnungszeitpunkt fällt.


Und nun das Interessanteste

Überprüfen wir die Eröffnung einer Marktposition anhand desselben Beispiels aus der MQL4-Hilfe (ein klassisches Beispiel, das wahrscheinlich schon von Tausenden von Menschen verwendet wurde).

Wir werden diesen Code verwenden, um es zu überprüfen

//+------------------------------------------------------------------+
double PriceOpen,PriceSL,PriceTP;
int ticket;
//+------------------------------------------------------------------+
//Preise für den Auftrag formulieren
PriceOpen = Ask;
PriceSL   = Bid-500*Point;
PriceTP   = PriceOpen+1000*Point;
//Auftrag zur Eröffnung einer Marktposition
ticket = OrderSend(Symbol(),OP_BUY,0.10,PriceOpen,5,PriceSL,PriceTP);
//+------------------------------------------------------------------+

Die Ausführung dieses Codes auf dem Server von Alpari (mit echten Kursen) ergibt das folgende Ergebnis

2010.08.24 09:12:47 '******': instant order buy 0.10 EURUSD at 1.26292 sl: 1.25776 tp: 1.27292

Es ist leicht zu erraten, dass wir in diesem Fall die folgenden Größen erhalten SL = 516 (oder 51 Pips für 4 Ziffern) TP = 1000 (oder 100 Pips für 4 Ziffern)

PPS

Schauen wir in der MQL4-Hilfe nach:

Parameter:
Symbol - Name des Finanzinstruments, mit dem die Handelsoperation durchgeführt wird.
cmd - Handelsoperation. Kann einer der Werte für die Handelsoperation sein.
Volumen - Anzahl der Lose.
Preis - Eröffnungskurs.
Schlupf - Maximal zulässige Preisabweichung für Marktaufträge (Kauf- oder Verkaufsaufträge).
Stoploss - Schlusskurs der Position bei Erreichen des Verlustniveaus (0, wenn es kein Verlustniveau gibt).
takeprofit - Schlusskurs der Position bei Erreichen des Gewinnniveaus (0, wenn es kein Gewinnniveau gibt).
Kommentar - Text des Auftragskommentars. Der letzte Teil des Kommentars kann durch den Handelsserver geändert werden.
magisch - Magische Nummer des Auftrags. Sie kann als benutzerdefinierter Bezeichner verwendet werden.
Verfall - Gültigkeitsdauer des schwebenden Auftrags.
arrow_colour - Farbe des Eröffnungspfeils auf dem Chart. Wenn der Parameter nicht vorhanden ist oder der Wert CLR_NONE ist, wird der Eröffnungspfeil nicht im Chart angezeigt.
Beispiel:
  int ticket; if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25) { ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point, "Meine Order #"+Zähler,16384,0,Green); if(ticket<0) { Print("OrderSend schlug fehl mit Fehler #",GetLastError()); return(0); } } }

"Hier sag mir, wo die Wahrheit ist, Bruder?"...?

OrderSend - Документация на MQL4
  • docs.mql4.com
OrderSend - Документация на MQL4
[Gelöscht]  
Yedelkin:

Ich verstehe den folgenden Teil des Codes nicht:

// Kopieren Sie den Schlusskurs des vorherigen Balkens (Balken 1) in die entsprechende Expert Advisor-Variable
   Cexpert.setCloseprice(mrate[1].close);  // Schlusskurs von Takt 1
//--- Prüfen, ob eine Kaufposition vorhanden ist
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("Wir haben bereits eine Position zu kaufen!!!"); 
            return;    // Die Long-Position nicht aufstocken
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // die Bestellung aufgeben
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
Wenn wir eine Kaufposition eröffnen wollen, sollten wir uns auf den latest_price.ask Preis konzentrieren, aber wenn wir einen Stop Loss und Take Profit für eine solche Position setzen - auf den latest_price.bid Preis. Ist dies korrekt? Warum werden Stop Loss und Take Profit auf der Grundlage des Briefkurses im Codetext gesetzt? Handelt es sich um einen Druckfehler oder um eine Besonderheit einer bestimmten Strategie (der Code hat eine ähnliche Konstruktion für die Eröffnung einer Verkaufsposition)?

Dieser Teil des Codes sollte auf der Grundlage der folgenden Aussagen verstanden werden:

а. Long - eröffnen zum Ask und schließen zum Bid; Short - eröffnen zum Bid und schließen zum Ask;

б. Positionen werden durch Gegenaufträge geschlossen;

в. Das BU-Niveau liegt beim Eröffnungskurs;

г. Der Abstand zu TP und SL wird vom Open Price (CU-Level) aus berechnet;

д. TP wird ausgelöst, wenn der Geldkurs ein Niveau erreicht, das dem Eröffnungskurs + Gewinngröße entspricht;

e. SL wird ausgelöst, wenn das Wertpapier das Bid-Niveau erreicht, das dem Open Price - Loss size entspricht.

Der Autor des Expert Advisors hat sich bei seiner Arbeit höchstwahrscheinlich von ähnlichen Aussagen leiten lassen. Um das Ganze so deutlich wie möglich zu machen, möchte ich die obigen Ausführungen mit Hilfe des folgenden Bildschirms veranschaulichen (wir interessieren uns für das rote Rechteck).


 
Interesting:

e. SL wird ausgelöst, wenn der Preis Bid ein Niveau erreicht, das dem Open Price - Loss size entspricht.

Danke, ich verstehe die Logik. Aber gemäß Punkt "e" stellt sich heraus, dass, wenn der Stoploss ausgelöst wird, der Bid nicht bei 1,2645, sondern bei 1,2650 und der Ask bei 1,2655 liegen sollte.

[Gelöscht]  
Yedelkin:

Danke, ich verstehe die Logik. Aber gemäß Punkt "e" stellt sich heraus, dass, wenn ein Stop-Loss ausgelöst wird, Bid nicht bei 1,2645, sondern bei 1,2650 liegen sollte; und Ask entsprechend bei 1,2655.

Es kann sein, dass Sie überprüfen müssen, was genau passiert, wenn der Markt einen Stop-Loss auslöst (oder das Matrixmodell unter Berücksichtigung aller verfügbaren Schlussmöglichkeiten anpassen) ....


Zu Punkt "e" (so wie ich es verstehe)

Im Falle der Zählung von Open (Ask) wird es 1.27-50 = 1.2650 sein (Preis wird 45 Pips passieren und die Pose wird schließen), wenn ich richtig verstanden habe. In diesem Fall denke ich, dass SL bei Bid 1.2650 und Ask 1.2655 arbeiten sollte.

Eine andere Sache, wenn wir von Bid zählen, dann erhalten wir den Preis 1.2695-50 - 1.2645 (Sie können nicht mit Mathe argumentieren). Wenn wir SL von Bid aus berechnen, erhalten wir 1,27-1,2645 = 55 Pips (was meines Wissens nach nicht Teil unserer Pläne war).

PS

Zumindest erlaubt uns dieses Modell, die SL- und TP-Niveaus korrekt aus dem Eröffnungskurs zu berechnen (meiner Meinung nach korrekt)...

Natürlich wäre es interessant, die offizielle Meinung der Entwickler zu hören, wie die Preise in der Realität berechnet werden sollten (nicht nur SL und TP).

 

Frage.


100 Greenbacks - ist das in Rubel oder in U.E.? ;)

 
die zu verschwinden versprochen wurde.
 
Jager:

Frage.


100 Greenbacks - ist das in Rubel oder in U.E.? ;)

Dies ist der Timeout-Wert in Millisekunden. Dieser Parameter ist bereits aus allen Handelsfunktionen entfernt worden.
 

Hallo, danke für das übersichtliche Beispiel.

Aber ich habe zu fragen, ist es richtig?

Im EA wird zu Beginn eines jeden neuen Balkens nach einer Handelsmöglichkeit gesucht.

In der Klassenfunktion getbuffers() werden die Daten der letzten 3 Bars abgerufen, beginnend mit dem aktuellen Bar 0, der gerade erst gebildet wurde und daher ist der Wert fehlerhaft.

void MyExpert::getBuffers()
{
if(CopyBuffer(ADX_handle,0,0,3,ADX_val)<0 || CopyBuffer(ADX_handle,1,0,3,plus_DI)<0
|| CopyBuffer(ADX_handle,2,0,3,minus_DI)<0 || CopyBuffer(MA_handle,0,0,3,MA_val)<0)

Sollte es nicht die letzten 3 Bars Indikatordaten ab Position 1 abrufen?

Danke

 

Großartiger Artikel Samuel

Vielen Dank im Voraus für diesen unbezahlbaren Artikel,

Basierend auf diesem Artikel könnten wir also Funktionen wie IsNewBar oder Buy_opened in die Klasse aufnehmen und sie einfach von EA aus aufrufen.

Nochmals vielen Dank,

Ich hoffe auf weitere Artikel von Ihnen,

Hamed,

 

Bitte helfen Sie mir, etwas zu verstehen, was ich nicht verstehe:

Ganz am Anfang des EAs wird die Funktion aufgerufen:

  Cexpert.doInit(ADX_Period,MA_Period);
при этом для ее корректного выполнения требуются уже установленные параметры symbol  и period :
//+-----------------------------------------------------------------------+
// ÖFFENTLICHE FUNKTIONEN UNSERER KLASSE 
//+-----------------------------------------------------------------------+
/*
 Initialisierung 
*/
void MyExpert::doInit(int adx_period,int ma_period)
{
   //--- ADX-Indikator-Handle holen
   ADX_handle=iADX(symbol,period,adx_period);
  //--- Handle des Indikators Gleitender Durchschnitt abrufen
   MA_handle=iMA(symbol,period,ma_period,0,MODE_EMA,PRICE_CLOSE);
однако, заполнение этих параметров конкретными значениями происходит позже, уже после Cexpert.doInit :
//--- Start der Initialisierungsfunktion
   Cexpert.doInit(ADX_Period,MA_Period);
//--- Setzen aller notwendigen Variablen für unser Klassenobjekt
   Cexpert.setPeriod(_Period);     // setzt den Zeitraum
   Cexpert.setSymbol(_Symbol);     // gibt das Symbol (Währungspaar) an
   
   Никак не пойму, как может правильно выполниться Cexpert.doInit, если переменной symbol пока не присвоено
значение (или как-то присвоено ?) Застрял тут и дальше никак . Спасибо.