Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Bedingung nach Negativ-Trades (http://www.expert-advisor.com/forum/showthread.php?t=4633)

Adlerauge 11.12.15 18:57

Bedingung nach Negativ-Trades
 
Hallo allerseits,

ich möchte, dass mein EA etwas anders macht, nachdem er 2 negativ-Trades gemacht hat.

Ich müsste also soetwas programieren wie:
wenn die letzten beiden Trades im Minus geschlossen wurden, dann......

Da ich mich erst seit wenigen Wochen mit der MQL4-Programmierung befasse, wäre es schön, wenn mir jemand die konkrete(n) Befehlszeile(n) schreiben könnte.

Danke!!

Raul0 12.12.15 09:54

Hallo,

mit einer Zeile ist das nicht getan. Und es wäre schon ein Modul, was den Rahmen sprengen würde es hier kostenlos zu liefern.

Als Anregung jedoch um zwei Richtungen zu geben:

- Es müsste die Orderhistory ausgelesen und analysiert werden. Das wäre der fachmännische Weg.

- Als Übung für den Anfang, was auch funktioniert, eine Variable(Var1) setzen, wenn der Kurs die Höhe des Stops erreicht. Wird nicht das Stop erreicht (else), dann Var1 false.
Das zusätzlich mit einer zweiten Variable, wo die Funktion durchlaufen wird, wenn Var1 gesetzt wurde.
Der Rest halt einfach, ist Var1 und Var2 gesetzt, dann mache alles anders.
Zu beachten ist, wenn ein Trade positiv ausfällt, sollten die beiden Variablen zurückgesetzt werden.

TLO Trader 12.12.15 11:31

Hallo Adlerauge,

ich habe mal etwas ähnliches programmiert, dass Dir als erster Hinweis weiterhelfen könnte:

//Auf einen Long- folgt immer ein Short-Trade und umgekehrt
int Zaehler_History=0;
if (LongShortWechsel==true)
{
for(Zaehler_History=OrdersHistoryTotal();Zaehler_H istory>=0;Zaehler_History--)//
{
OrderSelect(Zaehler_History,SELECT_BY_POS,MODE_HIS TORY);
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber)
continue;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
LastTradeLong=true;
LastTradeShort=false;
break;
}
if(OrderType()==OP_SELL)
{
LastTradeLong=false;
LastTradeShort=true;
break;
}

}
}
}

Dieser Code testet, ob der letzte! geschlossene Trade long oder short war.
Du mußt natürlich die Bedingung ändern und testen, ob er Gewinn oder Verlust
gemacht hat und auch noch den vorletzten Trade ebenfalls testen.

Dies geht somit in Richtung des 1. Ansatzes von Raul0.

Den 2. Ansatz von Raul0 kann ich nicht so recht nachvollziehen, meines
Wissens ändert sich der Wert einer Variablen wieder auf den Ausgangswert,
wenn der EA neu initialisiert wird. Du müsstest also beim Testen Deiner Funktion jedesmal wieder von vorne anfngen, sobals Du einen Wert in der Eingabebox änderst oder den MT 4 neu startest. Das könnte sehr mühsam
sein.

Ob man den Wert einer Variablen dauerhaft speichern kann, diese Möglichkeit
habe ich bei MQL leider noch nicht gefunden.

Vielleicht weiss da ja jemand Rat?

Adlerauge 12.12.15 17:15

danke schonmal für die Antworten, da kann ich meine Frage schon präzisiere n:
ich dachte auch an das Auslesen der Orderhistory.
Ich finde in der MQL4 Hilfe aber nur den Befehl "OrderHistoryTotal", der mir aber so wie das sehe nur Auskunft über die Anzahl der geschlossenen Orders gibt, oder?
Meine Frage ist also, wie kann ich Informationen zu geschlossenen Orders abfragen, damit ich diese dann von meinem EA weiterbenutzen lassen kann.

Auf Stops kann ich mich leider nicht basieren, da in diesem EA keine Stops gesetzt werden. Die Orders werden auf Grund von MAs gesetzt und geschlossen.

TLO Trader 12.12.15 17:41

Die Antwort findest Du in meinem obigen Code-Fragment.
OrdersHistoryTotal liefert dei Anzahl der geschlossenen Orders,
die hier in einer for-Schleife abwärts durchlaufen werden.
Für jede Order wird nun geprüft, ob sie die angegebenen Bedingungen
erfüllt (hier Währungspaar bzw. Symbol und Magic-Nummer stimmen
überein). Wenn ja, wird die Order ausgewählt und Du kannst die
entsprechenden Werte, z.B. Preis, Trade-Richtung, SL, TP oder in
Deinem Fall OrderProfit() auslesen und weiterverarbeiten.

So ist das Prinzip! So eine Schleifen-Konstruktion musst Du immer
verwenden, wenn Du auf Trades zugreifen willst. :)

Adlerauge 12.12.15 17:58

ok, danke Dir, TLO. Ich werde versuchen, mir das mal auf diese Art zurechtzubasteln..))

TLO Trader 12.12.15 23:27

Adlerauge, ich hatte gerade nichts zu tun und habe mal einen Code-Entwurf gemacht, wie Dein Programm aussehen könnte:

