|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
double TrailingStopLoss = iCustom(NULL,0,"SuperTrend",10,3.0,0,0);
double sl = TrailingStopLoss; if (Bid > sl) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,sl,0, "My Order",16384,0,Green); traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
double TrailingStopLoss = iCustom(NULL,0,"SuperTrend",10,3.0,0,0);
double sl = TrailingStopLoss; Den Teil unbedingt in die Funktion start() unter double Ticket; schreiben. Ich gehe mal davon aus, dass die Custom-Werte des Super-Indis Kurswerte sind!? Ansonsten mal auslesen über double TrailingStopLoss = iCustom(NULL,0,"SuperTrend",10,3.0,0,0); Print (DoubleToStr(TrailingStopLoss, Digits); Ansonsten ticket und ticket2 mit int deklarieren! bool ordermodify = OrderModify(OrderTicket(),OrderOpenPrice(),Open[0]-Point*sl,OrderTakeProfit(),0); sl liegt bereits als subtrahierbarer Wert vor. Das Point müßte schon mal gelöscht werden, nur dann würde der modifizierte sl sehr, sehr tief liegen!! Wozu aber OrderModify(), wenn der sl bereits bei OrderSend() angegeben wurde und das OrderTakeProfit() ergibt eh 0, weil nicht gesetzt. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Hi,
suuuuper, hat mein erstes Problem gelöst! Kurz zu dem sl: Die Idee ist, einen TrailingStop auf Basis des SuperTrend-Indikators zu haben. Deshalb soll der StopLoss immer mit dem SuperTrend verändert werden. Mein Problem ist, dass er das nicht macht. Er lässt den StopLoss immer an der gleichen Stelle, nämlich an dem Ort, wo der ST stand, als die Position eröffnet wurde. Er zieht aber den Stopp nicht nach. Eigentlich müsste er ja jede Periode überprüfen, wie der ST steht und dann nachziehen. Das mit dem Überprüfen steht drin, er greift nämlich auf die Variable zu. Code:
bool ordermodify = OrderModify(OrderTicket(),OrderOpenPrice(),Open[0]-sl,0,0); Code:
if (Bid > sl) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,sl,0, "My Order",16384,0,Green); LG (PS: Meinst du wirklich, dass der SL zu tief sei?) |
|
|||
Wenn eine! Order offen ist wird ab hier
if(ord > 0) return (0); //Abbrechen, es ist schon eine Position eröffnet. das Programm verlassen. Damit kann der SL auch nicht verändert werden. Außerdem greift der EA nicht nur jede Periode auf den Super-Indi zu, sondern mit jedem Tick. Soll er nur am Anfang jeder Kerze zugreifen, dann sollte das so aussehen: OldBar vorher global int datetime deklarieren. if (Time[0] != OldBar) { ... OldBar = Time[0]; } Die Punkte sind nun der Platz, wo einmalig genau zu Beginn einer neuen Kerze eine Aktion stattfindet. Also bei Dir die Indikatorabfrage! Aber Achtung die letzte Ziffer muß eine 1 sein, weil auf den Wert der letzten geschlossenen! Kerze Bezug genommen wird. double TrailingStopLoss = iCustom(NULL,0,"SuperTrend",10,3.0,0,1); traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Ich meine, nicht das ich mich beklagen würde:
Ich habe den Kontostandt verzehnfacht, aber gewollt waren so viele Positionen nicht Vielen Dank für den Tipp mit if return(0), dass habe ich völlig übersehen. Den Teil habe ich jetzt verübergehend entfernt, nur jetzt habe ich wieder das Problem mit den vielen Orders, siehe Bild. Ich hatte auch mal daran gedacht, in die Einstiegsbedingung das zu schreiben: Code:
if(rsio() == true && BBo() == true && sto() == true && OrdersTotal == 0) //Wenn Alle Indikatoren true sind und die offenen Positionen in diesem Markt 0 sind, eröffne eine long - Position. Was mich auch wundert, ist, dass er zum Teil Positionen eröffnet, wo er keine Positionen eröffnen darf, also von den Startbedingungen her, die ich global definiert habe. Das mit dem RSI habe ich noch nicht korrekt definiert (Weil ich noch herausfinden muss, wie ich das mit der Kreuzung der 70er Linie schreibe.), aber das BollingerBand ist eigentlich korrekt definiert, und wird trotzdem oft einfach ignoriert. LG TrololoTromberino Edit: Nachziehen mag er den SL immernoch nicht. Das kann vielleicht aber auch daran liegen: Code:
2015.07.30 15:48:54.125 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Fehler beim Positionsliquidieren. 2015.07.30 15:48:54.125 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Open - Supertrend #-2147483645.8823 2015.07.30 15:48:54.125 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Openprice #1.1177 2015.07.30 15:48:54.125 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Supertrend #2147483647 2015.07.30 15:48:54.061 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Fehler beim Positionsliquidieren. 2015.07.30 15:48:54.054 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Open - Supertrend #-2147483645.8823 2015.07.30 15:48:54.054 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Openprice #1.1177 2015.07.30 15:48:54.054 2015.06.26 16:30 Neuer Versuch Long only EURUSD,M15: Supertrend #2147483647 2015.07.30 15:48:54.045 Neuer Versuch Long only inputs: Lots=1; Slip=2; 2015.07.30 15:48:54.041 TestGenerator: unmatched data error (volume limit 623 at 2015.07.24 13:00 exceeded) 2015.07.30 15:48:54.039 TestGenerator: unmatched data error (volume limit 349 at 2015.07.23 22:00 exceeded) 2015.07.30 15:48:51.939 TestGenerator: current spread 16 used Geändert von trololotromberino (31.07.15 um 10:22 Uhr) Grund: Hatte noch etwas hinzuzufügen. |
|
|||
equity sieht aber schon etwas brutal aus
|
|
|||
Hallo trololotromberino,
in der OrderModify Funktion benötigst du einen absoluten Kurs. Diesen hast du schon in der Variable sl, daher entferne mal das Open[0] - und schon sollte es funktionieren. Ich habe das nicht getestet, nur durch hinsehen, könnte also falsch sein. Tip: Verwende doch den Debugger oder nutze Print-Statements,um dir die momentenen Werte anzuzeigen. gruß yytrader |
|
||||
Hi,
danke, der Tipp hat immerhin dafür gesorgt, dass ich überhaupt wieder Orders reinkriege. Das Problem: Er schießt mir immernoch 10000 Orders pro Signal an die Börse und den Stopp zieht er leider nicht nach. Will er einfach nicht. Ich bin den Stopp Zeile für Zeile durchgegangen, finde aber einfach nicht heraus, wo der Fehler liegt. LG |
|
||||
Zitat:
Ich lasse eine einzige Order erstellen (eigentlich): Code:
if(rsio() == true && BBo() == true && sto() == true && OrdersTotal()== 0) //Wenn Alle Indikatoren true sind und die offenen Positionen in diesem Markt 0 sind, eröffne eine long - Position. { if (Bid > sl) ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,sl,0, "My Order",16384,0,Green); //Order soll erstellt werden. if(ticket == 0) { Print("OrderSend failed with error #",GetLastError()); } else Print("OrderSend placed successfully #" + string(ticket)); Und danach lasse ich einen Stoploss, den ich iniziiert habe, einfach nachziehen: Code:
if (Time[0] != OldBar) { if( OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0 ) //Trailingstop, der auf Basis des SuperTrend Indikators nachgezogen werden soll. (Nur für Long) { if( OrderType()==OP_BUY ) { bool ordermodify = OrderModify(OrderTicket(),OrderOpenPrice(),sl,0,0); if (ordermodify == false) {Alert ("Stoploss NICHT nachgezogen! ERROR!");} else {Alert ("StopLoss nachgezogen");} } } OldBar = Time[0]; } |
Lesezeichen |
Stichworte |
k.g. trololotromberino system, mql4, programmierung, programmierung metatrader, trading system, tradingsystem |
|
|