Dynamische Kursdaten-URLs

Guckst Du nur in dem Fenster wo Du den Link editierst?


Da werden zwar nur die Daten bis 03.08.2020 aufgeführt, aber das ist ja nur eine Vorschau. Einfach mal OK, abwarten und später in die historischen Kurse gucken. Habs grad ausprobiert: 06.09.1999

1 Like

Hallo Forum,
je länger man PP benützt und die Foren liest umso mehr merkt man wie gut PP ist.
Bis jetzt hatte ich die Historische Kurse, StartRange als 01.01.2018 und die Aktuellen Kurse als (wie Historische Kurse) konfiguriert.
Falls ich aller richtig verstanden habe werden die Historischen Kurse abgerufen wenn PP gestartet wird und die Aktuellen Kurse aller 10 Minuten.
Um grosse Downloads zu vermeiden habe ich historische und aktuelle Kurse wie Folgens konfiguriert:

  • Einmal alle historische werte einlesen.

  • Historische Kurse: Kurse für die letzten 2 Monate {TODAY:dd.MM.yyyy:-P2M}
    Kann sein dass man mal lange in den ferien war. :slightly_smiling_face:

  • Aktueller Kurs: Kurse für die letzten 2 Tage {TODAY:dd.MM.yyyy:-P1D}

Das sollte die Downloads ziemlich klein halten.

3 Likes

Kleine Korrektur.
Für Aktuelle Kurse nehme ich die letzte Woche {TODAY:dd.MM.yyyy:-P1W} da über Wochenende meistens keine kurse sind und manchmal Börsen durch Feiertage geschlossen sind.

Mein Arriva geht nicht mehr, ich bekomme
ᐅ OptoFlex P Historische Kurse | Historische Werte | ARIVA.DE → 403
Error 403
Im Browser geht es.
Danke für Tips.

403 ist Zugriff verboten. Da hast du dir wohl eine Sperre eingehandelt wegen zu vieler Zugriffe in zu kurzer Zeit.

Warte mal ein paar Tage ab, schau vielleicht auch, ob du wirklich alle abgerufenen Kurse benötigst und deaktiviere sonst den Abruf, und dann versuch es wieder.

Hallo allerseits!

Hab mich jetzt intensiv mit dem Thema der dynamischen Kursdaten-URLs auseinandergesetzt, da ich diese für einige Wertpapiere gut gebrauchen könnte, komme aber leider nicht weiter:

{TODAY:dd.MM.yyyy:-P3M} generiert die Url dynamisch so wie vorgegeben.
Mein Problem ist jetzt allerdings, dass meine Url das Datum als Unixzeit benötigt. Habe die im Handbuch unter dem Thema angegebene Seite (DateTimeFormatter (Java Platform SE 8 )) ausführlich studiert, aber keine Formatierung gefunden die anstelle von dd.MM.yyyy die Unixzeit liefert.

Ich bräuchte also sowas wie {TODAY:unixtimestamp:-P3M}. Gibt es das oder geht das sonst irgendwie anders?!

Ok, da niemand eine Antwort weiß, gibt es diese Möglichkeitn anscheinend noch nicht.
Also habe ich mir jetzt mal den Quelltext angeschaut und versucht eine zu basteln. Kenn mich zwar mit Java nicht so wirklich aus, aber so wie es aussieht, ist eine Lösung meines Problems nicht allzu kompliziert???!

Im github Pfad portfolio/name.abuchen.portfolio/src/name/abuchen/portfolio/online/impl/variableurl/macros/ habe ich die Datei Today.java wie folgt modifiziert:

package name.abuchen.portfolio.online.impl.variableurl.macros;

import java.time.LocalDate;
import java.time.LocalTime;          // added
import java.time.ZoneOffset;          // added
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAmount;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.online.impl.variableurl.VariableURLConstructor;

