Dokumentation

Zuletzt aktualisiert am 5. 5. 2015 von Mark Fric

Neuen statistischen Wert hinzufügen

In diesem Beispiel werden wir Quant Analyzer erweitern und einen neuen statistischen Wert hinzufügen.

Alle statistischen Werte wie Anzahl der Trades, Nettogewinn, Return / DD, Sharpe Ratio, CAGR, etc. werden als Schnipsel - ein Stück Java-Code, das eine bestimmte Funktionalität implementiert, in unserem Fall wird es einen neuen Wert im Programm berechnen.
Das bedeutet, dass das Programm leicht um neue Werte erweitert werden kann.

In diesem Beispiel erstellen wir einen neuen statistischen Wert namens V-Verhältnis.
Sie wird als Verhältnis zwischen der maximalen Inanspruchnahme in Geld und dem durchschnittlichen monatlichen Gewinn errechnet.
Er drückt im Wesentlichen aus, wie viele Monate es im Durchschnitt dauert, um sich von der maximalen Inanspruchnahme zu erholen; je höher der Wert, desto besser.

Wenn zum Beispiel der maximale Drawdown $500 und der durchschnittliche monatliche Gewinn $100 beträgt, wird das V-Verhältnis wie folgt berechnet
100/500 = 0.2

In diesem Beispiel zeigen wir, wie das geht:

  • 1. Arbeit mit QuantEditor, wo wir neue Snippets erstellen können
  • 2. Neuen statistischen Wert erstellen V-Verhältnisdie für jeden Bericht, der in das Programm geladen wird, berechnet wird
  • 3. Fügen Sie diesen Wert zu den verfügbaren Datenbankspalten hinzu, damit er auch in der Datenbank sichtbar ist.
  • 4. Erstellen Sie eine neue benutzerdefinierte Datenbankansicht mit der neuen Spalte
  • 5. Erstellen Sie eine benutzerdefinierte Analyzer â†' Overview-Vorlage, die den neuen Wert anzeigt

 

1. Arbeiten mit QuantEditor

QuantEditor ist ein integrierter Editor für Snippets, mit dem Sie neue Snippets erstellen/verändern und den Quellcode der vorhandenen Snippets einsehen können.

 

Er kann aus dem Programm heraus über das QuantEditor-Symbol in der Symbolleiste gestartet werden.

 

2. Erstellen eines neuen Statistikwertes

Als allerersten Schritt müssen wir ein neues Snippet erstellen, das unseren V-Ratio-Wert berechnen wird.

Starten Sie also Quant Editor, gehen Sie zum Navigator-Panel und suchen Sie /extend/Snippets/StatsValues. Klicken Sie dort mit der rechten Maustaste auf StatsValues und wählen Sie die Aktion Neue Datei.

 

 

Benennen Sie das neue Snippet VRatioValue.

QE (QuantEditor) erstellt ein neues Snippet mit der erforderlichen Struktur des Codes und den Standardmethoden.
Jetzt müssen wir nur noch die Berechnung an der richtigen Stelle hinzufügen und den Wert speichern.


Gehen wir die Methoden des Schnipsels nacheinander durch:

dependsOn()

Diese Methode ermöglicht es uns, Abhängigkeiten zu setzen - wenn der Wert, den wir zu berechnen versuchen, von einigen anderen Statistikwerten abhängt, die zuvor berechnet werden müssen. In unserem Fall müssen die Werte für den maximalen Drawdown und den durchschnittlichen monatlichen Gewinn vorher berechnet werden, also fügen wir sie dieser Methode hinzu:

public String dependsOn() {
	return StatsConst.join(StatsConst.DRAWDOWN, StatsConst.AVG_PROFIT_BY_MONTH);
}

 

initCompute()

diese Methode wird zu Beginn der Statistikberechnung aufgerufen.
Wir können ihn verwenden, um die Anfangswerte einiger Parameter zu setzen, aber das brauchen wir in unserem Fall nicht, also lassen wir ihn leer:

public void initCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {

}

 

computeForOrder()

diese Methode wird für jede Bestellung in der Liste der Bestellungen aufgerufen.
Es kann verwendet werden, wenn wir Statistiken aus Aufträgen berechnen, aber in unserem Fall machen wir einfach das Verhältnis von zwei bereits vorberechneten Werten, also lassen wir es auch leer:

public void computeForOrder(SQStats stats, StatsTypeCombination combination, SQOrder order, SQSettings settings) throws Exception {
}

 

