Dynamische Kursdaten-URLs

@AndreasB Machts Sinn, dass wir von uns aus die ganze Geschichte RateLimiten? Oder soll der User abwarten, bis er ne neue IP bekommt?

@Al2Klimov,
Könntest du bitte die beiden Sätze nochmals in gutem Deutsch formulieren, ich verstehe nicht was du mit dieser Antwort meinst.
Ich bin auch für eine kritische Anwort offen, aber bitte verständlich formuliert und sachlich begründet.

Der Punkt ist doch, dass Ariva und Onvista für die Bereitstellung der Kursdaten bezahlen und dies für den normalen Gebrauch kostenlos zur Verfügung stellen. Bei regelmäßigen Abfragen von Dutzenden oder gar Hunderter Wertpapiere innerhalb kurzer Zeit fällt dies unter die jeweiligen TOS bzgl automatisierter Abfrage und führt zur Gegenreaktion.

Was @Al2Klimov meint, ist die Begrenzung bzw. der zeitlichen Entzerrung der Kursabrufe. Die Frage ist nur auf welches Limit man sich einigt und wie das durch den Anwender toleriert wird. Andererseits sei mal in den Raum gestellt (wenn schon „professionell“ gearbeitet wird), ob die Kursversorgung gegen Bezahlung nicht sinniger wäre :thinking:

Hier bin ich nicht 100%ig sicher, aber die „historischen Kurse“ und „aktuellen Kurse“ sind an und für sich gleichwertig. Der Unterschied liegt im Zeitpunkt der Aktualität. Die historischen werden mE i.d.R. bei Programmstart und dann alle 12 Stunden aktualisiert, die aktuellen Kurse hingegen alle 10 Minuten. Und, der aktuelle Kurs ist nur der letzte Kurs, vorherige Tage werden ignoriert.

Was bedeutet dies für dich? Historische Kursversorgung bleibt aktiv und der aktuelle Kurs kann wie der historische Kurs verwendet werden. Denn wenn nur der aktuelle Kurs verwendet wird, muss täglich PP gestartet werden und selbst dann ist nicht sichergestellt das du den Schlusskurs erhältst (Stichwort Uhrzeit).

Vielen Dank, @Ragas, für die guten Überlegungen. Hinsichtlich der Limitierung der Anzahl von Kursdaten sehe ich das auch so, ich habe Ariva gebeten, mir ihr Limit für die Downloads anzugeben. Ich hoffe auf eine Antwort. Mit einer Kursversorgung gegen Bezahlung habe ich bereits jahrelang gute Erfahrungen gemacht (Tai-Pan EoD). Die Kurse sind nach Paketen wählbar, fehlerfrei und stehen regelmäßig zur Verfügung. Interessant wäre es von Usern, die hierzu Erfahrungen haben, mehr zu erfahren (Vollständigkeit, Verfügbarkeit, Paketwahl-Möglichkeit, Preisgefüge).

Was die Einstellungen für den kostenlosen Datendownload bei PP anbelangt, werde ich anhand von Testeinstellungen weitere Erfahrungen sammeln. Für mich als Amateur, der nicht tradet, langt ein Download einmal am Tag eigentlich aus. Für Anlageentscheidungen reicht der langfristige Trend auf jeden Fall aus, auch eine Abweichung von 2-3%-Punkte gegenüber den Kursen von z.B. Banken bei den Performance-Ergebnissen sind m.E. akzeptabel. Die täglichen Kurse an den verschiedenen Börsenplätzen sind eh immer unterschiedlich. Nur sollten nicht soviele fehlende Aktualisierungstage auftreten, wie bei Yahoo in der letzten Zeit bei den ETFs.

@mmu23:
Noch ein Gedanke zu dem Unterschied: Wenn du mal im Urlaub bist bzw. nicht täglich die „aktuellen“ Kurse abfragst, schließt dir die „historische“ Abfrage automatisch alle entstandenen Abfrage-Lücken.
Andererseits macht es daher auch keinen Sinn, ständig die „historischen“ Kurse für einen längeren Zeitraum abzufragen, die man ohnehin schon importiert hat.

VG
B.L.

@blamm09,
sehr guter Gedanke, danke dafür.

Hallo,

die ganzen Funktion mit den Makros sind sehr praktisch. Aber bei mir funktioniert diese Funktion nur Teilweise. Ich habe den Link jetzt schon mit mehreren Aktien ausprobiert (z.B.https://www.ariva.de/microsoft-aktie/historische_kurse?go=1&boerse_id=6&month={DATE:yyyy-MM-32}&currency=EUR&clean_split=1&clean_bezug=1). Leider werden die Daten nur von heute bis zum 3.8.2020 aufgerufen, aber nicht weiter. Kann mir jemand weiter helfen?

Viele Grüße
David

1 Like

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: