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)
-   -   Keine 2 offenen Positionen (http://www.expert-advisor.com/forum/showthread.php?t=6427)

Karacho 24.05.19 22:08

Keine 2 offenen Positionen
 
Hallo,

der nachfolgende Code erstellt bei jeder neuen Kerze und wenn nicht schon eine offene Order vorhanden ist, zwischen 12 Uhr und 15 Uhr eine Pending - Verkaufen - Order.

Wenn eine Order z.B. um 12.40 Uhr ausgeführt wird, soll er jedoch keine weitere Position mehr eröffnen. Derzeit macht er das aber.

Wie kann ich das programmieren, dass er nach einer eröffneten Position keine weitere eröffnet ?


void OnTick()
{
...

if(ZaehleStopVerkaufOrdern() == 0 && NeueKerze() && Hour() >= 12 && Hour() <= 15 )
{
datetime expiration = Time[0]+60*60;
EroeffneStopOrder(Symbol(),Positionsgroesse, Einstiegskurs2, "verkauf", SL2, TP, expiration);
}

}



Funktionen:
ZaehleStopVerkaufOrdern(...)...
NeueKerze()...
EroeffneStopOrder(...)...



Ich würde mich sehr freuen, Hilfe zu bekommen und Danke im Voraus!!

daybyter 25.05.19 04:21

Der Code für Deine Hilfsfunktionen fehlt ja. Funktionieren die denn?

Karacho 25.05.19 09:50

Hallo,

hier ist noch der Code der drei Funktionen. Es wird keine Fehlermeldung angezeigt.



int ZaehleStopVerkaufOrdern ()
{
int OrderZaehler=0;
for(int Zaehler = 0; Zaehler <= OrdersTotal()-1; Zaehler++)
{
if(OrderSelect(Zaehler,SELECT_BY_POS) == true)
{
if(OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP && OrderMagicNumber()==MagicNumber)
OrderZaehler++;
}
else
{
Print("OrderSelect ergab den FehlerCode: ",GetLastError());
}
}

return(OrderZaehler);
}





bool NeueKerze()
{
bool IstNeueKerze = false;
if(Zeitstempel != Time[0])
{
Zeitstempel = Time[0];
IstNeueKerze = true;
}
else IstNeueKerze = false;
return(IstNeueKerze);
}




int EroeffneStopOrder (string markt, double Lots, double Eroeffnungskurs, string Handelsrichtung, double StopLoss, double TakeProfit, datetime expire)
{

if(Handelsrichtung == "kauf")
{

while(IsTradeContextBusy()) Sleep(10);
Ticketnummer = OrderSend(markt,OP_BUYSTOP, Lots, Eroeffnungskurs, Slipp, StopLoss, TakeProfit, "Stop-Kauf-Order",MagicNumber,expire,Green);

if(Ticketnummer == -1) {
FehlerCode = GetLastError();
string FehlerBeschreibung = ErrorDescription(FehlerCode);
string FehlerAusgabe = StringConcatenate("Eröffnung Stop-Kauf-Order:",FehlerCode,": ",FehlerBeschreibung);
Print(FehlerAusgabe);
}
}

if(Handelsrichtung == "verkauf")
{
while(IsTradeContextBusy()) Sleep(10);
Ticketnummer = OrderSend(markt,OP_SELLSTOP, Lots, Eroeffnungskurs, Slipp, StopLoss, TakeProfit, "Stop-Verkauf-Order", MagicNumber,expire,Red);

if(Ticketnummer == -1) {
FehlerCode = GetLastError();
string FehlerBeschreibung = ErrorDescription(FehlerCode);
string FehlerAusgabe = StringConcatenate("Eröffnung Stop-Verkauf-Order:",FehlerCode,": ",FehlerBeschreibung);
Print(FehlerAusgabe);
}
}

return(Ticketnummer);
}

daybyter 25.05.19 14:30

Du eröffnest BUYSTOP _und_ SELLSTOP Orders. Deine Zählfunktion zählt aber nur die SELLSTOP Orders. Warum ignorierst Du da die BUYSTOP Orders?

Karacho 25.05.19 16:33

Hallo,
es gibt auch eine Zählfunktion, welche die BUYSTOP Orders zählt. Da der Code bei void OnTick() ... aber nur SELLSTOP Orders generiert, ist die Zählfunktion für
BUYSTOPS irrelevant, so dachte ich. Der Backtest führt nur SELLSTOP Orders aus. Hier ist noch die Zählfunktion für die BUYSTOP Orders:


int ZaehleStopKaufOrdern()
{
int OrderZaehler=0;
for(int Zaehler = 0; Zaehler <= OrdersTotal()-1; Zaehler++)
{
if(OrderSelect(Zaehler,SELECT_BY_POS) == true)
{
if(OrderSymbol() == Symbol() && OrderType() == OP_BUYSTOP && OrderMagicNumber()==MagicNumber)
OrderZaehler++;
}
else
{
Print("OrderSelect ergab den FehlerCode: ",GetLastError());
}
}

return(OrderZaehler);
}



Ich würde mich sehr freuen, Hilfe zu bekommen.

daybyter 25.05.19 19:07

Wenn Du magst, schick mir mal den kompletten Code an arueckert67 <at> t-online.de

Dann kann ich das im Tester debuggen.

daybyter 27.05.19 02:54

Mit den richtigen Einstellungen tut der Code hier. Allerdings zählt die Zählfunktion ja nur die Stop Orders. Im Moment geht eine Stop Order auf, wird ausgelöst und wird zur Sell Order. Dann wird sie nicht mehr gezählt und die nächste Stop Order wird eröffnet. Die wird ausgelöst, nicht mehr gezählt und die nächste Stop Order wird aufgemacht. So kommst Du halt zu vielen Sell Orders.

Karacho 27.05.19 09:59

Hallo,

ich bräuchte also eine Funktion, welche auch die ausgelösten Orders zählt. Wie kann ich das am besten machen ?

daybyter 27.05.19 10:16

Schreib doch in die Zählfunktion:

if(OrderSymbol() == Symbol() && ((OrderType() == OP_SELLSTOP) || (OrderType()==OP_SELL)) && OrderMagicNumber()==MagicNumber)

Karacho 27.05.19 10:20

Hallo,

ich werde es später ausprobieren. Vielen Dank für deine Hilfe.


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:44 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