//Aktion nach 2 Verlusttrades umkehren
int Zaehler_History = 0; //Variable enthält den "Countdown" beim Durchlaufen der geschlossenen Trades
int AnzahlVerlustTrades = 0;//Variable zählt die letzten Verlusttrades
for(Zaehler_History=OrdersHistoryTotal();Zaehler_H istory>=0;Zaehler_History--)
{
OrderSelect(Zaehler_History,SELECT_BY_POS,MODE_HIS TORY);
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber)
continue; //Order entspricht nicht den Kriterien, daher wird nach der nächsten Order gesucht.

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) //Order entspricht den Kriterien.
{
{
if(OrderProfit() >= 0)
break; // Steigt aus der Schleife aus, wenn der gefundene Trade keinen Verlust gemacht hat
else if(OrderProfit()<0)
AnzahlVerlustTrades = AnzahlVerlustTrades + 1; //Die Zahl der letzten Verlusttrades wird um
//1 erhöht, wenn der letze Trade mit Verlust
//war.
}
if AnzahlVerlustTrades >= 2
SETZE SIGNAL FÜR NEUE AKTION; //Hier könnte dann eine Varible ihren Wert wechseln oder die
//neue Aktion auf andere Weise eingeleitet werden, wenn die
//Zahl der aufeinanderfolgenden Verlusttrades 2 erreicht.
}
}

Das ist so natürlich nicht lauffähig und nicht getestet, soll aber den Denkansatz verdeutlichen. Du musst wissen, MQL ist nicht gerade eine benutzerfreundliche Programmiersprache und "glänzt" durch einige Ungereimtheiten. Insbesondere der Editor lässt einen schnell den Überblick
verlieren.

Lass mich mal wissen, ob Du damit was anfangen konntest! :)

Adlerauge 13.12.15 00:57

Cool!
Ich danke Dir, genau so einen Ansatz habe ich gesucht. Ich werde ein bißchen brauchen, um mich damit auseinanderzusetzen, ich geb Dir dann aber in jedem Fall eine Rückmeldung....

Adlerauge 14.12.15 21:06

Hallo TLO,

ich habe zunächst einmal versucht, Deinen Order-Wechsel-Code umzusetzen.
Dazu habe ich einfach mal einen Indikator genommen, in diesem Fall den Momentum, und versucht den Code so zu schreiben, dass er long geht, wenn der Momentum über 100 geht, und dann short geht sobald der Momentum wieder und 100 fällt.

Leider funktioniert es noch nicht .....
hier ist der ganze Quellcode:

extern double HandelsLots = 0.01;
extern double StopLoss = 100;
extern double TakeProfit = 50;
extern int PeriodMomentum = 14;

double Momentum;

int MagicNumber;
int Zaehler_History;

bool LastTradeShort;
bool LastTradeLong;
bool LongShortWechsel;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
Momentum = iCustom(NULL,0,"Momentum",PeriodMomentum,0,1);
return(0);
}

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()

//Auf einen Long- folgt immer ein Short-Trade und umgekehrt
{
if (LongShortWechsel==true)
{
for(Zaehler_History=OrdersHistoryTotal();Zaehler_H istory>=0;Zaehler_History--)//
{
OrderSelect(Zaehler_History,SELECT_BY_POS,MODE_HIS TORY);
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber)
continue;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
LastTradeLong=true;
LastTradeShort=false;
break;
}
if(OrderType()==OP_SELL)
{
LastTradeLong=false;
LastTradeShort=true;
break;
}

}
}
}

// Erste Order

if (OrdersTotal() == 0)
if (Momentum > 100)
if (OrdersHistoryTotal()==0)
{
OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,0,0,Green );
}

if (OrdersTotal() == 0)
if (Momentum < 100)
if (OrdersHistoryTotal()==0)
{
OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,Bid+S topLoss*Point,Bid-TakeProfit*Point,NULL,0,0,Red);
}

// Nachfolgende Orders

if (OrdersTotal() == 0)
if (Momentum > 100)
if (LastTradeLong=false)
if (LastTradeShort=true)
{
OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,0,0,Green );
}

if (OrdersTotal() == 0)
if (Momentum < 100)
if (LastTradeShort=false)
if (LastTradeLong=true)
{
OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,Bid+S topLoss*Point,Bid-TakeProfit*Point,NULL,0,0,Red);
}
}

//..VG.... Adlerauge

TLO Trader 14.12.15 21:41

OH, OH, wo fang ich da jetzt an? :)

Auf den ersten Blick nur mal das Gröbste, was ich so gesehen habe:

1. Ich würde der MagicNumber mal einen Wert zuweisen und sie gleich als
extern deklarieren, dann kannst Du den EA auch für verschiedene Paare/Timeframes verwenden.

2. iCustom ist für individuelle Indikatoren, iMomentum ist direkt integriert.
Nimm die in der Hilfe angegebenen Spezifikationen.

3. Der Indikator darf nicht bei int init() stehen, dann ändert er seinen Wert während des Programmablaufs nicht mehr!

4. Deine if-Konstruktionen können so nicht funktionieren,
wenn schon, muss es heissen:

if (OrdersTotal() = 0 && Momentum > 100 && OrdersHistoryTotal()=0)
...;

In diesem Fall würde Dein EA allerdings nur auf einem "jungfräulichen" Konto traden, auf dem es weder offene noch geschlossene Trades gibt.
Das kann irgendwie nicht der Sinn sein!!

Das nur fürs Erste, auf ein Neues! :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:49 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum