English Русский 中文 Español 日本語 Português Italiano Türkçe
Marktmathematik: Gewinn, Verlust und Kosten

Marktmathematik: Gewinn, Verlust und Kosten

MetaTrader 5Beispiele | 31 Oktober 2022, 09:37
516 0
Evgeniy Ilin
Evgeniy Ilin

Inhalt

Einführung

Bei der Entwicklung von Expert Advisors habe ich nicht darauf geachtet, was bestimmte Werte bei der Berechnung von Gewinn oder Verlust bedeuten. Für die Erstellung von EAs ist es nicht erforderlich, sich mit dieser Frage zu befassen. In der Tat, warum sollte ich alle diese Werte zu erfassen, wenn man bedenkt, dass MQL5 und sogar MQL4 enthalten alle notwendigen Funktionen, um Berechnungen durchzuführen? Nach einer gewissen Zeit und einer gewissen Erfahrung stellen sich jedoch unweigerlich Fragen. Irgendwann beginnen wir, solche Details zu bemerken, die uns vorher unbedeutend erschienen. Nachdem man etwas darüber nachgedacht hat, erkennt man, dass ein EA die Katze im Sack ist. Alle Daten zu diesem Thema, die ich im Internet finden konnte, erwiesen sich als dürftig und unstrukturiert. Deshalb habe ich beschlossen, sie selbst zu strukturieren. Nach der Lektüre dieses Artikels werden Sie ein vollständiges und funktionierendes mathematisches Modell erhalten und lernen, alles, was mit Aufträgen zu tun hat, zu verstehen und richtig zu berechnen.

Gleichungen zur Berechnung der Gewinne oder Verluste von Positionen

Um ein effizientes Handelssystem zu entwickeln, muss man zunächst einmal verstehen, wie der Gewinn oder Verlust eines jeden Auftrags berechnet wird. Wir sind alle in der Lage, unsere Gewinne und Verluste irgendwie zu berechnen, um unser Geldmanagementsystem aufrechtzuerhalten. Jemand macht das intuitiv, jemand führt grobe Schätzungen durch, aber fast jeder EA hat die notwendigen Berechnungen aller notwendigen Größen. Die Entwicklung von EAs diszipliniert das Denken und man kann verstehen, was wie berechnet wird und was unbezahlbar ist. Kommen wir zur Sache. Es lohnt sich, mit der einfachsten Idee zu beginnen, wie der Gewinn eines Auftrags berechnet wird. Ich persönlich habe immer gewusst, dass die Gewinnberechnung in ihrem Wesen recht komplex ist, aber auf einigen einfachen Überlegungen beruht. Um das Verständnis zu vereinfachen, nehmen wir an, dass Spread, Swap und Provision nicht existieren. Ich glaube, viele Menschen berücksichtigen diese Werte zunächst gar nicht. Natürlich bietet die MQL5-Sprache integrierte Funktionen wie OrderCalcProfit und möglicherweise weitere, aber in diesem Artikel möchte ich die Grundlagen erläutern, damit jeder versteht, was wie berechnet wird. Eine solche Akribie kann verwirrend sein, aber die Nichtbeachtung von Parametern wie Spread, Kommission und Swap ist ein fataler Fehler, den viele Händler begehen. Jeder dieser Werte wirkt sich auf seine eigene Weise auf den Gewinn oder Verlust aus. In meinen Berechnungen werde ich alles berücksichtigen und zeigen, wie solche Kleinigkeiten helfen können. Gewinn und Verlust von Positionen ohne Spreads, Provisionen und Swaps:

  • PrBuy = Lot * TickValue * [ ( PE - PS )/Point ] — Gewinn für einen Kaufauftrag
  • PrSell = Lot * TickValue * [ ( PS - PE )/Point ] — Gewinn für einen Verkaufsauftrag
  • Point — kleinstmögliche Preisänderung für ein ausgewähltes Symbol
  • TickValue — Gewinn für eine gewinnbringende Position, wenn sich der Preis um „1“ Punkt bewegt
  • PE — Handelsschlusskurs (Bid)
  • PS — Handelseröffnungskurs (Bid)

Solche Werte wie Point und TickValue werden in MQL5 auf der Ebene von vordefinierten Variablen definiert oder sind innerhalb der integrierten Funktionen in Form des Rückgabewerts der Funktion SymbolInfoDouble verfügbar. Ich werde das Thema MQL5 in meinen Artikeln regelmäßig auf die eine oder andere Weise berühren, weil es oft möglich ist, vielen Dingen auf den Grund zu gehen, indem man einfach analysiert, wie MQL5 oder seine bestimmte Funktionalität aufgebaut ist.

Lassen Sie uns nun das Verständnis dieser Gleichung etwas erweitern. Ein Kaufauftrag wird zum Ask (Briefkurs) eröffnet, während ein Verkaufsauftrag zum Bid (Geldkurs) eröffnet wird. Dementsprechend wird ein Kaufauftrag zum Bid und ein Verkaufsauftrag zum Ask geschlossen. Schreiben wir die Gleichungen unter Berücksichtigung der neuen Änderungen neu:

  • PrBuy = Lot * TickValue * [ ( Bid2 - Ask1 )/Point ] — Gewinn für einen Kaufauftrag
  • PrSell = Lot * TickValue * [ ( Bid1 - Ask2 )/Point ] — Gewinn für einen Verkaufsauftrag
  • Bid1 — Eröffnungspreis des Verkaufsgeschäfts
  • Ask1 — Eröffnungskurs des Kaufgeschäfts
  • Bid2 — Schlusskurs des Kaufgeschäfts
  • Ask2 — Schlusskurs des Verkaufsgeschäfts

Das nachstehende Fragment der Spezifikation enthält die meisten Daten, die wir später benötigen werden:

benötigte Daten

Dies ist nur ein Teil der Daten, die für die Berechnung benötigt werden. Der Rest der Daten kann mit verschiedenen integrierten MQL5-Funktionen ermittelt werden. Nehmen wir den USDJPY als Beispiel. Eigentlich brauchen wir keine Spezifikation, um einen Code zu schreiben, aber um zu verstehen, wo diese Daten angezeigt werden, kann sich als sehr nützlich erweisen.

Lassen Sie uns diesmal über die Kommission nachdenken. Die Provision pro Auftrag kann auf verschiedene Weise berechnet werden, aber die wichtigsten Methoden laufen auf einen Prozentsatz der gehandelten Lose hinaus. Es gibt noch andere Möglichkeiten, eine Handelsprovision zu erheben, aber ich werde sie hier nicht besprechen, da wir sie nicht brauchen werden. Ich werde zwei mögliche Szenarien für die Berechnung der Provision betrachten. Ich glaube, sie reichen aus. Wenn wir den Swap als Grundlage nehmen, dann können die Swap-Beispiele eine andere gängige Berechnungsmethode nahelegen, die auf die Provision angewendet werden kann — die Berechnung in Punkten.

Infolgedessen haben wir zwei scheinbar unterschiedliche Methoden. Wie wir noch sehen werden, sind diese Methoden jedoch nur eine bequeme Form der Wahrnehmung derselben „Besteuerungsmethode“, einschließlich der Spanne. Nachstehend finden Sie zwei Gleichungen für die Berechnung der Provision:

  1. Provision = Lot * TickValue * ComissionPoints
  2. Comission = Lot * ContractSize * BidAlpha * ComissionPercent/100

Hier sehen wir den neuen Wert „ContractSize“, der auch in MQL5 auf der Ebene einer integrierten Funktionalität implementiert ist, die Informationen vom Handelsserver erhält. Dieser Wert ist einer der wichtigsten und ist in absolut allen Gewinn- und Verlustberechnungen vorhanden, wenn auch in impliziter Form, um die Berechnungen für Programmierer zu vereinfachen. Ich sehe die Gültigkeit solcher Vereinfachungen vom Standpunkt des Programmierers aus. Aber unser derzeitiges Ziel ist es, alles zu verstehen. Warum dies notwendig ist, werden Sie am Ende des Artikels sehen. Außerdem habe ich eine zusätzliche Variable BidAlpha eingeführt. Ich werde im Folgenden auch seine Bedeutung erklären. Die folgenden in der Symbolspezifikation angegebenen Werte erscheinen ebenfalls:

  • ComissionPoints — Provision in Punkten
  • ComissionPercent — Provision als Prozentsatz der Vertragssumme
Der Multiplikator BidAlpha wird benötigt, um einen Swap in Einheiten der Basiswährung in einen Swap in Einheiten unseres Saldos umzurechnen. Hier gibt es vier Szenarien:
  1. BidAlpha = 1 (wenn die Basiswährung dieselbe ist wie die Einzahlungswährung)
  2. BidAlpha = Bid (für das ausgewählte Symbol)
  3. BidAlpha = Bid (des entsprechenden Kurses, wobei die Basiswährung des gewählten Symbols mit der Basiswährung des Übergangssymbols übereinstimmt und die zweite Währung mit der Einzahlungswährung übereinstimmt)
  4. BidAlpha = 1/Ask (des entsprechenden Kurses, wobei die Basiswährung des gewählten Symbols mit der zweiten Währung des Übergangssymbols übereinstimmt und die Basiswährung mit der Einzahlungswährung übereinstimmt)

Wenn die Kontraktgröße auf das Paar USDCHF angewandt wird, ist es klar, dass die Basiswährung des ausgewählten Paares der USD ist. Angenommen, wir haben eine Einlage in USD, dann wird die Übergangswährung USDUSD und ihr Kurs ist dementsprechend immer eins. Der zweite Fall ist noch einfacher. Nehmen wir an, wir haben ein EURUSD-Paar, das auch der Umrechnungskurs ist, sodass sein Bid der erforderliche Wert ist. Der dritte Fall könnte folgendermaßen aussehen. Angenommen, unsere Währung ist EURNZD. Dann müssen wir den Umrechnungskurs zwischen EUR und USD ermitteln. Wir brauchen den EURUSD-Kurs und das Bid dieses Kurses. Im vierten Fall sind die Dinge ein wenig komplizierter. Nehmen wir an, wir haben CHFJPY ausgewählt. Es ist klar, dass das Übergangspaar USDCHF ist, da es keinen Wechselkurs für CHFUSD auf Forex gibt. Natürlich können wir unser eigenes synthetisches Symbol erstellen und mit CHFUSD arbeiten. In diesem Fall können wir den vorherigen Fall verwenden. Aber in Wirklichkeit müssen wir dieses Symbol nur umdrehen, dann wird seine Rate gleich „1/Ask“ der aktuellen „ungünstigen“ Rate. In der Tat schaffen wir ein synthetisches Symbol, ohne es in den Mittelpunkt zu stellen. Das Gleiche gilt für Swaps. Es gibt auch noch einige andere Fragen. Welcher Kurs sollte zum Beispiel in der Übergangswährung verwendet werden — Geldkurs, Briefkurs oder Mittelkurs? Diese Frage kann mit dem derzeitigen Ansatz nicht gelöst werden. Wir werden nach und nach den richtigen Ansatz finden. Lassen Sie uns nun den Rahmen für Verbesserungen zumindest annähernd definieren. Zu diesem Zweck sollten wir zumindest die erste ungefähre Version der allgemeinen Gewinn- und Verlustgleichung aufstellen und dabei alle „Steueroptionen“ wie Spread, Swap und Provision berücksichtigen.

Für die Berechnung der Swaps ergeben sich ähnliche Gleichungen:

  1. Swap = Lot * TickValue * SwapPoints * SwapCount(StartTime,EndTime)
  2. Swap = Lot * ContractSize * BidAlpha * SwapPercent/100 * SwapCount(StartTime,EndTime)

Die Gleichungen sind in der Tat sehr ähnlich. Der einzige Unterschied besteht darin, dass der bestimmte Multiplikator hier in Form der Funktion SwapCount erschienen ist. Ich hoffe, Sie gestatten mir eine gewisse terminologische Freiheit. Es handelt sich um eine Funktion, da die Swaps nicht sofort berechnet werden und ihr Betrag von den Eröffnungs- und Schließzeiten der Positionen abhängt. In grober Näherung können wir natürlich auch auf den Multiplikator verzichten und Folgendes schreiben:

  • SimpleCount = MathFloor( (EndTime -StartTime) / ( 24 * 60 * 60 ) )

Wenn wir davon ausgehen, dass EndTime und StartTime vom Typ „datetime“ sind, dann entspricht ihre Differenz der Anzahl der Sekunden zwischen dem Eröffnungs- und dem Schließzeitpunkt der Position. Der Swap wird einmal pro Tag berechnet, also müssen Sie diesen Wert nur durch die Anzahl der Sekunden eines Tages teilen. Auf diese Weise können wir uns einen ersten Eindruck davon verschaffen, wie Swap-Positionen bewertet werden können. Natürlich ist diese Gleichung bei weitem nicht perfekt, aber sie gibt die Antwort auf die Frage, um welche Art von Funktion es sich handelt und was sie liefert. Außerdem kann sie andeuten, wie der Swap (zumindest annähernd) berechnet wird. Sie gibt die Anzahl der angefallenen Swaps während der Laufzeit der Position zurück. Ebenso wird die Provision in der Spezifikation als einer von zwei möglichen Werten für den Swap mit der obligatorischen Angabe der Berechnungsmethode angegeben:

  • SwapPoints — Swap für einen einzelnen Positions-Rollover in Punkten
  • SwapPercent — Swap für einen Rollover einer Einzelposition in % der Kontraktgröße

Während die Gleichungen im Falle der Kommission einfacher sind und keiner Klärung bedürfen, ist im Falle des Swaps alles viel komplizierter, aber auf die Feinheiten und Nuancen dieser Vereinfachungen werden wir später eingehen. Bringen wir zunächst die Gewinn- und Verlustgleichungen (ohne Provisionen und Swaps) in eine konsistentere Form:

  • PrBuy = Lot * TickValue * [ ( Bid2 - (Bid1+S1*Point) )/Point ] — Gewinn für einen Kaufauftrag
  • PrSell = Lot * TickValue * [ ( Bid1 - (Bid2+S2*Point) )/Point ] — Gewinn für einen Verkaufsauftrag
  • S1 — Spread bei Eröffnung eines Kaufauftrags
  • S2 — Spread beim Schließen eines Verkaufsauftrags