public class Today implements Macro
{
    private static final Pattern MACRO = Pattern.compile("TODAY(:([^:]*)(:([PYMWDpymwd0123456789-]*))?)?"); //$NON-NLS-1$

    private final DateTimeFormatter formatter;
    private final TemporalAmount delta;
    private final boolean ut;          // added

    public Today(CharSequence input)
    {
        Matcher matcher = MACRO.matcher(input);

        if (!matcher.matches())
            throw new IllegalArgumentException();

        String p = matcher.group(2);
        if (p == null || p.isEmpty())
            formatter = DateTimeFormatter.ISO_DATE;
        else
            formatter = DateTimeFormatter.ofPattern(p);

        ut = (p.equals("unixtime")) ? true : false;          // added

        String d = matcher.group(4);
        if (d == null || d.isEmpty())
            delta = Period.ZERO;
        else
            delta = Period.parse(d);
    }

    @Override
    public VariableURLConstructor getVariableURLConstructor()
    {
        return null;
    }

    @Override
    public CharSequence resolve(Security security)
    {
        LocalDate ld = LocalDate.now().plus(delta);          // added
        if (ut == true)          // added
            return String.valueOf( ld.toEpochSecond(LocalTime.parse("00:00:00"), ZoneOffset.of("Z")));          // added
        else          // added
            return formatter.format(ld);          // modified
    }
}

Steckt irgendwer tief genug im Quelltext drin um meinen Lösungsvorschlag beurteilen zu können?

Schaut mE doch gut aus, nur musst du im Fall des unix Parameters die Verschiebung im matcher berücksichtigen. Habe es in Eclipse nicht geprüft, sollte in etwa so aussehen:

ut = (p.equals("unixtime")) ? true : false;          // added

String d = matcher.group(ut ? 5 : 4);

Bei folgenden würde ich abfangen, dass wenn unix timestamp, hier nicht weiter gemacht wird. Nicht das es Fehler vom Compiler gibt.

String p = matcher.group(2);
        if (p == null || p.isEmpty())
            formatter = DateTimeFormatter.ISO_DATE;
        else
            formatter = DateTimeFormatter.ofPattern(p);

Danke für dein Feedback, @Rafa

Dein zweiter Kommentar ergibt für mich Sinn und ich würde das ganze am einfachsten so lösen:

String p = matcher.group(2);
ut = (p.equals("unixtime")) ? true : false;          // added

if (p == null || p.isEmpty() || ut)          // modified
    formatter = DateTimeFormatter.ISO_DATE;
else
    formatter = DateTimeFormatter.ofPattern(p);

Beim der ersten Kommentar muss ich aber passen und verstehe nicht, warum ich matcher eine Verschiebung durchführen muss.
Ich dachte die group Methode bezieht sich auf die Gruppierung in der Regular Expression "TODAY(:([^:]*)(:([PYMWDpymwd0123456789-]*))?)?", wobei die einzelnen Gruppen druch die Klammerung gekennzeichnet sind. Nach meinem Verständnis müsste matcher.group(4) demnach unabhängig vom Wert von ut den zur Expression [PYMWDpymwd0123456789-]* gehörenden String liefern.

Du hast recht, da habe ich gepennt. Du ersetzt ja die Möglichkeit zur Formatierung durch eine Codewort. Ok, war Bullshit von mir. Sorry.

Alles gut, einen nützlichen Hinweis von zwei insgesamt ist ne gute Quote für ein Post kurz vorm Schlafgehen :grinning:

Also Today.java sieht jetzt insgesamt so aus:

package name.abuchen.portfolio.online.impl.variableurl.macros;

import java.time.LocalDate;
// ADDED LocalTime and ZoneOffset
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAmount;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.online.impl.variableurl.VariableURLConstructor;

public class Today implements Macro
{
    private static final Pattern MACRO = Pattern.compile("TODAY(:([^:]*)(:([PYMWDpymwd0123456789-]*))?)?"); //$NON-NLS-1$

