Geschrieben 19. Juli 200916 Jr. comment_82390 Hallo, ich möchte in ein bestehendes EA einen Kapitalschutz reinschreiben. Also wenn die Equity unter einen einstellbaren Wert fällt, soll das EA keine Positionen mehr eröffnen. Dazu habe ich am Anfang geschrieben: extern int Kontostand = 1000; und noch vor int start () bool Kontostand() { if (AccountEquity() > Kontostand) return (true); else return (false); } eingefügt.Funktioniert aber nicht. Was ist hier falsch? Melden
Geschrieben 19. Juli 200916 Jr. comment_82393 warum hast du es VOR dem startblock geschrieben?wird es in der init oder im startblock den aufgerufen? sollte das EA nicht die möglichkeit gegeben werden die position zu schliessen?du solltest es eventuell nach dem schliessenblock innerhalb des startblocks aber VOR dem Positionsöffnungsblock einfügen. -INIT (einmal beim starten bzw. bei TF wechsel) -START (bei jedem TICK) -deinit (beim beenden der EA um ressis frei zu lassen) du kannst deine funktionen hinschreiben wo du willst vor bzw nach dem start... wenn keins dieser 3 funktionen deine funktion aufruft so wird dies nicht ausgeführt. Melden
Geschrieben 19. Juli 200916 Jr. comment_82394 du solltest deine kleine funktion nicht den gleichen Namen geben wie die externe variablenenn doch deine funktion einfach fKontostand.wenn du wirklich keine position beenden willst so füge diese zeile einfach am anfang in deinen startblock ein. if (!fKontostand()) { Print ("out of money"); return(0); } Melden
Geschrieben 19. Juli 200916 Jr. comment_82402 ...ich möchte in ein bestehendes EA einen Kapitalschutz reinschreiben. Hallo dürfen wir hier diesen/deinen EA kennen lernen? Welche Logik hat er? Melden
Geschrieben 24. Juli 200916 Jr. Autor comment_83324 Danke für die Antworten, bin ein bisschen spät habe aber zur Zeit zu viel um die Ohren und wenig Zeit für Börse -EA. Also wenn ich es richtig verstehe sind die Programmzeilen richtig, ich muss es nur noch richtig platzieren. Ich will es in ein gekauftes EA einfügen, dieses handelt (wie die meisten) Nachts bei geringer Vola auf Devisen. Trefferquote ca. 90%, aber sehr kleiner Gewinn und sehr großer Stopp. Das Problem ist das es eben auch manchmal vorkommt das der Stopp erreicht wird. Und noch größer wird das Problem dadurch das es meist in meheren Devisenpaaren gleichzeitig schlecht läuft. Durch den Kapitalschutz will ich den Einsatz des EA an solchen Tagen einschränken. Denn an den tagen wo es gut läuft treten kaum größere Verluste auf. Bitte bei Euren Antworten bedenken das ich wirklich Anfänger bin. Viele Grüße und gute TradesOmega Melden
Geschrieben 26. Juli 200916 Jr. comment_83626 Hi Omega, ich glaube das Problem ist weniger der Code sondern eher die Frage was du genau tun willst.Bei einem niedrigen Kontostand dem EA verbieten irgendwas zu tun (wie das geht hat siscop schon angedeutet) entspricht glaub ich nicht dem was du erreichen willst. So wie du es beschreibst klingen die Anforderungen eher so:Wenn der EA innerhalb einer Nacht größere Verluste macht, schließe alle Positionen und eröffne in dieser Nacht keine Neuen.Wenn du das ganze mit dem Kontostand koppelst stoppt der EA zwar bei großem Verlust, startet aber erst wieder wenn du die Schwelle senkst oder Kapital nachschießt. Was vielleicht eher deinen Vorstellungen entspricht:Überprüfe wie hoch der Verlust in der aktuellen Nacht istWenn Verlust zu hoch: schließe Positionen und stelle Handel für diese Nacht ein Zur Realisierung: Merk dir zu Beginn der Nacht den aktuellen Kontostand (durch eine (intern) globale oder statische Variable) Frage in der start() Funktion jeweils die Bedingung "aktueller Kontostand Wenn ja, schließe alle Positionen und beende start() durch "return(0)". Falls du noch Fragen zur exakten Implementierung hast, immer her damit ;) Melden
Geschrieben 27. Juli 200916 Jr. comment_83804 Ich würde es eher so machen, dass ich alle abgeschlossenen Trades der Nacht (bzw. der letzten x Stunden) durchgehe und die Gewinne/Verluste aufsummiere und dann gegen den max. Verlust prüfe. -> Vorteil: Auch bei Neustart des Metattrader (oder Rechner incl. Metattrader z.b. bei Stromausfall) funktioniert diese Variante zuverlässig. Knochen Melden
Geschrieben 27. Juli 200916 Jr. comment_83808 Hallo Knochen, willkommen bei Tom-Next. (Btw: Mein Avatar findet Dich lecker, soll ich Dir ausrichten ) Melden
Geschrieben 29. Juli 200916 Jr. comment_84114 Ich würde es eher so machen, dass ich alle abgeschlossenen Trades der Nacht (bzw. der letzten x Stunden) durchgehe und die Gewinne/Verluste aufsummiere und dann gegen den max. Verlust prüfe. -> Vorteil: Auch bei Neustart des Metattrader (oder Rechner incl. Metattrader z.b. bei Stromausfall) funktioniert diese Variante zuverlässig. Das wär die etwas aufwändigere aber auch sichere Variante stimmt. Da Omega geschrieben hat das er Anfänger ist, hab ich mich mal voerst aber für die am einfachsten zu programmierende Variante entschieden Um meine Variante "Neustart-sicher" zu machen, müsste man nur den Equitywert zu Beginn der Nacht mit Timestamp in ein File schreiben, und beim starten des EA diesen Wert auslesen, damit braucht man immer noch nicht die gesamte Trades-Liste durchgehen ;) btw: Willkommen bei Tom-Next (Ja ich bin immer etwas spät bei sowas ;) Melden
Geschrieben 29. Juli 200916 Jr. comment_84149 Ja klar stimmt, aber dafür sind wir ja da, um entsprechende Code-schnippsel bereit zu stellen. Meine Variante müßte so funktionieren (hoffe ich hab keine Fehler drin) //>>>>>>>>>> double GetCurrentDayProfit() { int pos, Total = OrdersHistoryTotal(); datetime dtOrderCloseTime; double dDayProfit=0; for (pos = Total-1; pos >= 0; pos--) { if (OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if (OrderType() < 2) { dtOrderCloseTime = OrderCloseTime(); if ((Year() == TimeYear(dtOrderCloseTime)) && (Month() == TimeMonth(dtOrderCloseTime)) && (Day() == TimeDay(dtOrderCloseTime))) { dDayProfit += OrderProfit()+OrderCommission()+OrderSwap(); } else break; //Schleife verallssen, da jetzt nur noch historische Tardes kommt, die vor dem aktuellen Tag liegen } } } return(dDayProfit); } //<<<<<<<<<< Also ich habe die Funktion nicht getestet, aber sollte eigentlich funktionieren. Man muss sie jetzt nur noch verwenden (z.B. "if (GetCurrentDayProfit() Bearbeitet 29. Juli 200916 Jr. von whipsaw Code Tag eingefügt Melden
Geschrieben 29. Juli 200916 Jr. comment_84152 else break; //Schleife verallssen, da jetzt nur noch historische Tardes kommt, die vor dem aktuellen Tag liegen Ich glaube MT garantiert nicht das die Orders in irgendeiner Reihenfolge in der History liegen, man müsste also alle Orders durchgehen. Vorteil von dieser Variante ist natürlich, das du dich leicht auf einen bestimmen EA (MagicNumber) einschränken kannst was den aktuellen Verlust angeht! @Omega: einfach nachfragen wenn was unklar ist... egal wie "dumm" die Frage klingt ;) Melden
Geschrieben 29. Juli 200916 Jr. Autor comment_84154 Hallo, dankeschön für die Hilfe. Aber so ganz automatisiert/kompliziert brauche ich es garnicht. Mir genügt es wenn beim unterschreiten der Equity keine neue Position mehr eröffnet wird. Alles andere ist ja nur eine Rechenaufgabe und das möchte ich manuell vor Arbeitsaufnahme des EA machen.Also die offenen Positionen sollen nicht geschlossen werden, dafür sind diese mit einem Stopp-Loss versehen und solange dieser nicht erreicht ist kann die Position ja auch noch im Gewinn enden. Ist mein Code oben nun richtig? Und an welcher Stelle muss er in das EA eingefügt werden? Melden
Geschrieben 29. Juli 200916 Jr. comment_84158 Ist mein Code oben nun richtig? Und an welcher Stelle muss er in das EA eingefügt werden? Der Code an sich ist wie siscop schon geschrieben hat richtig, du musst die Funktion nur aufrufen. Aber wozu eine eigene Funktion verwenden? Wenn du es so einfach wie möglich haben willst, füg einfach diese zwei Zeilen so in start() ein: start() { if(AccountEquity() < Kontostand) return(0); <...restlicher Teil von start() ...> } Das ist dann gleichwertig als würdest du den EA unter der Kontostand-Schwelle händisch deaktivieren. (Damit hat der EA aber auch keinerlei Einfluss mehr auf die offenen Positionen. Willst du das lediglich keine neuen Orders erstellt werden, der EA aber weiterhin die offenen verwaltet, dann musst du jede OrderSend(...) Funktion in eine if-Schleife packen: if(fKontostand()) OrderSend(...) (fKontostand() ist die Funktion aus siscops Post) Melden
Geschrieben 29. Juli 200916 Jr. Autor comment_84281 Ok, Danke die obere Version scheint mir einfacher für mich umzusetzen. Aber haben möchte ich eigentlich die untere Variante, so das das EA die offenen Positionen weiter verwaltet. Bin mir da aber nicht sicher ob ich das schon umsetzen kann. Aber danke erstmal, werde mich dann damit beschäftigen. Viele Grüße und gute Trades Omega Melden
Hallo,
ich möchte in ein bestehendes EA einen Kapitalschutz reinschreiben.
Also wenn die Equity unter einen einstellbaren Wert fällt, soll das EA keine Positionen mehr eröffnen.
Dazu habe ich am Anfang geschrieben:
extern int Kontostand = 1000; und noch vor int start () bool Kontostand() { if (AccountEquity() > Kontostand) return (true); else return (false); }eingefügt.
Funktioniert aber nicht.
Was ist hier falsch?