Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Kapitalschutz

Geschrieben

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. :wub:

 

Was ist hier falsch?

Featured Replies

Geschrieben

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.

Geschrieben

du solltest deine kleine funktion nicht den gleichen Namen geben wie die externe variable

nenn 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);
}

Geschrieben
...ich möchte in ein bestehendes EA einen Kapitalschutz reinschreiben.

 

Hallo omega.jpg

 

dürfen wir hier diesen/deinen EA kennen lernen?

 

Welche Logik hat er?

Geschrieben
  • Autor

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 Trades

Omega

Geschrieben

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 ist
  • Wenn 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 ;)

Geschrieben

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

Geschrieben
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 :poud:

 

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 :wink2: (Ja ich bin immer etwas spät bei sowas ;)

Geschrieben

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 von whipsaw
Code Tag eingefügt

Geschrieben
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 ;)

Geschrieben
  • Autor

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?

Geschrieben
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)

Geschrieben
  • Autor

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.