Wie programmiert man? - Seite 297

 

...

Terrance

Du wolltest auf ein Kreuz bei einem geschlossenen Balken testen. Shift 1 bedeutet den ersten geschlossenen Balken und Shift 2 den ersten Balken davor. Und wenn Sie auf ein Kreuz auf einem geschlossenen Balken testen wollen, sind das die Balken, die Sie testen müssen

Ab (diff1*diff2)<0) : Es ist eigentlich ganz einfach

diff1 ist die Differenz zwischen 2 Durchschnitten bei Takt 1

diff2 ist die Differenz zwischen 2 Durchschnitten in Takt 2

Jeder kann positiv oder negativ sein. Was uns interessiert, ist, wenn einer positiv und der andere negativ ist, denn das bedeutet, dass sich die Durchschnitte gekreuzt haben. Durch Multiplikation der beiden Durchschnitte erhalten wir eine schnelle Antwort auf die Frage, ob sie sich gekreuzt haben (wenn die Vorzeichen unterschiedlich sind, ist das Ergebnis kleiner als 0, wenn die Vorzeichen gleich sind, ist das Ergebnis der Multiplikation größer als 0).

Ich hoffe, das hat geklärt, was dieser Code bewirkt.

tkuan77:
Hallo Mladen, ich habe ausprobiert, was du mir gesagt hast und es hat wunderbar funktioniert. Allerdings verstehe ich die Logik hinter den Codes nicht ganz. warum setzt du den Shift von iMA auf 1 und 2 und warum codierst du das: (diff1*diff2)<0) auch noch? Sorry, aber ich befinde mich noch in der Lernphase.

Vielen Dank und Grüße

Terrance
 

Wie man Pfeile hinzufügt

Im Anhang finden Sie eine verkürzte Version des in den letzten Beiträgen besprochenen MA Crossover EA.

Wenn ein Crossover bei einer geschlossenen Kerze auftritt, druckt diese Version eine Meldung in die Protokolldatei.

Wäre es möglich, die Drucklogik durch einen Code zu ersetzen, der Auf-/Abwärtspfeile auf dem Chart anzeigt?

Ich danke Ihnen für Ihre Hilfe.

Dateien:
 

...

Versuchen Sie es auf diese Weise ...

Es wird ein Pfeil gezeichnet und es wird ein Kommentar in der rechten unteren Ecke des Charts angezeigt - so wie hier (die Durchschnitte wurden im Chart hinzugefügt, um zu verdeutlichen, was es tut):

michaelB:
Im Anhang finden Sie eine verkürzte Version des MA Crossover EA, der in den letzten Beiträgen besprochen wurde.

Wenn ein Crossover bei einer geschlossenen Kerze auftritt, druckt diese Version eine Nachricht in die Log-Datei.

Wäre es möglich, die Drucklogik durch einen Code zu ersetzen, der Auf-/Abwärtspfeile auf dem Chart anzeigt?

Ich danke Ihnen für Ihre Hilfe.
 

MA-Pfeile

Die "2MAcrossover mit Kommentaren" funktioniert wirklich gut.

Nur eine Frage - sobald ein Pfeil erscheint, verschwindet er, wenn eine neue Kerze geöffnet wird, war das beabsichtigt?

Mir gefällt der Kommentar in der unteren rechten Ecke des Charts.

Nochmals vielen Dank.

 
mladen:
Terrance

Sie wollten auf ein Kreuz bei einem geschlossenen Balken testen. Shift 1 bedeutet den ersten geschlossenen Balken und Shift 2 den ersten Balken davor. Und wenn Sie auf ein Kreuz auf einem geschlossenen Balken testen wollen, sind das die Balken, die Sie testen müssen

Ab (diff1*diff2)<0) : Es ist eigentlich ganz einfach

diff1 ist die Differenz zwischen 2 Durchschnitten in Takt 1

diff2 ist die Differenz zwischen 2 Durchschnitten in Takt 2

Jeder kann positiv oder negativ sein. Was uns interessiert, ist, wenn einer positiv und der andere negativ ist, denn das bedeutet, dass sich die Durchschnitte gekreuzt haben. Die Multiplikation der beiden gibt uns eine schnelle Antwort, wenn es eine Kreuzung gibt (wenn die Vorzeichen unterschiedlich sind, dann ist das Ergebnis kleiner als 0, wenn die Vorzeichen gleich sind, dann ist das Ergebnis der Multiplikation größer als 0)

Ich hoffe, damit ist geklärt, was dieser Code bewirkt

Danke Mladen für deine Hilfe! Aber als ich diesen Code eingefügt habe, scheint mein EA ein bisschen verrückt zu spielen. Gelegentlich wird es automatisch SL oder TP auf seine eigene, noch bevor die eigentliche SL oder TP erreicht ist, wie die in meinem Screenshot gezeigt. warum ist das so?

Vielen Dank und Grüße

Terrance

//--- Eingabeparameter

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

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

//| Experten-Initialisierungsfunktion |

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

int init()

{

//----

//----

return(0);

}

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