endCompute()

diese Methode wird am Ende der Berechnung aufgerufen, sie setzt die berechneten Werte in das SQStats-Objekt, das im Programm verwendet wird.
Jede Aktion wird hier kommentiert und ist leicht zu verstehen.

public void endCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {
// Holen Sie sich die Werte für den Drawdown und den durchschnittlichen Gewinn pro Monat, die bereits in ihren eigenen Snippets berechnet wurden
double drawdown = stats.getDouble(StatsConst.DRAWDOWN);
double avgProfitByMonth = stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH);

// Berechnung des V-Verhältnisses - wir verwenden die Methode safeDivide(), um zu vermeiden
// Die Division durch Null ergibt einen Fehler, wenn der durchschnittliche Gewinn pro Monat 0 ist.
double vRatio = SQUtils.safeDivide(avgProfitByMonth, drawdown);

// Hinzufügen des neuen Werts zur Statistik.
// Jeder Wert muss seinen eigenen eindeutigen Schlüssel haben, wir haben unseren "VRatio" genannt.
// auch dieser Wert wird auf zwei Dezimalstellen gerundet
stats.set("VRatio", SQUtils.round2( vRatio ));
}

Das war's. Wir haben einen neuen Statistikwert erstellt, der für jeden geladenen Bericht berechnet wird.

Jetzt treffen Kompilieren und das neue Snippet sollte ohne Fehler kompiliert werden.

 

3. Fügen Sie diesen neuen Wert zu den Spalten der Datenbank hinzu

wir haben einen neuen VRatio-Wert erstellt, der für jeden Bericht berechnet wird, aber noch nirgends sichtbar ist.

Wenn Sie in Ihrer Datenbank oder Übersicht nachsehen, werden Sie es dort nicht sehen, weil es noch nicht zu den Datenbankspalten hinzugefügt wurde.

Die Spalten der Datenbank sind ebenfalls Snippets, es gibt ein Snippet für jede Spalte. Dies bedeutet, dass es einfach ist, neue benutzerdefinierte Spalten zur Datenbank hinzuzufügen.

Öffnen Sie also wieder im QE Navigator /extend/Snippets/DatabankColumns. Klicken Sie dort mit der rechten Maustaste und wählen Sie Neue Datei, nennen Sie sie VRatio.

Diese Standard-VRatio-Spalte erstellt Snippet, können wir wieder durch seine Methoden gehen.

VRatio()

Dies ist ein Klassenkonstruktor, hier können Sie den Namen der Spalte, die in der Kopfzeile der Datenbank sichtbar sein wird, sowie den Tooltip und die Breite angeben.

public VRatio() {
   super();

   setName(L.t("VRatio"));

   setTooltip(L.t("VRatio"));

   setWidth(60);

}

 

getValue()

Methode, mit der der Wert für diese Spalte abgerufen wird. In unserem Fall wird der Wert in SQStats gespeichert,
Wir müssen also zuerst das Ergebnis erhalten und von dort aus die Statistik abrufen. Dann können wir den Wert von VRatio aus der Statistik erhalten.

public Object getValue(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // Ergebnis für Portfolio abrufen
    SQResult result = strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO);
    
    // liefert Statistiken für das Portfolio und die korrekte Kombination aus Richtung, Pl-Typ, Sample-Typ
    SQStats stats = result.getStats(direction, getCorrectPlType(plType), sampleType);
    if(stats==null) throw new StatsMissingException();
    
    // gibt den Wert zurück
    return stats.getDouble("VRatio", 0);
 }

 

displayString()

Methode, die eine Zeichenkette in der Zelle der Datenbank anzeigt. Sie erhält den Wert mit unserer Funktion getValue() und zeigt ihn mit der richtigen Formatierung an.

public String displayString(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // ruft den Wert mit der Methode getValue() ab
    Double value = (Double) getValue(strategyResults, dataType, direction, sampleType, plType);
    
    return twoDecimalFormat(value); // Anzeige der Zahl mit zwei Dezimalpunkten
}

 

Das ist das ganze Snippet. Wir können es kompilieren, es sollte wieder ohne Fehler kompiliert werden.
Auf diese Weise haben wir eine neue Spalte zu den verfügbaren Spalten hinzugefügt, die in der Datenbank angezeigt werden können.

 

4. Erstellen Sie eine benutzerdefinierte Datenbankansicht mit der neuen Spalte