Es ist klar, dass Ask sowohl Spread als auch Bid umfasst. Trennen wir den Gewinn oder Verlust des Auftrags vom Spread, indem wir sie zu einem separaten Summanden machen:

  • PrBuy = Lot * TickValue * [ ( Bid2 - Bid1)/Point ] + ( - Lot * TickValue * S1 ) — Gewinn für einen Kaufauftrag
  • PrSell = Lot * TickValue * [ ( Bid1 - Bid2)/Point ] + ( - Lot * TickValue * S2 ) — Gewinn für eine Verkaufsorder

Es ist zu erkennen, dass in beiden Gleichungen ein bestimmter Summand abgetrennt wurde, nämlich der Teil, der vom Makler berechnet wird. Natürlich ist dies nicht der gesamte Betrag, aber zumindest können Sie jetzt klarer sehen, was wir bekommen und was sich der Makler nimmt. Beachten Sie, dass im ersten Fall unsere „Steuer“ auf den Spread nur vom Spread-Wert abhängt, wenn wir eine „Kauf“-Position eröffnen, und im zweiten Fall, wenn wir eine „Verkauf“-Position schließen. Es stellt sich heraus, dass wir dem Makler einen Teil unseres Gewinns in Form eines Spreads genau zum Zeitpunkt des Kaufs geben, und zwar immer. Wenn wir uns näher mit dem Forex-Handel befassen, wird deutlich, dass die Eröffnung einer Kaufposition und die Schließung einer Verkaufsposition gleichwertige Aktionen sind, die durch unsere Gleichungen bestätigt werden. In diesem Fall:

  • S1 — Spread in Punkten bei der Eröffnung einer beliebigen Position
  • S2 — Spanne in Punkten beim Schließen einer beliebigen Position

Diese Werte sind genau die, die Sie im Fenster Market Watch sehen können, wenn Sie den Spread anzeigen möchten. Die entsprechende integrierten MQL5-Funktion SymbolInfoInteger mit den entsprechenden Eingaben liefert genau die gleichen Werte. Sie können die Eingaben in der MQL5-Hilfe finden. Meine Aufgabe in diesem Fall ist es, ein bequemes mathematisches Berechnungsmodell zu erstellen, das an die MQL5-Sprache gebunden ist, sodass diese Gleichungen sofort in jeden EA oder jeden anderen nützlichen MQL5-Code kodiert werden können. Hier ist unser Summand, der nun sowohl dem Swap als auch der Provision ähnlich ist:

  • SpreadBuy = - Lot * TickValue * S1
  • SpreadSell = - Lot * TickValue * S2

Spread bei Eröffnen und Schließen

Üblicherweise wird der Spread zum Kaufzeitpunkt berechnet, aber ich werde Ihnen jetzt zeigen, warum das nicht richtig ist. Ich habe viel Marktforschung betrieben, und es stellte sich heraus, dass der Punkt „0:00“ der vorhersehbarste Zeitpunkt der Preisbewegung ist. Dies ist der Übergang von einem Tag zum anderen. Wenn Sie diesen Punkt genau beobachten, werden Sie bei allen Währungspaaren ungefähr das Gleiche sehen — einen Sprung in Richtung der Kursabwärtsbewegung. Dies geschieht durch einen Anstieg der Spanne an diesem Punkt. Auf den Sprung folgt ein gleichmäßiger Rollback. Was ist der Spread oder Spreizung bzw. Spanne? Der Spread ist die Differenz zwischen Bid und Ask. Konventionell wird angenommen, dass diese Lücke eine Folge der Markttiefe ist. Wenn die Markttiefe mit Limit-Aufträgen gesättigt ist, tendiert der Spread gegen Null, und wenn die Akteure den Markt verlassen, steigt der Spread. Wir können dies als eine Desintegration der Markttiefe bezeichnen. Schon auf den ersten Blick können wir sagen, dass es hier nicht um den Bid-Preis geht. Es stellt sich heraus, dass Ask und Bid grundsätzlich gleich sind. Dies ist leicht zu verstehen, wenn man sich vorstellt, dass es zum Beispiel möglich ist, ein USDEUR-Spiegelinstrument aus „EURUSD“ zu konstruieren, und dann wird Bid zu Ask und umgekehrt Ask zu Bid. Einfach ausgedrückt: Wir kehren die Markttiefe einfach um.

Die Ask-Linie wird in der Regel nicht im Chart angezeigt, obwohl dies nützlich wäre:

Bid & Ask

Wie wir sehen können, beginnen Ask und Bid zu verschmelzen, während sich die Chart-Periode vergrößert. Vielleicht zeigt aus diesen Gründen kein Terminal beide Linien an, obwohl ich persönlich der Meinung bin, dass dies eine notwendige Option ist. Es ist jedoch nicht so wichtig, das Vorhandensein dieser Werte und ihre Unterschiede zu kennen, denn man kann sie trotzdem in einem EA verwenden. Ich habe hier nicht die Mitte gezeichnet, aber ich denke, jeder versteht, dass diese Linie genau in der Mitte zwischen Bid und Ask liegt. Es liegt auf der Hand, dass die Differenz zwischen diesen Werten bei langen Zeiträumen praktisch keine Rolle spielt, und es scheint, dass man das Vorhandensein von Ask nicht berücksichtigen muss, aber es ist in der Tat notwendig. Diese Details sind sehr wichtig.

In diesem Sinne können wir nun mit absoluter Sicherheit sagen, dass die Mitte der Markttiefe bei solchen Transformationen eine Invariante ist. Dieser Wert kann wie folgt berechnet werden:

  • Mid = (Ask + Bid) / 2

Wenn man eine solche Darstellung betrachtet und die letzte Gleichung verwendet, kann man sehen, dass:

  • Bid = Mid * 2 - Ask
  • Ask = Mid * 2 - Bid

Weiter:

  • Bid = Mid * 2 – (Bid + S*Point) = Mid – (S*Point)/2
  • Ask = Mid * 2 – (Ask - S*Point) = Mid + (S*Point)/2

Diese Ausdrücke können nun in die ursprünglichen Gleichungen zur Berechnung des Gewinns oder Verlusts von Aufträgen eingesetzt werden. Es war wichtig, genau diese Ausdrücke zu bekommen, denn ich möchte Ihnen etwas zeigen, das Sie vorher nicht verstanden haben. Es stellt sich heraus, dass der vom Broker berechnete Betrag nicht nur vom Kaufzeitpunkt abhängt, sondern sowohl vom Einstiegs- als auch vom Ausstiegszeitpunkt sowie von der jeweiligen Position. Schauen wir uns an, was aus unseren Gleichungen wird, wenn wir dort neue erweiterte Definitionen einfügen. Wir können Folgendes feststellen:

  • PrBuy = Lot * TickValue * [ ( (Mid2 - (S2*Point)/2) - (Mid1 + (S1*Point)/2) )/Point ]
  • PrSell = Lot * TickValue * [ ( (Mid1 - (S1*Point)/2) - (Mid2 + (S2*Point)/2) )/Point ]

Nach den entsprechenden Umformungen können wir dies sehen:

  • PrBuy = Lot * TickValue * [ (Mid2 – Mid1)/Point ] - Lot * TickValue * (  S1/2 + S2/2  )
  • PrSell = Lot * TickValue * [ (Mid1 – Mid2)/Point ] - Lot * TickValue * (  S1/2 + S2/2  )

