|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
das sieht dann wie aus ?
hier ist meine Zeile zum kaufen: //Long Signale umsetzen if(LongSignal == true) { LongOrder = OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,0,Ask+ Minilots*Point,"LONG",MagicNummer,0,Green); } Wo soll ich da hinten was dran machen ? |
|
|||
Hier wird dir geholfen: https://book.mql4.com/functions/datetime
Denke es müsste dann so aussehen if(LongSignal == true || Time>exitTime) { Code } |
|
|||
Du willst ja eine Zeitfunktion benutzen, um die Order zu schliessen. Soweit ich mich erinnere, geben diese immer die Anzahl von Sekunden seit dem 1.1.1970 zurück, so dass Du z.B. die Differenz von einem Tag zur OrderOpenTime in Sekunden umrechnen musst.
Die Funktion müsste dann in etwa so aussehen: if(TimeCurrent() > OrderOpenTime() + 60 * 60 * 24) OrderClose(........); Vorher musst Du die zu schliessende Order natürlich noch selektieren über die bekannte for-Schleife. |
|
|||
Vielen Dank für die Zeile. Habe die
if(TimeCurrent() > OrderOpenTime() + 60 * 60 * 24) Eingebaut. Die Funktioniert, aber irgendwie ist da noch ein seltsamer Fehler drin. Wenn eine offene Order nach 24 Stunden geschlossen wurde. Dann wird immer die nächste Order die geöffnet wird, gleich wieder geschlossen. Aber da nach die Order wird wieder normal laufen bis zum TP. Das Ergebnis als Bild ist im Anhang. Seltsam Oder ? |
|
|||
Am Code stimmt aber was auch nicht ganz. Der Kompilierer meckert bei: Orderclose und OrderSelect.
return value of 'OrderSelect' should be checked test.mq4 return value of 'OrderClose' should be checked test.mq4 Hier der Code: //+-----------------------------------------------------------------+ //|Prüfen ob Orders oder Positionen geöffnet sind int offeneorders=0; int anzahlorders=OrdersTotal(); for(zaehler=0;zaehler<anzahlorders;zaehler++) // for schleife { OrderSelect(zaehler, SELECT_BY_POS, MODE_TRADES); // MODE_TRADES = offene und aufgegebene Orders // check offene Positionen, Symbol & MagicNumber if (OrderSymbol()== Symbol()) { if (OrderMagicNumber()==MagicNummer) { offeneorders++; } } // OrderSymbol } // for schleife //+-----------------------------------------------------------------+ //|Orders aufgeben if(offeneorders == 0 ) { double Minilots = MarketInfo (Symbol() , MODE_STOPLEVEL); //Minimum Takeprofit //Long Signale umsetzen if(LongSignal == true) { LongOrder = OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,0,Ask+ Minilots*Point,"LONG",MagicNummer,0,Green); } //Short Signale umsetzen if(ShortSignal == true) { ShortOrder = OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,0,Bid-Minilots*Point,"SHORT",MagicNummer,0,Red); } } //------- //offene Order nach 24 Stunden schließen if(TimeCurrent()>OrderOpenTime()+60*60*24) for(zaehler=0;zaehler<OrdersTotal();zaehler++) { if(OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES)= =false) break; //---- check order type if(OrderType()==OP_BUY && OrderMagicNumber() == MagicNummer && OrderSymbol()== Symbol() ) { if(Close[1]<LongOrder) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Print("Long wird geschlossen"); break; } if(OrderType()==OP_SELL) { if(Close[1]>ShortOrder) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Print("Short wird geschlossen"); break; } } return(0); } |
|
|||
Die Profis mögen mich korrigieren, aber für mich sieht es so aus, als würdest Du die 24-Stunden-Prüfung zwischen den beiden For-Schleifen und damit immer auf Basis der letzten durch die 1. Schleife selektierten Order durchführen.
__________________
Broker Rabatte |
|
|||
Das kann gut sein. Ich wüßte jetzt aber nicht, wie das richtig aussehen würde
|
|
|||
Die Prüfung hinter das OrderSelect() der 2. Schleife schieben und damit für jede offene Order prüfen, ob diese älter als 24 Stunden ist.
__________________
Broker Rabatte |
|
|||
der Kompilierer gibt immer noch die selben Warnungen raus.
Habe den Orderselect nun nach hinten gepackt. Ja bei den buy orders, gibt es nun keine sofortigen kauf/verkauf mehr. Aber nun hängt er bei dem sell orders. Ich sehe zwar im Journal, das er es schließen will mit "print", macht es aber nicht. Und auch keine Fehler Meldung. //+-----------------------------------------------------------------+ //|Prüfen ob Orders oder Positionen geöffnet sind int offeneorders=0; int anzahlorders=OrdersTotal(); for(zaehler=0;zaehler<anzahlorders;zaehler++) // for schleife { OrderSelect(zaehler, SELECT_BY_POS, MODE_TRADES); // MODE_TRADES = offene und aufgegebene Orders // check offene Positionen, Symbol & MagicNumber if (OrderSymbol()== Symbol()) { if (OrderMagicNumber()==MagicNummer) { offeneorders++; } } // OrderSymbol } // for schleife //+-----------------------------------------------------------------+ //|Orders aufgeben if(offeneorders == 0 ) { double Minilots = MarketInfo (Symbol() , MODE_STOPLEVEL); //Minimum Takeprofit //Long Signale umsetzen if(LongSignal == true) { LongOrder = OrderSend(Symbol(),OP_BUY,HandelsLots,Ask,2,0,Ask+ Minilots*Point,"LONG",MagicNummer,0,Green); } //Short Signale umsetzen if(ShortSignal == true) { ShortOrder = OrderSend(Symbol(),OP_SELL,HandelsLots,Bid,2,0,Bid-Minilots*Point,"SHORT",MagicNummer,0,Red); } } //------- //offene Order nach 24 Stunden schließen if(TimeCurrent()>OrderOpenTime()+60*60*24) for(zaehler=0;zaehler<OrdersTotal();zaehler++) { //---- check order type if(OrderType()==OP_BUY && OrderMagicNumber() == MagicNummer && OrderSymbol()== Symbol() ) { if(Close[1]<LongOrder) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Print("Long wird geschlossen"); break; } if(OrderType()==OP_SELL) { if(Close[1]>ShortOrder) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Print("Short wird geschlossen"); break; } if(OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES)= =false) break; } return(0); } |
|
|||
//offene Order nach 24 Stunden schließen
for(zaehler=0;zaehler<OrdersTotal();zaehler++) { OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderMagicNumber() == MagicNummer && TimeCurrent()>OrderOpenTime()+60*60*24) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); if(OrderType()==OP_SELL && OrderMagicNumber() == MagicNummer && TimeCurrent()>OrderOpenTime()+60*60*24) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); } So ungefähr (nicht getestet)! Es ist hier eigentlich überflüssig, nach Buy- und Sell-Order zu unterscheiden, aber Du kannst ja den übrigen Code "dazwischenfummeln". (Ich habe noch keinen Account gesehen, auf dem es interessiert hätte, ob Du mit Bid- oder Ask-Kurs und/oder Slippage schliesst. Ich meine, mal irgendwo gelesen zu haben, das das schlicht ignoriert und die Order einfach geschlossen wird. Wer da Genaueres weiss, kann es aber gerne posten). Ich würde allerdings für jede Schließungsart eine eigene Funktion bzw. Schleife verwenden, damit man noch irgendwie die Übersicht behält. |
Lesezeichen |
Stichworte |
mql4, order schließen, order uhrzeit schließen, programmierung, programmierung metatrader, uhrzeit, uhrzeit schließen, zeit |
|
|