Öffne neue Order gleich nachdem letzte Oder ausgestoppt wurde
Hallo alle zusammen,
Ich habe mal eine Frage. Ich möchte eine Marktorder sofort eröffnen, wenn die letzte Order in den Stopp Loss gerannt ist. Wie kann man das mit einbinden? Ich habe meine gewöhnlichen Marktorder Konditionen. Wenn eines der Order, die per Bedingung eröffnet wurden in den Stopp geht soll eine Gegenposition sofort eröffnet werden. Der Stopp soll der gleiche wie bei der letzten Order sein und der Take Profit soll die Pips der ausgestoppten Position plus XPips haben. Kann mir jemand bei meiner Frage behilflich sein? Vielen Dank im Vorraus :) Aron |
Zitat:
wenn die letzte Order in den Stopp Loss gerannt ist. Code:
if(OrderClosePrice()==OrderStopLoss()) |
Hallo pako,
das funktioniert nur, wenn es kein Slippage beim Schliessen der Order gab. Gruss yytrader |
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Slippage in OrdersHistoryTotal():confused::eek: script |
Okay schon mal vielen Dank, aber wie bette ich diesen Code in meinem EA ein, muss dieser Befehl direkt unter die Long bzw. Short Order Ausführung zu stehen haben oder wie muss ich das einbetten?
Danke schonmal im Vorraus :) |
Zitat:
Das ist der Teil, der nicht so funktioniert: Code:
//check for long position |
Zitat:
|
Zitat:
|
Also keiner eine Lösung dafür?
Ist es den möglich eine Bedingung festzulegen wenn eine Order in den Stopp-loss Bzw. in den Take Profit gelaufen ist? Gruß Aron |
Für eine BuyOrder:
if(OrderClosePrice()<=OrderStopLoss()) für eine SellOrder: if(OrderClosePrice()>=OrderStopLoss()) oder noch sicherer im OrderComment() der Order der Historie nach den Worten sl oder tp suchen. traderdoc |
Zitat:
soweit bin ich nun auch gekommen nur die Sache ist die, an welcher stelle soll der Code eingebettet werden das ist meine Hauptproblem, weil er muss ja auch darauf reagieren. Innerhalb der Bedingungs Loop oder wo anders? Sprich wie verknüpfe ich die Bedinung. Gruß Aron |
Okay ich habe mal eine Sache programmiert. Sie soll checken ob die letzte Order ein Profit war oder nicht. Falls das der Fall ist, soll sie in die Condition Loop wieder rein, falls sie ein Loss war soll sie unten den Befehl ausführen (eine Order eröffnen, Gegenposition)
Der Code sieht die wie folgt aus: Code:
double mymagicnumber = 123456; Gruß Aron |
Zitat:
Keiner einen Ansatz für mein Problem? Gruß Aron |
Code:
int ticket; Die Logik im unteren Teil erschließt sich mir zwar nicht, aber Du wirst schon Deine Gründe haben. Ansonsten solltest Du nochmals ganz knapp darlegen, was genau!! gemacht werden soll. traderdoc |
Zitat:
Wenn der Trade ein Loss ist (wie unten), dann soll er eine Position sofort in Gegenrichtung eröffnen. Mit total ist gemeint, dass er zudem checken soll, ob sich schon eine Order im Markt befindet. Wenn dies der Fall ist, soll er keine neue eröffnen. Also immer nur eine Positition im Markt. Gruß Aron |
Code:
int ticket; traderdoc |
Zitat:
Gruß Aron Hier nochmal als Anhang der Teil meines EAs, wo die Bedingung drin stehen: Code:
|
Das kann nicht der ganze Code sein, denn der wäre nur mit Fehlern compilierbar. (z.B. total nicht deklariert, Benutzung von return(0) ohne Einsprungpunkt). Entscheidend für die Lebensdauer der Variablen ist der Ort der Deklaration.
Desweiteren baue an markanten Stellen die Funktion Print() ein. In der Klammer dann Ausdrücke, die angezeigt werden sollen, z.B. Variablen oder Ergebnisse von Berechnungen oder Rückgabewerte von Funktionen. Zur reinen Verfolgung, wo der EA hinläuft, reicht es auch aus zu schreiben: Print("T"); Erscheint dann das T im Reiter Journal oder ExpertAdvisor, dann weißt Du, dass er da lang gelaufen ist. So kannst Du immer weiter einengen, bis Du die Stelle gefunden hast, an der es lag. traderdoc |
Zitat:
Hier der komplette EA (bis auf eine kleine Berechnung): Code:
//-------------------------------------------------------------------- |
int lastorder; solltest Du mal gegen int lastorder = -1; ersetzen.
Daran liegt es aber nicht. Du mußt Dir überlegen, wo der EA lang laufen soll un dan den Stellen, wo Du das kontrollieren willst, schreibst Du halt Print("T"); Sollten mehrere Stellen gleichzeitig kontrolliert werden dann Print("T1");, Print("T2"); usw.Damit kannst Du dann genau unterscheiden wo, und v.a. an der Reihenfolge der Prints, wann er im Verlaufe der Abarbeitung wo langgelaufen war. Experimentiere doch einfach mit dem Print etwas. traderdoc |
Zitat:
Code:
if (closedProfit < 0) { Gruß Aron |
"OrderSend error 130"
bedeutet Invalid Stops, d.h. der Wert des StopLoss oder TakeProfit in der Funktion OrderSend() ist so falsch, dass der MT4 keine Order öffnen kann. Also die Stops kontrollieren! traderdoc |
Zitat:
Er soll faktisch sofort eine Market Order eröffnen, sobald der vorherige Trade in den Stop gelaufen ist. Kann es vielleicht auch an der Verzögerung liegen, dass es dort Schwierigkeiten gibt? Also das eine sofortige Market Order nicht möglich ist zu dem gleichen Preis, wie der Stop der letzten Order war? Kann der error 130 vielleicht noch etwas anderes bedeuten? Gruß Aron |
if (closedProfit < 0) {
Print("T"); // if(total < 1) { //was soll total sein??? if (lastorder == 0) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2,STOPLOSS, TAKEPROFIT, NULL, mymagicnumber); } if (lastorder == 1) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, STOPLOSS, TAKEPROFIT, NULL, mymagicnumber); } } Laß Dir doch über Print() die Werte für StopLoss und TakeProfit ausdrucken, dann wirst Du sehen, dass die nicht stimmen. Wenn ich das richtig überflogen habe, dann werden die beiden Werte oben aus den externen Variablen übernommen. Das geht natürlich nicht. In Deinen vorherigen OrderSend-Funktionen sind die SL und TP anscheinend ja richtig berechnet worden. traderdoc |
Zitat:
Ich habe allerdings auch mal probiert einfach Werte einzusetzen eg. 20 für SL und 30 für TP, allerdings kommt dann immer noch der Fehler. Ist das auch ein Fehler einfach Werte dafür einzusetzen? Gruß Aron |
Zitat:
Print(StopLoss)! Berechne doch einfach den zu setzenden StopLoss so, wie Du ihn auch weiter oben bei Dir im Programm schon berechnet hast! traderdoc |
Zitat:
{ ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2,NormalizeDouble(Ask - STOPLOSS*Point(),Digits()), NormalizeDouble(Ask + TAKEPROFIT*Point(),Digits()), NULL, mymagicnumber); } |
Zitat:
STOPLOSS*Point() und TAKEPROFIT*Point() Außerdem wieder diese unsaubere Sache mit dem Ignorieren der 5-DigitBroker. Das würde bei ihm nach Deiner Funktion und den Variablenwerten von StopLoss = 25 und TakeProfit = 20 zu realen Werten von 2,5 und 2,0 Pips führen. Da kann es schon wieder Probleme mit dem StopLevel geben. traderdoc |
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
und logische fehler lieber im debugger suchen aber erst syntax fehler korrigieren |
Zitat:
Ja! Das sollte man da immer berechnen. Nur wenn er die Funktion so nimmt, wie Du sie vorgegeben hast, kann es falsch werden und dann wundert er sich beim nächsten mal, warum wieder der Fehler 130 kommt oder warum seine Stops so dicht am Entry sitzen. traderdoc |
Zitat:
Code:
if (closedProfit < 0) { Woran kann das jetzt liegen? Gruß Aron |
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
{ if (lastorder == 0) { RefreshRates(); S=Bid + second_sl; T=Bid - second_tp; Print("T =", T, " S =", S); ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, S, T, NULL, mymagicnumber); } if (lastorder == 1) { RefreshRates(); S=Ask - second_sl; T=Ask + second_tp; Print("T =", T, " S =", S); ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2,S, T, NULL, mymagicnumber); } } erst syntax fehler korrigieren |
Diese! Änderungen haben aber nichts damit zu tun, ob das Programm unter
if (closedProfit < 0) einspringt oder nicht. Wichtig wäre v.a., dass vorher auch S und T deklariert werden und wie hast Du nun das second_sl und second_tp berechnet? traderdoc |
Zitat:
Code:
extern double TAKE = 10; Ist damit alles richtig? Gruß Aron |
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das Problem ist, er erkennt diesen Befehl gar nicht. Im Journal zeigt er nur an, dass er bei der ersten Bedingung ist (falls Profit), die andere wird ignoriert.. Hier nochmal das Journal (T-1 heißt die erste Bedingun falls Gewinn). Gruß Aron |
Zitat:
|
Zitat:
Gruß Aron |
Zitat:
Woran könnte das liegen? Gruß Aron |
Der Code ist zu lang, um mal so den Fehler aus der Hüfte geschossen zu erkennen.
Der Weg, den Fehler zu eruieren, geht darüber, dass Du Dir überlegst, wie die Abfolge im Code ist und an den markanten Stellen über Print() Dir die Ausgabe anzeigen läßt. Hatte ich aber alles schon geschrieben. Nochmals die korrekten Stopangaben haben nix mit dem Einsprung an dieser Stelle zu tun. Da liegt der Hase woanders begraben. traderdoc |
Zitat:
Woran kann das liegen? Gruß Aron |
Alle Zeitangaben in WEZ +2. Es ist jetzt 00:46 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