Wenn man bedenkt, dass:

  • Bid1 = Mid1 – (S1*Point)/2
  • Bid2 = Mid2 – (S2*Point)/2
  • Ask1 = Mid1 + (S1*Point)/2
  • Ask2 = Mid2 + (S2*Point)/2

Und wenn man weiters bedenkt, dass:

  • Mid1 — mittlere Markttiefe bei Eröffnung einer Position
  • Mid2 — Mitte der Markttiefe beim Schließen einer Position

Der Einfachheit halber bezeichnen wir den negativen Summanden, der den Verlust aus Spreads definiert, wie folgt:

  • Spread = -Lot * TickValue * (  (S1*Point)/2 + (S2*Point)/2  )

Und dementsprechend zeigt der Summand einen Gewinn oder Verlust ohne Spread, Kommission und Swap an, zum Beispiel:

  • ProfitIdealBuy = Lot * TickValue * [ (Mid2 – Mid1)/Point ]
  • ProfitIdealSell = Lot * TickValue * [ (Mid1 – Mid2)/Point ]

Jetzt können wir praktische Gleichungen aufstellen, die alle Verluste aus Spread, Provision und Swaps berücksichtigen. Beginnen wir mit dem Prototyp des Ausdrucks. Gehen wir von den aktuellen Gewinn- und Verlustgleichungen für Aufträge aus, wobei hier nur der Spread berücksichtigt wird:

  • TotalProfitBuy = ProfitIdealBuy + (Spread + Comission + Swap)
  • TotalProfitSell= ProfitIdealSell + (Spread + Comission + Swap)

Vielleicht hätte ich diese Gleichung ganz am Anfang schreiben sollen, aber ich denke, dass sie hier besser aufgehoben ist. Wir können sehen, dass die obskure TickValue fast überall präsent ist. Die Hauptfrage ist, wie er berechnet wird und wie ein und derselbe Wert zu verschiedenen Zeitpunkten zur Berechnung verwendet werden kann. Zeitpunkte bedeuten Ein- und Ausstiege aus Positionen. Ich denke, Sie verstehen, dass dieser Wert dynamischer Natur ist und zudem für jedes Handelssymbol anders ausfällt. Wird dieser Wert nicht in Komponenten zerlegt, ergeben sich Fehler, die umso größer sind, je weiter die „Ziele“ entfernt sind. Mit anderen Worten, die erhaltenen Gleichungen sind nur ein Näherungswert. Es gibt eine absolut exakte Gleichung, die keine dieser Unzulänglichkeiten aufweist. Die oben ermittelten Verhältnisse dienen als Grenzwert. Die Grenzen selbst können wie folgt ausgedrückt werden:

  • Lim[ dP -> 0 ] ( PrBuy(Mid1, Mid1+dP… ) ) = TotalProfitBuy(Mid1, Mid1+dP…)
  • Lim[ dP -> 0 ] ( PrSell(Mid1, Mid1+dP… ) ) = TotalProfitSEll(Mid1, Mid1+dP…)
  • Mid1+dP = Mid2 — der neue Preis ergibt sich aus dem vorherigen plus dem gegen Null tendierenden Delta
  • TotalProfitBuy = TotalProfitBuy(P1,P2... ) — wie festgestellt wurde, ist der Gewinn oder Verlust eine Funktion der mittleren Werte und vieler anderer
  • TotalProfitSell = TotalProfitSell(P1,P2... ) — ähnlich

Im Allgemeinen können äquivalente Grenzen für ein allgemeines Verständnis der Situation auf viele Arten festgelegt werden. Es besteht keine Notwendigkeit, sie zu vervielfältigen. In unserem Fall reicht eine aus, um Klarheit zu schaffen.

Wir haben zwar einige Gleichungen erhalten und sie funktionieren auch, aber die Grenzen der Anwendbarkeit sind sehr bedingt. Als Nächstes werden wir uns damit beschäftigen, die Anfangsgleichungen zu erhalten, die solche Näherungsgleichungen zur Folge haben. Ohne die Bausteine zu kennen, aus denen sich ein Gewinn oder ein Verlust zusammensetzt, werden wir diese Gleichungen nie verstehen. Diese Gleichungen wiederum helfen uns nicht nur dabei, die genauesten Kennzahlen für die Berechnung von Gewinn und Verlust zu finden, sondern auch das Ungleichgewicht der Marktprozesse zu ermitteln, das anschließend einen Gewinn abwerfen kann.

Die genaueste Methode zur Berechnung von Gewinn und Verlust von Positionen

Um zu verstehen, wie man diese Gleichungen aufstellt, müssen wir zu den Grundlagen zurückkehren, nämlich was Kaufen und Verkaufen sind. Zunächst ist es jedoch wichtig, sich daran zu erinnern, dass Kaufen eigentlich bedeutet, dass man sein Geld gegen ein Produkt eintauscht. Eine andere Währung kann als Ware betrachtet werden, da sie die Fähigkeit symbolisiert, bestimmte Güter zu besitzen. Dann ist klar, dass der Verkauf der umgekehrte Prozess des Umtauschs der zweiten Währung gegen die erste ist. Lässt man jedoch alle Konventionen beiseite, so zeigt sich, dass Kaufen und Verkaufen gleichwertige Handlungen sind. Eine Währung wird gegen eine andere getauscht, und der einzige Unterschied besteht darin, welche Währung wir weggeben und welche wir im Gegenzug erhalten.

Auf der Suche nach Informationen über diese Berechnungen bin ich auf seltsame Konventionen gestoßen, die ich persönlich lange Zeit nicht nachvollziehen konnte, weil sie keine Grundlage haben. Da ich ein Techniker bin, der viel Erfahrung mit dem Studium verschiedener technischer Materialien hat, habe ich zwei sehr einfache Wahrheiten festgestellt. Wenn Ihnen das Material nicht klar ist und Fragen aufwirft, dann gilt:

  • Die Autoren verstehen es selbst nicht ganz, also tun sie ihr Bestes, um Sie mit allen Mitteln vom Gegenteil zu überzeugen (dies geschieht in der Regel mit antilogischen Aussagen).
  • Einzelheiten werden absichtlich weggelassen, um Ihnen unnötige Informationen vorzuenthalten.

Die nachstehende Abbildung entwickelt die Idee weiter und macht sie leichter verständlich. Sie zeigt zwei Arten von Marktaufträgen an, die geöffnet und geschlossen werden:

kaufen & verkaufen

Ich denke, dass die Teile Abschnitt „Spreads“ und „Current“ jetzt klarer werden. Im Allgemeinen ist dieses Bild für den gesamten Artikel relevant, aber in diesen Teilen ist es am nützlichsten.

Natürlich bin ich sicher, dass es in der Fachliteratur korrekte Berechnungen gibt, aber es ist offensichtlich, dass es schwieriger ist, diese Informationen zu finden, als selbst zu erraten, was fehlt. Die Konvention besagt, dass wir, wenn wir z. B. EURUSD kaufen, EUR kaufen und USD verkaufen. Lassen Sie uns das ausschreiben:

  • EUR = Lot * ContractSize
  • USD = - Ask1 * Lot * ContractSize = - (Bid1 + S1*Point) * Lot * ContractSize

