Dokumentation

Anwendungen

Zuletzt aktualisiert am 20. 11. 2021 von clonex / Ivan Hudec

Simulation des gleitenden Durchschnitts bei Aktien

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.

Das Anlegen eines Parameters bedeutet, dass dieser in der Registerkarte Whatif in EquityMATrading in den Quervergleichen angepasst werden kann.

 

@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

Abonnieren
Benachrichtigen Sie mich bei
1 Kommentar
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen
Emmanuel
20. 12. 2021 8:11 Uhr

sehr gut 🙂