Dokumentation
Anwendungen
Zuletzt aktualisiert am 20. 11. 2021 von clonex / Ivan Hudec
Simulation des gleitenden Durchschnitts bei Aktien
Inhalt der Seite
In diesem Lernprogramm zeigen wir Ihnen, wie Sie in What If Crosscheck eine Aktienkurvensteuerung erstellen und simulieren können.
What-If-Szenarien in StrategyQuantx ist das Werkzeug, mit dem Sie verschiedene Hypothesen für den Handel Ihrer Strategie testen können.
Die Funktion Equity Control Simulation ermöglicht es, das Ein- und Ausschalten einer Strategie auf der Grundlage der Equity-Kurve zu simulieren. Die Annahme basiert auf der Hypothese, dass es besser ist, eine Strategie zu handeln, wenn ihre Leistung über ihrem Durchschnitt liegt. Einen guten Artikel zu diesem Thema können Sie hier lesen hier.
Das fertige Snippet können Sie herunterladen hier.
Schritt 1 - Neues Was-wäre-wenn-Snippet erstellen
Öffnen Sie den CodeEditor, klicken Sie auf "Create new" und wählen Sie die Option "List of trades column" - Benennen Sie sie EquityMATrading.
Dadurch wird ein neues Snippet erstellt EquityMATrading.java im Ordner Benutzer/Snippets/SQ/Whatif
Schritt 2 - Definieren der Snippet-Parameter
Da wir den Durchschnitt der Aktien berechnen wollen, müssen wir einen Parameter hinzufügen - MAPeriod die es uns ermöglicht, eine Periode des gleitenden Durchschnitts anzugeben.
@ClassConfig(name="() Equity MA Trading", display="Equity MA(#MAPeriod#) Trading ") @Help("Hilfetext") public class EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class); @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod;
Schritt 3 - Implementierung der Methode filter(OrdersList orders)
Der Filter(OrdersList orders) wird verwendet, um die ursprüngliche Liste der Aufträge in der Strategie zu filtern. OrdersList ist eine Klasse, die die Liste der Abschlüsse einer Strategie speichert und Methoden zur Bearbeitung der Liste der Abschlüsse bereitstellt. Sie können eine Schleife über die gesamte OrdersList und erhalten Daten für sehr Bestellung Methode anwenden erhalten.(int index).
Hier müssen Sie darauf achten, wie Sie die Liste der Aufträge in einer Schleife durchlaufen. In unserem Beispiel verwenden wir die klassische for-Schleife, so dass wir die Auftragsliste während der Schleife nicht manipulieren können.
Stattdessen erstellen wir eine temporäre OrdersList ol, in der wir die Geschäfte speichern, die unsere Bedingungen erfüllt haben. Wir kopieren diese Auftragsliste am Ende des Snippets in die Hauptauftragsliste
Schritt 4 - Verwendung des Whatif-Snippets EquityMATrading
Um ein Snippet in Crosschecks hinzuzufügen, können Sie dieses Snippet verwenden, um zu simulieren, was passieren würde, wenn Sie Ihre Strategie handeln würden, wenn ihre Aktienkurve über ihrem gleitenden Durchschnitt liegt.
Vollständig kommentierter Code des Snippets
Paket SQ.WhatIf; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.strategyquant.lib.SQTime; import com.strategyquant.tradinglib.ClassConfig; import com.strategyquant.tradinglib.Help; import com.strategyquant.tradinglib; import com.strategyquant.tradinglib.Order; import com.strategyquant.tradinglib.Order; import com.strategyquant.tradinglib.OrdersList; import com.strategyquant.tradinglib.OrdersList; import com.strategyquant.tradinglib.Parameter; import com.strategyquant.tradinglib.Parameter; import com.strategyquant.tradinglib.WhatIf; import com.strategyquant.tradinglib.results.stats.comparator.OrderComparatorByOpenTime; import it.unimi.dsi.fastutil.objects.ObjectListIterator; @ClassConfig(name="() Equity MA Trading", display="Equity MA Trading (#MAPeriod#)") @Help("Hilfetext") public class EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class); @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod; @Override public void filter(OrdersList orders) throws Exception { // Neue Instanz von OrdersList, in der wir Trades speichern, die oberhalb des gleitenden Durchschnitts liegen OrdersList newOL = new OrdersList("AboveMovingAverage"); // Wir gehen in einer Schleife durch die gesamte OrdersList, um den gleitenden Durchschnitt zu berechnen for(int i = MAPeriod;i < orders.size();i++){ // Aktuelle letzte Order, bei der wir entscheiden, ob wir zu newOL gehen oder nicht Order order = orders.get(i); // Saldo des Auftrags ermitteln double balance = order.AccountBalance; // Ausgeglichene Aufträge filtern if(order.isBalanceOrder()) continue; double sum = 0; // Gleitender Durchschnitt des Eigenkapitals berechnen for(int k =1;k der Durchschnitt des Eigenkapitals ist if(lastOrder.AccountBalance>avg) { // wir fügen order.get(i) zu newOL hinzu newOL.add(order); } avg =0; // Durchschnittsvariable zurücksetzen sum =0; // Summenvariable zurücksetzen } // Sortieren von newOL nach der Öffnungszeit der Positionen newOL.sort(new OrderComparatorByOpenTime()); //// Sortierung der Aufträge nach Öffnungszeitpunkt // wir ersetzen die OrdersList orders durch die OrdersList newOL und erhalten nur Trades über dem gleitenden Durchschnitt orders.replaceWithList(newOL); } }
War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich
sehr gut 🙂