In diesem Fall ergibt sich, dass wir beim Kauf einen positiven Betrag der Basiswährung und einen negativen Betrag der zweiten Währung erhalten. Ich glaube, ich bin nicht der Einzige, der das für völligen Unsinn hält. Nachdem ich etwas darüber nachgedacht habe, bin ich zu dem Schluss gekommen, dass die Verhältnisse zwar richtig sind, aber auf eine ziemlich unintuitive Weise dargestellt werden. Um EUR zu kaufen, brauchen wir eine andere Währung, USD, die wir aus unserer Bilanz nehmen, von einem Makler leihen oder beide Methoden anwenden sollten. Mit anderen Worten: Wir nehmen zunächst USD aus einem gemeinsamen Speicher und leihen sie aus. Jetzt sieht es so aus:

  • USD1 = Ask1 * Lot * ContractSize = (Bid1 + S1*Point) * Lot * ContractSize — das haben wir uns geliehen.
  • EUR1 = Lot * ContractSize — dies ist der Betrag, den wir mit geliehenen Mitteln zum Ask-Wechselkurs zum Zeitpunkt des Kaufs gekauft haben.

Der negative Wert wird später erscheinen. In der Tat kann sie im Moment nicht hier sein. Der negative Wert erscheint, wenn wir unsere Position schließen. Wenn die Position also offen ist, sollte sie auch geschlossen werden. Es stellt sich heraus, dass wir die Aktion Verkaufen mit derselben Losgröße durchführen müssen. Wenn wir uns an die üblichen Überlegungen halten:

  • EUR2 = Lot * ContractSize
  • USD2 = Bid2 * Lot * ContractSize

Es stellt sich heraus, dass wir bereits EUR verkaufen und USD kaufen. Was unsere Transformationen betrifft, so nehmen wir die EUR, die wir in geliehene Mittel umgetauscht haben, von uns und tauschen sie in die geliehene Währung zurück. Ein Gewinn oder Verlust ergibt sich, wenn man die geliehenen Mittel von den erhaltenen Mitteln abzieht:

  • Profit_EUR = EUR1 – EUR2 = 0
  • Profit_USD = USD2 – USD1 = Bid2 * Lot * ContractSize - (Bid1 + S1*Point) * Lot * ContractSize = Lot * ContractSize * ( Bid2 – Bid1 – S1*Point)

Es stellt sich heraus, dass der EUR verschwindet und nur der USD übrig bleibt. Wenn unsere Einzahlung in USD erfolgt, brauchen wir die resultierende Währung nicht in die Einzahlungswährung umzurechnen, da beide gleich sind. Die Gleichung ist derjenigen, die wir zu Beginn zugrunde gelegt haben, sehr ähnlich, der einzige Unterschied besteht darin, dass Provisionen und Swaps hier nicht berücksichtigt werden, da sie separat betrachtet werden. Schreiben wir diesen Ausdruck nun ein wenig um:

  • Profit_USD = Lot * (ContractSize*Point) * [ ( Bid2 – Bid1 – S1*Point) / Point ]

Hier dividieren und multiplizieren wir einfach die rechte Seite mit Punkt und erhalten unsere ursprüngliche Gleichung. Dieselbe Gleichung erhält man, wenn man das ursprüngliche System der Konventionen anwendet, das besagt, dass wir unabhängig von der Handelsrichtung zur gleichen Zeit verkaufen und kaufen. In diesem Fall wird alles, was geliehen wurde, mit einem Minuszeichen versehen, das symbolisiert, dass wir Schulden haben, während der gekaufte Betrag mit einem Pluszeichen versehen wird. In einem solchen System von Konventionen brauchen wir nicht zu überlegen, was wir wohin und von wo aus ändern. Lassen Sie uns das Gleiche mit diesem Ansatz tun:

  • EUR1 = Lot * ContractSize
  • USD1 = - Ask1 * Lot * ContractSize = - (Bid1 + S1*Point) * Lot * ContractSize

Dies ist ein Kauf. Aktion eins.

  • EUR2 = - Lot * ContractSize
  • USD2 = Bid1 * Lot * ContractSize

Dies ist ein Verkauf. Aktion zwei.

Darüber hinaus wird alles vereinfacht, weil wir nicht mehr darüber nachdenken müssen, was wir wie von was abziehen müssen. Wir müssen einfach alle EUR und alle USD getrennt zusammenzählen. Die Basiswährung verschwindet ohnehin und es bleibt nur die zweite Währung übrig. Addieren wir und vergewissern wir uns, dass die Gleichungen mit den vorherigen identisch sind:

  • Profit_EUR = EUR1 + EUR2 = 0
  • Profit_USD = USD1 + USD2 = - (Bid1 + S1*Point) * Lot * ContractSize + Bid2 * Lot * ContractSize = Lot * ContractSize * ( Bid2 – Bid1 – S1*Point)

Es stellt sich heraus, dass der Gewinn eines beliebigen Symbols ausschließlich in der zweiten Währung (nicht in der Basiswährung) betrachtet wird, und die Basiswährung verschwindet immer während des gesamten Öffnungs- und Schließzyklus. Natürlich wird alles bei einem Verkauf gespiegelt. Schreiben wir dies alles auf, um unsere Berechnungen zu vervollständigen. Jetzt verkaufen wir EURUSD und schließen diese Position mit einem „Buy“:

  • EUR1 =  - Lot * ContractSize
  • USD1 = Bid1 * Lot * ContractSize

Dies ist ein Verkauf. Aktion eins.

  • EUR2 = Lot * ContractSize
  • USD2 = - (Bid2 + S2*Point) * Lot * ContractSize

Dies ist ein Kauf, Aktion zwei.

Addieren wir nun alle Werte auf die gleiche Weise:

  • Profit_EUR = EUR1 + EUR2 = 0
  • Profit_USD = USD1 + USD2 = Bid1 * Lot * ContractSize - (Bid2 + S2*Point) * Lot * ContractSize = Lot * ContractSize * ( Bid1 – Bid2 – S2*Point)

Wie Sie sehen können, unterscheidet sich die Gleichung nur dadurch, dass Bid1 und Bid2 vertauscht sind. Und natürlich wird der Spread zum Schlusspunkt der Position berechnet, denn der Schlusspunkt ist der Kaufpunkt. Bis jetzt stimmt alles mit den ursprünglichen Gleichungen überein. Es ist auch erwähnenswert, dass wir jetzt wissen, was TickValue ist, zumindest wenn die zweite Währung (nicht die Basiswährung) unseres Symbols mit der Währung unserer Einzahlung übereinstimmt. Schreiben wir die Gleichung für diesen Wert:

  • TickValue = ContractSize * Point

Allerdings ist dieser Wert wiederum nur für Symbole geeignet, bei denen die Währung eines Gewinns der Währung unserer Einlage entspricht. Aber was ist, wenn wir z.B. einen Kreuzkurs, wie AUDNZD, verwenden? Die Hauptsache ist hier nicht das Symbol selbst, sondern die Tatsache, dass dieser Wert immer in Bezug auf die Währung unserer Einlage berechnet wird, und wir ihn vom Handelsserver erhalten. Aber wenn wir diese Gleichung in Bezug auf den Wechselkurs anwenden, dann stellt sich heraus, dass sie natürlich funktioniert, aber nicht in unserer Einzahlungswährung, sondern in der zweiten Währung des Symbols. Um diesen Wert in die Einzahlungswährung umzurechnen, muss er mit einem bestimmten Verhältnis multipliziert werden, das dem Umrechnungskurs entspricht, den wir im vorherigen Block betrachtet haben.

  • TickValueCross = ContractSize * Point * BidAlphaCross