Im obigen Teil haben wir eine neue Spalte erstellt. Um sie tatsächlich in der Datenbank zu sehen, müssen wir eine Ansicht erstellen, die diese Spalte enthält.
Datenbanken in Quant Analyzer sind vollständig anpassbar, Sie können Ansichten um zu steuern, welche Spalten angezeigt werden sollen.

Wir müssen eine neue Ansicht erstellen, die unsere neue Spalte VRatio enthalten wird. Klicken Sie auf die Schaltfläche Verwalten neben den Ansichten in der Datenbank. Wir können die Standardansicht nicht bearbeiten, also müssen wir eine neue erstellen. Am einfachsten ist es, die vorhandene Standardansicht zu klonen.

Klicken Sie auf das Klonen klicken, wird eine neue Ansicht mit denselben Spalten wie die Standardansicht erstellt. Nennen wir sie „Standard + VRatio#157;. In den Verfügbaren Spalten finden Sie unsere neue Spalte VRatio.

Wählen Sie in der Liste rechts den Eintrag Reingewinn (um die neue Spalte direkt nach Reingewinn hinzuzufügen) und klicken Sie auf > Taste.

Dadurch wird die Spalte zu den Spalten in dieser Ansicht hinzugefügt. Vergessen Sie nicht, auf Änderungen speichern zu klicken, um unsere neue Ansicht sicher zu speichern. Dann können wir diesen Dialog schließen.

Wenn Sie nun wieder die Ansichten öffnen, sehen Sie die neue Ansicht, die wir gerade definiert haben, und können sie auswählen.

Wenn wir nun einige Strategien laden, sehen wir unsere neue VRatio Spalte korrekt berechnet und angezeigt.

5. Erstellen Sie eine benutzerdefinierte Analyzer â†' Overview-Vorlage, die den neuen Wert anzeigt

Jetzt können wir unseren neuen VRatio-Wert in der Datenbank sehen, aber was, wenn wir ihn auch im Fenster Analyse -> Übersicht sehen wollen?

Auch das ist möglich. Wie viele andere Dinge wird auch die Registerkarte Übersicht durch Snippets gesteuert. Jede Vorlage ist als Snippet implementiert, das seine eigene HTML-Datei wiedergibt.
Jede Übersichtsvorlage besteht also aus einem Snippet und einer HTML-Datei-Vorlage.

Es gibt drei Möglichkeiten, wie der Wert auf der Registerkarte Übersicht angezeigt werden kann:

Bearbeiten eines vorhandenen Übersichts-Snippets (nicht empfohlen)
können wir einen der Standard-Übersichtsschnipsel des Systems ändern und den VRatio-Wert anstelle eines anderen Wertes anzeigen lassen, den wir nicht benötigen.
Dies ist nicht empfehlenswert, da die Standard-System-Snippets bei einer Aktualisierung geändert werden können und Ihre Änderungen verloren gehen würden.


Erstellen eines neuen Übersichts-Snippets, das eine vorhandene Vorlage verwendet
Die zweite Möglichkeit besteht darin, ein neues Übersichts-Snippet zu erstellen, aber die vorhandene HTML-Vorlagendatei zu verwenden. Dies hat den Vorteil, dass unser neues Snippet nicht durch ein zukünftiges Update verändert wird.
Der Nachteil ist, dass wir keine neuen Werte hinzufügen können, da wir die bestehende HTML-Vorlagendatei verwenden werden. Wir können nur VRatio anzeigen anstelle von einen anderen Wert.


Neues Übersichts-Snippet mit neuer Vorlage erstellen
Bei dieser Option erstellen wir ein neues Snippet und eine neue HTML-Rendering-Vorlage. Hier können wir alles tun, was wir wollen, wir können sogar HTML verwenden, das unser eigenes benutzerdefiniertes Design zeigt.

In unserem Beispiel entscheiden wir uns für die zweite Option - die Erstellung eines neuen Snippets, das eine vorhandene HTML-Vorlage verwendet.

In QuantEditor gehen wir also wieder zu /extend/Snippets/OverviewTab und erstellen Sie ein neues Snippet namens StandardPlusVRatio.
Dadurch wird ein neues Snippet erstellt, das eine neue Vorlage für die Registerkarte Übersicht implementiert.

Wir werden seine Methoden noch einmal erläutern, aber zunächst müssen wir eine Änderung vornehmen. Da wir im Grunde nur eine Kopie der SQDefault-Vorlage erstellen wollen, wobei nur ein Wert ersetzt wird, müssen wir die übergeordnete Klasse unseres neuen Snippets von OverviewTemplate in SQDefault ändern.