    private final DateTimeFormatter formatter;
    private final TemporalAmount delta;
    // ADDED the variable ut
    private final boolean ut;

    public Today(CharSequence input)
    {
        Matcher matcher = MACRO.matcher(input);

        if (!matcher.matches())
            throw new IllegalArgumentException();

        String p = matcher.group(2);
        // ADDED the definition of ut and changed the if condition
        ut = (p.equals("unixtime")) ? true : false;
        if (p == null || p.isEmpty() || ut)
            formatter = DateTimeFormatter.ISO_DATE;
        else
            formatter = DateTimeFormatter.ofPattern(p);

        String d = matcher.group(4);
        if (d == null || d.isEmpty())
            delta = Period.ZERO;
        else
            delta = Period.parse(d);
    }

    @Override
    public VariableURLConstructor getVariableURLConstructor()
    {
        return null;
    }

    @Override
    // MODIFIED the resolve method
    public CharSequence resolve(Security security)
    {
        LocalDate ld = LocalDate.now().plus(delta);
        if (ut == true)
            return String.valueOf( ld.toEpochSecond(LocalTime.parse("00:00:00"), ZoneOffset.of("Z")));
        else
            return formatter.format(ld);
    }
}

Hast du eine Ahnung wie ich das nun offiziell als Feature Vorschlag einreichen kann ohne einen github Account erstellen und mich da erst reinfuchsen zu müssen? Kenn mich auf github nämlich eher nur passiv aus.

1 Like

Mit Version 0.56.3 unterstützt das Today Makro jetzt “unixtime”, z.B. {TODAY:unixtime:-P3M} Vielen Dank @kingbtcvl für die Contribution :clap:

Hallo zusammen,
bei OnVista wird ja neben dem Instrument noch eine Notation ID verwendet, die bspw. den Handelsplatz kodiert. Ich habe dafür eine neue Eigenschaft bei den Wertpapieren angelegt und würde deren Wert gerne im dynamischen URL für historische Kurse verwenden. Ist da eine Referenz über {SPALTENNAME} grundsätzlich möglich? Ich frage so dumm, weil das bei mir zu keinerlei Ergebnissen führt. :wink:
Vielen Dank vorab!
Beste Grüße
Johannes

Es gehen nur definierte Felder, siehe Kursdaten laden - Portfolio Performance Handbuch

Vielen Dank für die schnelle Antwort, @Rafa, und schade. :wink:

Beste Grüße
Johannes

Hallo! Wie oft muss man PP öffnen, wenn man stets aktuelle Kurse haben will? Ich öffne PP vielleicht 4x im Jahr und habe nun ein ziemliches Mass.
Ich wollte mit dem Url von Ariva einige hirstorische Kurse rein holen, aber es wird mir im PP mit Chart nicht angezeigt.

oder muss ich dann morgen nochmal gucken? Wenn ich dieses Kürzel verwende, gehen die Kurse nur ein Monat zurück:
{DATE:yyyy-MM-32}

zb ᐅ MercadoLibre Historische Kurse | Historische Werte | ARIVA.DE

Mit deinem unten erwähnten Kürzel hast du dir die Antwort bereits selbst gegeben. Einmal im Monat.

wieso wird der Kurs bei solchen Daten (obwohl Dezimal auf 4 runden eingestellt ist, auf volle Euro gerundet)? ich hab nun hier 5 und 6 Euro stehen :wink:

Date,Open
2022-03-30,5,48
2022-03-31,5,86

Kursdaten werden mWn nur geparst und nicht manipuliert. Die Anzeige für Dezimalstellen müsste sich auf Bruchstücke bei Wertpapieren beziehen.

Viele Grüße

1 Like

Falls das aus einer csv ist: Der Separator wäre dann ein Komma, Du hast also ein Datum, ein Wert, und noch einen Wert.

1 Like