Die Berechnung des Umrechnungskurses ist recht einfach:

  1. Sehen Sie sich die zweite Währung in unserem Symbol an (nicht die Basiswährung).
  2. Suchen Sie nach einem Symbol, das diese Währung und die Währung unserer Einzahlung enthält.
  3. Tauschen Sie zum entsprechenden Kurs.
  4. Falls erforderlich, spiegeln Sie das Symbol.

Wenn wir z.B. mit EURCHF handeln und eine Einlage in USD haben, dann wird der anfängliche Gewinn in CHF sein, sodass wir das Instrument USDCHF und dessen Kurs verwenden können. Wir müssen also CHF in USD umtauschen, dann stellt sich heraus, dass wir USD für CHF kaufen müssen. Da aber CHF = PBid * USD, then USD = (1/PAsk) * CHF und entsprechend:

  • BidAlphaCross = 1/PAsk

Verwenden wir für das zweite Beispiel ein anderes Symbol. Wenn wir z.B. AUDNZD handeln und einen Gewinn in NZD erzielen, können wir den NZDUSD-Kurs nehmen, und da USD = PBid * NZD, dann in diesem Fall:

  • BidAlphaCross = PBid

Lassen Sie es uns herausfinden. Die Umrechnung von CHF in USD bedeutet „+USD ; -CHF“. Mit anderen Worten: Wir verlieren eine Währung und gewinnen eine andere. Das bedeutet: Kauf von USD, Verkauf zum USDCHF-Kurs, zum Preis von PAsk, was eigentlich nur Folgendes bedeutet: “USD = (1/PAsk) * CHF”. Es ist einfacher, sich das folgendermaßen vorzustellen: Wenn wir kaufen, sollten wir etwas weniger USD erhalten, als es der Fall wäre, wenn der Makler nichts von unserem Umtauschgeschäft nehmen würde. Das bedeutet, dass wir bei einer Division durch ein größeres PAsk einen Wert erhalten, der kleiner als 1/P ist.

Im zweiten Fall ist die Situation umgekehrt. Die Umrechnung von NZD in USD bedeutet „+USD ; -NZD“, d.h. Verkauf zum PBid-Preis unter Verwendung des NZDUSD-Kurses. Legen wir ein ähnliches Verhältnis für „USD = PBid * NZD“ fest. Der Umtausch erfolgt wiederum zu einem etwas schlechteren Kurs, dem „PBid“. Alles passt zusammen. Alles ist transparent und leicht zu verstehen. Denken Sie daran, dass der primäre perfekte Satz „PMid“ ist, den ich oben betrachtet habe. In Anbetracht dessen ist es leicht zu verstehen, dass der Spread nichts anderes ist als der Prozentsatz, den der Broker in Form der umgetauschten Währung berechnet. Daher wird jeder Handel, sei es die Eröffnung oder die Schließung einer Position, von einer Maklergebühr für den Währungsumtausch, dem so genannten Spread, begleitet. Der Rest dieser Steuer ist in Provisionen und Swaps enthalten.

Der Umrechnungskurs ist nicht erforderlich und das Verhältnis ist nur dann gleich eins, wenn die Gewinnwährung mit der Währung unserer Einlage übereinstimmt, sodass das Verhältnis im Falle der wichtigsten Währungspaare verschwindet und die Tickgröße für alle diese Paare fest ist. Wie im vorherigen Fall kann sich unser Handelssymbol als Übergangskurs erweisen, sodass wir es nicht unter anderen Symbolen suchen müssen.

Schreiben wir unter Berücksichtigung des neuen BidAlphaCross-Wertes die Gewinn- und Verlustgleichungen für den Auftrag ohne Kommission und Swap neu:

  • BuyProfit = BidAlphaCross * Lot * ContractSize * ( Bid2 – Bid1 – S1*Point)
  • SellProfit = BidAlphaCross * Lot * ContractSize * ( Bid1 – Bid2 – S2*Point)

In Anbetracht dessen:

  • Bid1 = Mid1 – (S1*Point)/2
  • Bid2 = Mid2 – (S2*Point)/2

Schreiben wir die Gleichungen in einer anschaulicheren Form um, indem wir dort die Verhältnisse durch Mid ersetzen:

  • BuyProfit = BidAlphaCross * Lot * ContractSize * ( Mid2 – (S2*Point)/2 – Mid1 + (S1*Point)/2 – S1*Point)
  • SellProfit = BidAlphaCross * Lot * ContractSize * ( Mid1 – (S1*Point)/2 – Mid2 + (S2*Point)/2 – S2*Point)

Vereinfachen wir das Ganze:

  • BuyProfit = Lot * BidAlphaCross * ContractSize * Point * [ ( Mid2 – Mid1 )/ Point  - ( S1/2 + S2/2 ) ]
  • SellProfit = Lot * BidAlphaCross * ContractSize * Point * [ ( Mid1 – Mid2 )/ Point  - ( S1/2 + S2/2 ) ]

Eine weitere Vereinfachung:

  • BuyProfit = Lot * TickValueCross * [ ( Mid2 – Mid1 )/ Point ] - Lot * TickValueCross * ( S1/2 + S2/2 )
  • SellProfit = Lot * TickValueCross * [ ( Mid1 – Mid2 )/ Point ] - Lot * TickValueCross * ( S1/2 + S2/2 )

Jetzt, denke ich, ist es einfacher und klarer geworden. Ich habe den Summanden, der mit dem Spread verbunden ist, absichtlich entfernt, damit wir sehen können, dass dies genau der berechnete Wert ist, unabhängig davon, wie lange unsere Position oder unser Auftrag aktiv bleibt.

Genaue Berechnungsfunktion für den Swap

Nun gilt es, die Gleichungen für Swaps zu klären. Erinnern wir uns an die Gleichungen, die wir zu Beginn des Artikels erhalten haben:

  • Swap = Lot * TickValue * SwapPoints * SwapCount(StartTime,EndTime)
  • Swap = Lot * ContractSize * BidAlpha * SwapPercent/100 * SwapCount(StartTime,EndTime)

Im letzten Block haben wir festgestellt, dass TickValue kein einstelliger Wert ist und für verschiedene Währungspaare unterschiedlich berechnet wird. Es wurde festgestellt, dass:

  • TickValue = ContractSize * Point

Dies funktioniert jedoch nur für die Paare, bei denen die Gewinnwährung mit der Einzahlungswährung übereinstimmt. In komplexeren Fällen verwenden wir den folgenden Wert:

  • TickValueCross = ContractSize * Point * BidAlphaCross

wobei BidAlphaCross ebenfalls ein anderer Wert ist, der von der Einzahlungswährung und dem gewählten Symbol abhängt. All dies haben wir oben definiert. Auf dieser Grundlage müssen wir die erste Version der Gleichung umschreiben, indem wir die Standardkonstante ersetzen:

  • Swap = Lot * TickValueCross * SwapPoints * SwapCount(StartTime,EndTime)