//| Experten-Deinitialisierungsfunktion |

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

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main geändert

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

sonst

{

return (0);

}

}

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

//| Expertenstartfunktion |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("Balken weniger als 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit kleiner als 10");

return(0); // TakeProfit prüfen

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PREIS_SCHLIESSEN,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PREIS_SCHLIESSEN,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PREIS_SCHLIESSEN,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PREIS_SCHLIESSEN,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

wenn (shortEma1>longEma1)

isCrossed = 1;

sonst isCrossed = 2;

}

total = OrdersTotal();

if(gesamt < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Mein EA",12345,0,Grün);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "Mein EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Dateien:
ps.jpg  16 kb
 

Terrance

Dieser Code hat nichts mit SL oder TP zu tun. Es testet einfach 2 Durchschnitte für Kreuze (siehe, wie michaelB verwendet den gleichen Code in seinem 2MACrosses, da das ist nan EA zu). Der Rest Ihres Codes muss für diese SL und TP Fehler überarbeitet werden

tkuan77:
Danke Mladen für deine Hilfe! Aber als ich diesen Code eingefügt habe, scheint mein EA ein bisschen verrückt zu spielen. Gelegentlich wird es automatisch SL oder TP auf seine eigene, noch bevor die tatsächliche SL oder TP erreicht wird, wie die in meinem Screenshot gezeigt. warum ist das so?

Vielen Dank und Grüße

Terrance

//--- Eingabeparameter

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

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

//| Experten-Initialisierungsfunktion |

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

int init()

{

//----

//----

return(0);

}

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

//| Experten-Deinitialisierungsfunktion |

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

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main up

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main geändert

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

sonst

{

return (0);

}

}

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

//| Expertenstartfunktion |

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

int start()

{

//----

int cnt, ticket, total;

double shortEma, longEma, mainshortEma, mainlongEma;

if(Bars<100)

{

Print("Balken weniger als 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit kleiner als 10");

return(0); // TakeProfit prüfen

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PREIS_SCHLIESSEN,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PREIS_SCHLIESSEN,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PREIS_SCHLIESSEN,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PREIS_SCHLIESSEN,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

if ((diff1*diff2)<0)

{

wenn (shortEma1>longEma1)

isCrossed = 1;

sonst isCrossed = 2;

}

total = OrdersTotal();

if(gesamt < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Mein EA",12345,0,Grün);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der BUY-Order : ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "Mein EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Fehler beim Öffnen der SELL-Order : ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

...

Ja, das ist beabsichtigt.

Da Sie einen EA und keinen Indikator erstellt haben, war der Zusatz, dass nur das letzte aktive Kreuz angezeigt wird und wenn es kein aktives Kreuz gibt, kein Pfeil angezeigt wird. Damit er mehrere Pfeile anzeigen kann, müsste er zunächst in einen Indikator umgewandelt werden, und dann müsste das Ganze neu geschrieben werden, aber ich denke, dass es bereits viele Indikatoren gibt, die Durchschnittskreuze im Chart anzeigen

michaelB:
Der "2MAcrossover mit Kommentar" funktioniert wirklich gut.

Nur eine Frage - sobald ein Pfeil erscheint, verschwindet er, sobald eine neue Kerze geöffnet wird. Ist das beabsichtigt?

Mir gefällt der Kommentar in der unteren rechten Ecke des Charts.

Nochmals vielen Dank.
 
mladen:
Terrance Dieser Code hat nichts mit SL oder TP zu tun. Er testet einfach 2 Durchschnitte für Crosses (siehe, wie michaelB den gleichen Code in seinem 2MACrosses verwendet, da das auch nan EA ist). Der Rest Ihres Codes muss für diese SL und TP Fehler überarbeitet werden

Hallo Mladen,

meinst du, dass die Art und Weise, wie ich meinen TP und SL setze, falsch ist oder?

Viele Grüße

Terrance

 

...

Terrance

Haben Sie diesen Abschnitt des TSD gesehen: Lektionen?

Ich denke, dass viele Fragen dort bereits beantwortet werden und dass Sie dort sehr gute Beispiele für das Schreiben von EAs im Allgemeinen finden können. Was Ihre Frage betrifft: Ich habe Ihren EA nicht getestet, also weiß ich es nicht. Das Problem beim Testen eines fremden EAs ist, dass man die Idee und die Logik des EAs kennen muss, und oft ist es einfach unmöglich, diese aus dem Code selbst zu "lesen". Das Code-Snippet, über das wir gesprochen haben, betraf die Erkennung von 2 Durchschnittskreuzen auf einem geschlossenen Balken, und dieser Code tut genau das und nichts anderes. Deshalb habe ich gesagt, dass "es nichts mit SL oder TP zu tun hat".

Mit freundlichen Grüßen

Mladen

tkuan77:
Hallo Mladen,

Meinen Sie, dass die Art und Weise, wie ich meinen TP und SL einstelle, falsch ist, oder?

Viele Grüße

Terrance
 

MQL-Lehrgangs-Thread

mladen-- Danke für den Link!!