Tibo Posted September 10, 2011 Report Share Posted September 10, 2011 Hallo zusammen, ist es irgendwie möglich Trades, die von einem EA eröffnet wurden, zeitlich zu begrenzen? Konkret möchte ich jedem einzelen Trade eine Laufzeit mitgeben. Meine Idee:ich frage die anzahl der Trades und deren OrderOpenTime ab. Dann baue ich mir einen Algorithmus, der dann ausrechnet wieviel Tage der schon "unterwegs" ist. Bei einer Dauer von x Tagen oder höher wird die Order dann glattgestellt, egal ob + oder - Das ist meine Idee.Aber wie setze ich das um? Da hab ich keinen Plan! Kann mir dazu wer weiterhelfen?Ich hab auch schon die Suchfunktion benutzt. Aber scheinbar die falsche Fragen gestellt :( Quote Link to comment Share on other sites More sharing options...
Mythos Posted September 10, 2011 Report Share Posted September 10, 2011 Direkt begrenzen geht AFAIK nicht, aber du kannst es machen wie du es beschrieben hast und einfach bei jedem Tick checken ob eine Order zu lange offen ist. Mit OrdersTotal() holst du dir die Anzahl der offenen Orders. Mit OrderSelect selektierst du der Reihe nach alle Orders von Index OrdersTotal()-1 bis 0.Wenn die OrderOpenTime() der selektierten Order zu alt-> Order schließen. Um nicht mit anderen EAs in Konflikt zu geraten, solltest du mit der Order nur was machen, wenn die MagicNumber stimmt. hth Quote Link to comment Share on other sites More sharing options...
Tibo Posted September 10, 2011 Author Report Share Posted September 10, 2011 Ok. Danke Dir schon mal für die Beschreibung.Eine Magic-Number hab ich ja zum Glück schon in den EA mit eingebaut. Zwar eigentlich noch ohne großartige Nutzen, aber wie sich sehe kommt dieser jetzt :D Mit OrderSelect selektierst du der Reihe nach alle Orders von Index OrdersTotal()-1 bis 0.Den Satz hab ich jetzt allerdings nicht verstanden. Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted September 10, 2011 Report Share Posted September 10, 2011 Mythos war schneller zu #1 Konkret : Es gibt eine Vielzahl Möglichkeiten die aber alle die Funktion " OrderOpenTime() " nutzen werden . Du kannst also durch Bildung der Differenz " Time[0] - OrderOpenTime() " die Dauer Deines Trades berechnen . Das ist Schritt 1. Schritt2 kann dann der Vgl gegen eine fixe Dauer (oder Variable) sein . Diese Dauer wäre im einfachen Falle für alle Deine Trades gleich . Schritt 3 , wir machen es ein wenig komplizierter und legen die Dauer individuell fest => dann kannst Du die Dauer zum Beispiel im OrderComment (dort aber String-Format ! > nutze TimeToStr(TimeCurrent() ................) ) hineinschreiben . Achtung, die läßt sich später nichtmehr ändern , nur noch auslesen . Mein Rat : Beginne mit OrderOpenTime , bilde Differenzen zu Time [0] und vergleiche gegen einen festen Zahlenwert. Schliesse den Trade mit OrderSend() , wenn Zeit abgelaufen .Teste im Backtest, visueller Mode . Mache es danach komplizierter ...Schritt für Schritt . Weiterführend : 1.) das E-Book : http://book.mql4.com/ dort Umgang mit "Zeit" 2.) http://book.mql4.com...ctions/datetime erklärt "Zeit" und ich empfehle Dir aufmerksame und detailierte Lektüre, das spart Dir später extrem Zeit und dann die Conversion-Funktionen , insbesondere String => Zeit (Datetime) undumgekehrt 3.) http://book.mql4.com/functions/strings Hoffe hilft, gerne mehr KB 1 Quote Link to comment Share on other sites More sharing options...
Tibo Posted September 10, 2011 Author Report Share Posted September 10, 2011 na da hab ich ja jetzt was am Halse also das Grundprinzip mit dem TimeToStr kenne ich schon. Bei mySQL-Datenbanken heißt das wohl Timestamp, oder? Aber das hatte ich früher mal an der Uni. das ist a) schon lange her und b) habe ich es nie genutzt bisher, da ich ja auch kein Entwickler bin. Schon garkeiner für Datenbanken. Aber ist dieser Timestamp in MQL auch eine fortlaufende Zahl? eine Variable in die die Tradedauer (in Tagen) übergeben werden soll, hab ich mir schon angelegt aber ich hab da nun noch so meine Schwierigkeiten das gescheit die Anzahl der Tage auszulesen, da ja anscheinend immer die Uhrzeit mir herumschwirrt, die ich ja nun wirklich nicht brauche. Oder das ganze tatsächlich auf Monate oder Jahre ist. Nur wie verhält sich das bei Monatswechseln? Schritt2 kann dann der Vgl gegen eine fixe Dauer (oder Variable) sein . Diese Dauer wäre im einfachen Falle für alle Deine Trades gleich .diese Dauer wird in den EA-Eigenschaften eingegeben. Ist also fix und wird nicht jedes Mal neu berechnet. Es geht nur darum: Tradedauer i Tagen > Nutzervorgabe = Orderschließen. Schliesse den Trade mit OrderSend() , wenn Zeit abgelaufen .Warum nicht OrderClose()? Die OrderID des Trades welcher zu schließen wäre, lässt sich ja abfragen.... Quote Link to comment Share on other sites More sharing options...
Mythos Posted September 10, 2011 Report Share Posted September 10, 2011 Den Satz hab ich jetzt allerdings nicht verstanden. Da es bei mir nun schon wieder ein bissl her is seit i den MetaEditor offen hatte, wollte ich eigentlich konkrete Codebeispiele vermeiden. Aber man kommt scheinbar nit drumrum ;) Also bitte mit Vorsicht genießen. In konkretem Code sollte es ca so aussehen: int idx=0; for(idx= OrdersTotal() -1;idx>= 0;idx--) { if(!OrderSelect(idx,SELECT_BY_POS,MODE_TRADES)) continue; // user only MY orders if(OrderMagicNumber() != magicNumber) continue; if(OrderOpenTime() < TimeCurrent() - maxTimeInDays*86400){ double closeprice= Bid; if(OrderType() == OP_SELL) closeprice= Ask; OrderClose(OrderTicket(),OrderLots(),closeprice,3); } } hoffe ich hab keine Syntaxfehler... falls doch sieh es als Übungsaufgabe sie zu beheben ;). Zum ganzen Zeitding: das einfachste is du machst es dir einfach und sagst "Order älter als 3 Tage (im Sinn von "älter als 3*24*60*60 Sekunden) -> schließen". Wenn du sagst "heute um 00:00 werden alle Trades von vor 3 tagen geschlossen", dann musst du TimeDay() verwenden bzw. noch besser TimeDayOfYear. Und ja, datetime in MQL is eigentlich genau das gleiche wie der timestamp in MySQL. Einfach die Anzahl der Sekunden seit 1.1.1970 00:00. hth EDIT: um den Code wirklich einsetzbar zu machen, müsstest noch eine Abfrage einbauen ob es eine offenen oder Pending oder is. (OrderType() == OP_BUY || OrderType() == OP_SELL)... bei Pending Orders funkt OrderClose nicht, da musst du OrderDelete nehmen (oder eine meta-funktion wie zB in der TradeBox ;) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.