Aber diese Gleichung ist noch lange nicht perfekt. Denn im Gegensatz zu einer Provision oder einem Spread kann ein Swap beliebig oft verrechnet werden, während Ihre Position offen bleibt. Es hat sich herausgestellt, dass im Falle von Kreuzkursen ein TickValueCross-Wert nicht ausreicht, um den gesamten Tausch zu beschreiben, denn es stellt sich heraus, dass dieser Wert zu jedem Tausch-Abgrenzungszeitpunkt geringfügig anders ist, weil sich der BidAlphaCross-Wert ändert. Schreiben wir die vollständigen Gleichungen zur Berechnung der Swaps für die beiden „Steueroptionen“ auf:

  1. Swap = SUMM(1 ... D) { Lot * (SwapPoints * K[i]) * TickValueCross[i] } — Summe aller aufgelaufenen Swaps in Punkten, für jeden Kreuzzeitpunkt 0:00
  2. Swap = SUMM(1 … D) { Lot * ContractSize * BidAlpha[i] * (SwapPercent/100 * K[i]) * } — in %

Arrays für die Summierung:

  • K[i] = 1 oder 3 — wenn das Verhältnis „3“ ist, bedeutet dies, dass es der Tag der Entstehung des Triple-Swaps war
  • TickValueCross[i] — Array der Tickgrößen an den Swap-Punkten
  • BidAlpha[i] — Array der Anpassungssätze zum Zeitpunkt der Swap-Berechnung

Schauen wir uns ein Beispiel für eine Swap-Berechnung für eine beliebige Bestellung an. Zu diesem Zweck werde ich die folgenden kurzen Notationen einführen:

  • TickValueCross[i] = T[i]
  • BidAlpha[i] = B[i]
  • K[i] = K[i]

Lassen Sie uns nun grafisch darstellen, wie wir die Swaps summieren werden:

Swap-Berechnung


Wir haben alle möglichen Beispiele für die Berechnung des Auftragsgewinns und -verlusts analysiert.

Praktischer Teil

In diesem Abschnitt werden wir unser mathematisches Modell testen. Insbesondere würde ich der Berechnung des Gewinns oder Verlusts ohne Berücksichtigung von Provisionen und Swaps besondere Aufmerksamkeit widmen. Wenn Sie sich erinnern, habe ich mich gefragt, zu welchem Zeitpunkt ich den Wert von TickValueCross berechnen sollte, wenn wir den Gewinn zum Kreuzkurs berechnen? Dieser Moment ist die einzige Unsicherheit in dem gesamten Modell, das ich testen werde. Dazu implementieren wir zunächst alle notwendigen Funktionen, um den Gewinn oder Verlust einer beliebigen Order mit Hilfe unseres mathematischen Modells zu berechnen, testen diese im Strategietester und vergleichen anschließend unsere Berechnungen mit realen Orderdaten aus der Handelshistorie. Das endgültige Ziel ist es, unser mathematisches Modell zu testen und es gleichzeitig mit der MQL5-Referenzfunktion wie OrderCalcProfit zu vergleichen.

Um all dies bewerten zu können, müssen vier Größen eingeführt werden:

  1. Real — Positionsprofit aus der History.
  2. BasicCalculated — der gleiche Gewinn, der bei der Eröffnung eines Auftrags mit der Funktion OrderCalcProfit berechnet wird.
  3. CalculatedStart — Gewinn, der zum Zeitpunkt der Positionseröffnung anhand unseres mathematischen Modells berechnet wird.
  4. CalculatedEnd — Gewinn, der zum Zeitpunkt der Schließung der Position anhand unseres mathematischen Modells berechnet wird.

Dabei gibt es drei Arten der durchschnittlichen Abweichung des Gewinnwerts:

  1. AverageDeviationCalculatedMQL = Summ(0..n-1) [ 100 * MathAbs(BasicCalculated - Real)/MathAbs(Real) ]  / n : relative Gewinnabweichung nach MQL5-Code
  2. AverageDeviationCalculatedStart = Summ(0.. n-1 ) [  100 * MathAbs(CalculatedStartReal)/MathAbs(Real) ] / n : relative Gewinnabweichung durch unseren Code bei der Eröffnung einer Position
  3. AverageDeviationCalculatedEnd =  Summ(0.. n-1 ) [  100 * MathAbs(CalculatedEnd Real)/MathAbs(Real) ] / n : relative Gewinnabweichung durch unseren Code beim Schließen einer Position

Analog dazu können Sie drei Arten der maximalen Abweichung eingeben:

  1. MaxDeviationCalculatedMQL = Max(0.. n-1 ) [ (100 * MathAbs(BasicCalculated - Real)/MathAbs(Real))  ] - relative Gewinnabweichung durch MQL5-Code
  2. MaxDeviationCalculatedStart =  Max(0.. n-1 ) [  (100 * MathAbs(CalculatedStart Real)/MathAbs(Real)) ]  - relative Gewinnabweichung durch unseren Code bei der Eröffnung einer Position
  3. MaxDeviationCalculatedEnd =  Max(0.. n-1 ) [  (100 * MathAbs(CalculatedEnd Real)/MathAbs(Real)) ]   - relative Gewinnabweichung durch unseren Code beim Schließen einer Position

wobei:

  • Summ(0..n-1) — Summe aller relativen Abweichungen aller „n“ Positionen
  • Max(0..n-1) — maximale relative Abweichung von allen „n“ Position

Wir können unser mathematisches Modell testen, indem wir diese Berechnungen in den Code eines beliebigen EA implementieren. Beginnen wir mit der Umsetzung unserer Gewinngleichung. Ich habe dies auf folgende Weise gemacht:

double CalculateProfitTheoretical(string symbol, double lot,double OpenPrice,double ClosePrice,bool bDirection)
   {
   //PrBuy = Lot * TickValueCross * [ ( Bid2 - Ask1 )/Point ]
   //PrSell = Lot * TickValueCross * [ ( Bid1 - Ask2 )/Point ]
   if ( bDirection )
      {
      return lot * TickValueCross(symbol) * ( (ClosePrice-OpenPrice)/SymbolInfoDouble(symbol,SYMBOL_POINT) );
      }
   else
      {
      return lot * TickValueCross(symbol) * ( (OpenPrice-ClosePrice)/SymbolInfoDouble(symbol,SYMBOL_POINT) );
      }   
   }

Hier haben wir zwei Gleichungen in einer: für den Kauf und für den Verkauf. Hierfür ist die Kennzeichnung „bDirection“ zuständig. Die zusätzliche Funktion zur Berechnung der Tickgröße ist grün hervorgehoben. Ich habe es auf folgende Weise implementiert:

double TickValueCross(string symbol,int prefixcount=0)
   {
   if ( SymbolValue(symbol) == SymbolBasic() )
      {
      return TickValue(symbol);
      }
   else
      {
      MqlTick last_tick;
      int total=SymbolsTotal(false);//symbols in Market Watch
      for(int i=0;i<total;i++) Symbols[i]=SymbolName(i,false);
      string crossinstrument=FindCrossInstrument(symbol);
      if ( crossinstrument != "" )
         {
         SymbolInfoTick(crossinstrument,last_tick);
         string firstVAL=StringSubstr(crossinstrument,prefixcount,3);
         string secondVAL=StringSubstr(crossinstrument,prefixcount+3,3);
         if ( secondVAL==SymbolBasic() && firstVAL == SymbolValue(symbol) )
            {
             return TickValue(symbol) * last_tick.bid;
            }
         if ( firstVAL==SymbolBasic() && secondVAL == SymbolValue(symbol) )
            {
            return TickValue(symbol) * 1.0/last_tick.ask;
            }         
         }
      else return TickValue(symbol);  
      }
   return 0.0;   
   }