Das bedeutet, dass unser neues Snippet alle Methoden von SQDefault verwendet und wir nur das implementieren müssen, was anders ist.

Wenn wir dies nicht täten, müssten wir den Code schreiben, um alle Werte zu ersetzen, so wie es im SQDefault-Snippet gemacht wird.

Wir bearbeiten also die Zeile

public class DefaultPlusVRatio extends OverviewTemplate {

zu

public class DefaultPlusVRatio extends SQDefault {

 

Nun können wir uns den Rest der Methoden ansehen.

 

StandardPlusVRatio()

Dies ist ein Klassenkonstruktor, der aufgerufen wird, wenn das Snippet erstellt wird. Hier sollten wir den Vorlagennamen, das Bild für den Screenshot und die HTML-Vorlagendatei definieren

public DefaultPlusVRatio() {
setName("DefaultPlusVRatio");

// Wir kopieren die folgenden Werte aus dem SQDefault-Snippet, unser neues Snippet wird die gleiche HTML-Vorlage verwenden
// Diese Dateien befinden sich in /settings/plugins/OverviewTab
setScreenshotName("sqdefault_screenshot.jpg");
setHtmlTemplateName("sqdefault_template.htm");

 

drawValues()

ist die Hauptfunktion. Sie lädt die HTML-Vorlagendatei, ersetzt die dortigen Konstanten durch die richtigen Bezeichnungen und Werte und gibt sie an das Programm zurück.
In unserem Fall brauchen wir sie überhaupt nicht zu ändern.

public String drawValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) throws Exception {
template = loadTemplate();
replaceValues(strategyResult, symbol, combination);

Vorlage zurückgeben;
}

 

replaceValues()

diese Funktion wird von drawValues() aufgerufen und ersetzt die Konstanten in der HTML-Schablone durch vom Programm berechnete Werte - sie werden in result -> stats gespeichert

public void replaceValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) {
   SQStats stats = null;
   SQResult result = null;

// dieser erste Pars holt die entsprechenden Statistikwerte aus dem Ergebnis
// Hierfür können wir den Standardcode verwenden
if(strategyResult!=null) {
      Ergebnis = strategyResult.getResult(Symbol);

      if(result!=null) {
         stats = result.getStats(combination);
      }
   }

// hier ersetzen wir die Konstante 3_2 durch unseren V Ratio-Wert
// Wenn Sie das SQDefault-Snippet überprüfen, werden Sie sehen, dass es 3_2 durch R Expectancy ersetzt.
// In unserer Vorlage wird also das V-Verhältnis anstelle der Erwartung angezeigt.

   replace("3_2", "V Ratio", stats==null ? NA : d2(stats.getDouble("VRatio")));

// am Ende müssen wir die Methode replaceValues() der übergeordneten Klasse (SQDefault) aufrufen
// um alle verbleibenden Werte zu ersetzen
   super.replaceValues(strategyResult, symbol, combination);
}

 

Das ist alles. Kompilieren Sie nun dieses Snippet und Sie werden die neue Vorlage in Analyse -> Übersicht sehen.

Wenn Sie zu dieser Vorlage wechseln, werden Sie sehen, dass sie nun das V-Verhältnis anzeigt, wo die Standardvorlage SQDefault die R-Erwartung anzeigt.

 

Dies war ein Beispiel dafür, wie man eine neue Übersichtsvorlage erstellt, die unseren benutzerdefinierten Wert anzeigt.

Wenn Sie mehr als einen benutzerdefinierten Wert haben, kann es sich lohnen, eine Kopie der HTML-Vorlage zu erstellen und sie so zu ändern, dass sie eine weitere Zeile mit Werten enthält.

Denken Sie daran, dass Sie Ihre eigene Datei im Snippet-Konstruktor in setHtmlTemplateName() festlegen können
Die in den Übersichtsschnipseln verwendeten HTML-Vorlagendateien befinden sich in /settings/plugins/OverviewTab/

 

Das ist alles in diesem Lernprogramm.
Wir haben gezeigt, wie einfach es ist, QuantAnalyzer um neue benutzerdefinierte Werte zu erweitern und diese in der Datenbank und der Übersicht anzuzeigen.

 

War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich

Abonnieren
Benachrichtigen Sie mich bei
0 Kommentare
Inline-Rückmeldungen
Alle Kommentare anzeigen