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)
-   -   Pending Order deleten (http://www.expert-advisor.com/forum/showthread.php?t=5738)

McMenneman 06.07.17 14:45

Pending Order deleten
 
Hallo Zusammen,
bin seid ein paar Monaten mehr oder weniger erfolgreich meine kleinen EAs am programmieren und habe mal wieder ein Problem das ich nicht gelöst bekomme. Würde mich freuen, wenn mir jemand Hilfe leisten könnte.
Folgendes:

Ich platziere eine Stop Buy Order und möchte das Sie sofern sie in der nächsten Periodeneinheit nicht gefilled wird, sofort gelöscht wird.
Das sieht als Idee so aus...ABER es wird nicht gelöscht!
Wo ist mein Fehler, bzw. vielleicht gibt es ja auch schon eine CodeZeile in MQL?

Danke...

Aktuell habe ich den EA zum testen auf 1min laufen...es geht mir nur um die Streichung der Pending order...

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

//pending Orders streichen

orderCheck = OrderSelect(0,SELECT_BY_POS,0);
OrderNumber = OrderTicket();
if (TimeCurrent()+60>BarsSinceEntry){
orderCheck = OrderDelete(OrderNumber,Blue);
}


if(OrdersTotal()<2){
if (i<1){
OrderNumber = OrderSend(Symbol(), OP_BUYSTOP,0.1,High[1]+10, 5,Low[1]-10, 0,"Test",202,TimeCurrent()+660,Blue);
Print(GetLastError());
i++;
BarsSinceEntry=TimeCurrent();
}
}


}
//+------------------------------------------------------------------+

next user 06.07.17 15:19

Benutze beim nächsten mal bitte die Code-Tags, ist einfach übersichtlicher.
Was sagt denn GetLastError() an entsprechender Stelle?

Leopold 06.07.17 16:35

Hallo,

manches ist mir noch nicht ganz klar:

orderCheck = OrderSelect(0,SELECT_BY_POS,0);
ist es absicht, dass du immer Position 0 selectieren willst?
Ich weis auch nicht ob die "0" am ende richtig ist. Ich verwende immer MODE_TRADES.


ich würde das ganze so schreiben:

if (TimeCurrent()>BarsSinceEntry+PeriodSeconds(PERIOD _CURRENT))
{
orderCheck = OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
if (orderCheck == True)
}
OrderNumber = OrderTicket();
orderCheck = OrderDelete(OrderNumber,Blue);
}
}

---Leopold---

McMenneman 06.07.17 16:54

danke für die fixe Antwort Leopold.

orderCheck = OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
Die 0 => Position 0?
Er soll eben die erste Pending Order löschen.

next user 06.07.17 16:56

Soweit ich weiss ist MODE_TRADES == 0, aber ich finde es so auch etwas besser.
Oder den dritten Parameter einfach weglassen. Ist ja die Standardeinstellung.
PeriodSeconds ist sinnvoll, sofern er nicht nur eine bestimmte Zeiteinheit nutzt.

Wie schon gesagt, schau mal was GetLastError() ausspuckt.

McMenneman 06.07.17 17:28

das spuckt er mir aus....???

2017.07.06 17:09:24.090 TEST .US30Cash,M1: 4108

2017.07.06 17:09:24.090 TEST .US30Cash,M1: market order #24114630 cannot be deleted

Market Order??? Ich platziere ja einen OP_BUYSTOP...was soll das denn?


und jetzt bei dem durchlauf:
2017.07.06 17:30:06.710 TEST .US30Cash,M1: open #24115773 buy stop 0.10 .US30Cash at 21404.00 sl: 21335.00 ok
2017.07.06 17:31:07.885 TEST .US30Cash,M1: 0
2017.07.06 17:31:07.886 TEST .US30Cash,M1: invalid ticket for OrderDelete function
2017.07.06 17:31:07.886 TEST .US30Cash,M1: 4051

??? help me ??? ;)

next user 06.07.17 18:02

Zitat:

Zitat von McMenneman (Beitrag 39090)
2017.07.06 17:09:24.090 TEST .US30Cash,M1: 4108

2017.07.06 17:09:24.090 TEST .US30Cash,M1: market order #24114630 cannot be deleted

2017.07.06 17:31:07.886 TEST .US30Cash,M1: invalid ticket for OrderDelete function
2017.07.06 17:31:07.886 TEST .US30Cash,M1: 4051

??? help me ??? ;)

4108 = Invalid Ticket
4051 = Invalid function parameter value

Teste mal deine Ticket-Variable. Da kann was nicht stimmen.
Schau mal, ob OrderSelect() einen Fehler verursacht.

traderdoc 06.07.17 20:05

Nimm mal den Code, der funktioniert bestimmt:

Code:

if (BarsSinceEntry > 0 && TimeCurrent() > BarsSinceEntry + PeriodSeconds(PERIOD_CURRENT)) {
  for (int i = OrdersTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) {
              bool res = OrderDelete(OrderTicket());
              if (res) BarsSinceEntry = 0;
              break;
            }
        }
      }
  }
}

Das setzt allerdings voraus, dass die Orders beim Senden mit einer MagicNumber versehen werden.
Die ist zwar nicht zwingend notwendig, sollte man sich aber angewöhnen, um die Eineindeutigkeit der Orderselektion zu gewährleisten. Damit könnten nun auch mehrere Charts desgleichen Währungspaares offen sein, wenn z.B. in verschiedenen TimeFrames gearbeitet werden soll und zu jedem TF eine andere MagicNumber vergeben wird. Das wäre zwar für den Tester zunächst irrelevant, aber der EA soll ja mal mindestens im Demo-Account laufen.

traderdoc

Leopold 07.07.17 07:58

Genau, so ist es besser.

Man muss natürlich überprüfen ob Orders vorhanden sind und ob OrderType der richtige ist.

McMenneman 10.07.17 12:01

Klasse! TarderDoc, das hat geholfen!

Vielen Dank auch den anderen...


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