Es gibt auch zwei Implementierungen für die folgenden Fälle:

  1. Die Gewinnwährung des Symbols ist die gleiche wie die Währung unserer Einlage
  2. Alle anderen Fälle (Suche nach einem Übergangssatz)

Das zweite Szenario unterteilt sich ebenfalls in zwei Fälle:

  • Die Einzahlungswährung steht an der Spitze des Umrechnungskurses
  • Die Einzahlungswährung steht am Ende des Umrechnungskurses

Alles steht in strenger Übereinstimmung mit dem mathematischen Modell. Um die letzten Abteilungen zu implementieren, müssen wir zunächst das richtige Tool zur Berechnung der Konversionsrate finden:

string FindCrossInstrument(string symbol,int prefixcount=0)
   {
   string firstVAL;
   string secondVAL;
   for(int i=0;i<ArraySize(Symbols);i++)
      {
      firstVAL=StringSubstr(Symbols[i],prefixcount,3);
      secondVAL=StringSubstr(Symbols[i],prefixcount+3,3);
      if ( secondVAL==SymbolBasic() && firstVAL == SymbolValue(symbol) )
         {
         return Symbols[i];
         }
      if ( firstVAL==SymbolBasic() && secondVAL == SymbolValue(symbol) )
         {
         return Symbols[i];
         }      
      }
   return "";
   }

Dazu müssen wir wissen, wie wir die Basiswährung aus einem Symbolnamen „herausnehmen“ können:

string SymbolValue(string symbol,int prefixcount=0)
   {
   return StringSubstr(symbol,prefixcount+3,3);
   }

Und die Gewinnwährung erhalten wir mit Hilfe der integrierten MQL5-Funktion:

string SymbolBasic()
   {
   return AccountInfoString(ACCOUNT_CURRENCY);
   }

Vergleichen Sie all dies mit den Währungen in allen Market Watch Symbolen vor der ersten Verwendung. Jetzt können wir diese Funktion beim Öffnen und Schließen von Positionen nutzen. Wenn Sie möchten, können Sie den Rest des Codes in der unten angehängten Datei sehen. Ich habe die Berechnung der Abweichungen nach dem Ende des Backtests hinzugefügt. Sie werden in das Terminalprotokoll geschrieben. Ich habe alle achtundzwanzig wichtigsten Währungspaare und Kreuzkurse getestet und die Ergebnisse in einer Tabelle zusammengestellt, damit wir die Leistung unseres mathematischen Modells bewerten und mit der MQL5-Implementierung vergleichen können. Die Ergebnisse wurden in drei bedingte Blöcke unterteilt. Die ersten beiden sehen wie folgt aus:

1 & 2 Blöcke

Wie Sie sehen können, funktionieren für die ersten vier Währungspaare sowohl der MQL5 als auch unsere Implementierung perfekt, da die Gewinnwährung dieselbe ist wie die Einzahlungswährung. Es folgt ein Block von drei Währungspaaren, bei denen die Basiswährung dieselbe ist wie die Gewinnwährung. In diesem Fall funktioniert die MQL5-Implementierung am besten, aber es ist bereits klar, dass der Berechnungsfehler beim Öffnen eines Auftrags viel höher ist als der gleiche Fehler beim Schließen. Dies zeigt indirekt, dass die Berechnung tatsächlich zum Zeitpunkt des Auftragsabschlusses durchgeführt werden sollte. Werfen wir einen Blick auf andere Währungspaare:

Block 3

Hier steht meine Funktionalität der grundlegenden MQL5-Funktionalität in nichts nach. Darüber hinaus ist klar, dass die Berechnungen, die beim Schließen einer Position durchgeführt werden, zu jeder Zeit viel genauer sind. Das einzige, was ich mir nicht erklären kann, ist das Vorhandensein von Nullen in der ersten Zeile des zweiten Blocks. Dafür kann es viele Gründe geben, aber ich habe den Eindruck, dass sie nichts mit meinem Modell zu tun haben, obwohl ich mich irren kann. Was die Überprüfung der Gleichungen für Provisionen und Swaps angeht, so halte ich dies nicht für notwendig. Ich bin zuversichtlich, was diese Gleichungen angeht, denn sie sind nicht besonders kompliziert.

Schlussfolgerung

In diesem Artikel habe ich ein mathematisches Modell entwickelt, das von Grund auf neu geschaffen wurde und sich nur auf Bruchstücke von Informationen stützt. Das Modell enthält alles, was Sie zur Berechnung von Aufträgen für die wichtigsten Währungspaare und Kreuzraten benötigen. Das Modell wurde im Strategietester getestet und kann sofort in jedem EA, Indikator oder nützlichen Skript verwendet werden. Die Anwendbarkeit dieses Modells geht weit über die Berechnung von Gewinnen, Verlusten oder Kosten hinaus, aber das ist ein Thema für einen anderen Artikel. Alle erforderlichen Funktionen und Beispiele für ihre Verwendung finden Sie in der Recherche-EA, die ich zur Erstellung der Tabelle verwendet habe. Der EA ist dem Artikel beigefügt. Sie können ihn selbst ausführen und die Ergebnisse mit der Tabelle vergleichen. Vor allem aber glaube ich, dass es mir gelungen ist, ein einfaches und logisches „Handbuch“ zu erstellen.



Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/10211

Beigefügte Dateien |
Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 27): Der Zukunft entgegen (II) Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 27): Der Zukunft entgegen (II)
Gehen wir nun zu einem vollständigeren Auftragssystem direkt auf dem Chart über. In diesem Artikel zeige ich einen Weg, das Auftragssystem zu reparieren, oder besser gesagt, es intuitiver zu gestalten.
Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 26): Der Zukunft entgegen (I) Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 26): Der Zukunft entgegen (I)
Heute werden wir unser Auftragssystem auf die nächste Stufe bringen. Aber vorher müssen wir noch einige Probleme lösen. Jetzt haben wir einige Fragen, die sich darauf beziehen, wie wir arbeiten wollen und welche Dinge wir während des Handelstages tun.
Einen technischen Indikator selber machen Einen technischen Indikator selber machen
In diesem Artikel gehe ich auf die Algorithmen ein, mit denen Sie Ihren eigenen technischen Indikator erstellen können. Sie werden lernen, wie man mit sehr einfachen Ausgangsannahmen ziemlich komplexe und interessante Ergebnisse erzielen kann.
Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 25): Herstellen eines robusten Systems (II) Einen handelnden Expert Advisor von Grund auf neu entwickeln (Teil 25): Herstellen eines robusten Systems (II)
In diesem Artikel werden wir den letzten Schritt zu einem schnellen EA machen. Machen Sie sich also auf eine längere Lektüre gefasst. Um unseren Expert Advisor zuverlässig zu machen, werden wir zunächst alles aus dem Code entfernen, was nicht Teil des Handelssystems ist.