OpenWrt jest alternatywnym oprogramowaniem dla routerów. Dzięki OpenWrt nasz router przekształca się mały komputer działający pod kontrolą Linuksa. Możliwości takiego routera są ograniczone zatem jedynie wielkością pamięci i szybkością procesora. Instalację OpenWrt z bardzo wygodnym i całkowicie spolszczonym interfejsem webowym Gargoyle opisałem w artykule Gargoyle – instalacja, aktualizacja, usuwanie.
W tym wpisie pokaże, jak dzięki routerowi z OpenWrt / Gargoyle możemy automatycznie, codziennie ściągać notowania end of day papierów wartościowych z serwisu bossa.pl. Notowania te są w tekstowym formacie PRN, który bezproblemowo można importować do najpopularniejszych programów służących do przeprowadzania analizy technicznej, takich jak Metastock, AmiBroker czy Omega. Oczywiście nic nie stoi na przeszkodzie, aby poniższy skrypt po drobnych modyfikacjach uruchamiać w jakiejkolwiek dystrybucji Linuksowej czy nawet Windowsie z zainstalowanym Cygwinem czy GNU On Windows.
Konfiguracja nośnika USB w OpenWrt / Gargoyle
Wymaganiem wstępnym, oprócz samego routera z OpenWrt jest podpięcie jakiegoś nośnika USB (pen-drive, karta pamięci, dysk USB) do routera i skonfigurowanie dostępu do niego przez sieć. Jeśli jeszcze tego nie zrobiłeś zaloguj się do swojego OpenWrt / Gargoyle i przejdź na System -> Nośniki USB. Tutaj w razie potrzeby, zmieniamy nazwę grupy roboczej z domyślnej na naszą, ale myślę, że w większości przypadków pozostanie tu domyślna nazwa grupy WORKGROUP
. Dalej możemy dodać użytkownika (-ów). Pozwoli to na zróżnicowanie praw dostępu do współdzielonych zasobów. Przykładowo, możemy zrobić tak, że udostępniony zasób jest dostępny do odczytu dla wszystkich w sieci, ale tylko niektórzy użytkownicy mają prawo zapisu (modyfikacji, usuwania).
Teraz przechodźmy do właściwego dodawania współdzielonego dysku / folderu. Najważniejsze opcje jakie musimy podać, to: dysk (nawet jeśli nasz router ma tylko jedno złącze USB, można zastosować huba z własnym zasilaniem i do niego podpiąć kilka urządzań), nazwę udziału, typ udziału oraz prawa dostępu, przykładowo:
Tak skonfigurowany dysk jest widoczny zarówno w tzw. otoczeniu sieciowym Windows jak i przez klienta FTP.
Skrypty ściągające notowania z bossa.pl
Teraz proponuję na udostępnionym dysku założyć 2 katalogi: bin
, w którym umieścimy nasz skrypt oraz Notowania
, gdzie będą ściągane notowania z serwisu bossa.pl.
Poniżej przedstawiam 2 skrypty, pierwszym z nich ściągniemy całą bazę notowań:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/ash DAYS=100 MST='https://info.bossa.pl/pub/ofe/mstock/mstofe.zip https://info.bossa.pl/pub/ciagle/mstock/mstcgl.zip https://info.bossa.pl/pub/waluty/mstock/mstnbp.zip https://info.bossa.pl/pub/fundinwest/mstock/mstfun.zip' NOTTRADED='AVIVA.mst PGNIG.mst PROJPRZEM.mst URSUS.mst' if [ ! -d /mnt/sda3/notowania ] ; then mkdir -p /mnt/sda3/notowania fi cd /mnt/sda3/notowania : > baza.prn for url in $MST ; do wget $url unzip -n ${url##*/} done for file in $NOTTRADED ; do echo -e "\e[35m$file\e[39m removing explicitly provided security" rm "$file" done for file in *.mst ; do LastDate=`tail -n 1 "$file" | cut -f 2 -d ','` LastDate=$LastDate'0000' LastDate=`date -d $LastDate "+%s"` Diff=$(((`date "+%s"`-$LastDate)/(60*60*24))) if [ $Diff -gt $DAYS ] ; then echo -e "\e[35m$file\e[39m $LastDate removing security nottreded for $Diff days" rm "$file" else echo -e "\e[32m$file\e[39m $LastDate leaving untouched security nottreded for $Diff days" fi done cat *.mst >> baza.prn rm .mst rm *.mst rm *zip sed -i '/<TICKER>,<DTYYYYMMDD>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>/d' baza.prn cat *.prn | cut -f 1 -d ',' | sort | uniq > spis.txt |
Efektem działania powyższego skryptu jest utworzenie 2 plików baza.prn
zawierającego całą bazę notowań oraz spis.txt
zawierającego spis wszystkich walorów w bazie.
A drugi ze skryptów służyć będzie do aktualizacji bazy o bieżące notowania:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/ash MST='https://info.bossa.pl/pub/ciagle/mstock/sesjacgl/few_last.zip https://info.bossa.pl/pub/waluty/mstock/sesjanbp/few_last.zip https://info.bossa.pl/pub/fundinwest/mstock/sesjafun/few_last.zip https://info.bossa.pl/pub/ofe/mstock/sesjaofe/few_last.zip' if [ ! -d /mnt/sda3/notowania ] ; then mkdir -p /mnt/sda3/notowania fi cd /mnt/sda3/notowania rm *.prn for url in $MST ; do wget $url unzip few_last.zip cat 20*.prn >> notowania.prn rm 20*.prn rm sesja*.prn rm few_last.zip done |
Ten skrypt natomiast utworzy plik notowania.prn
zawierający notowania z kilku ostatnich dni.
W zależności od potrzeby skrypty można, a nawet należy zmodyfikować, tak więc kilka słów komentarza.
Komenda cd /tmp/usb_mount/dev_sda3/notowania
zmienia aktualny katalog na ten gdzie mają być umieszczane notowania. Komendy wget
ściągają interesujące nas pliki z notowaniami – w serwisie bossa.pl dostępne są następujące pliki notowań:
Lp. | Plik notowań | Plik bazy | Opis |
---|---|---|---|
1 | sesjacgl.prn |
mstcgl.zip |
Notowania ciągłe – akcje, akcje NFI i indeksy GPW |
2 | sesjafut.prn |
mstfut.zip |
Rynek kontraktów terminowych i opcji GPW |
3 | sesjancn.prn |
mstncn.zip |
Rynek NewConnect |
4 | sesjaf2.prn |
mstf2.zip |
F2 – System jednolitego kursu dnia – papiery dwukrotnie notowane GPW |
5 | sesjaobl.prn |
mstobl.zip |
Notowania ciągłe – obligacje GPW i Catalyst |
6 | sesjazgr.prn |
mstzgr.zip |
Indeksy giełd zagranicznych |
7 | sesjanbp.prn |
mstnbp.zip |
Waluty w NBP |
8 | sesjafun.prn |
mstfun.zip |
Wartości netto jednostek funduszy inwestycyjnych |
9 | sesjaofe.prn |
mstofe.zip |
Wartości jednostek funduszy emerytalnych |
10 | sesjafx.prn |
mstfx.zip |
Forex |
Jeszcze jedna komenda wymaga komentarza, otóż papier o nazwie PEKAO występuje zarówno w plikach sesjacgl.prn
jak i sesjaofe.prn
, a zatem aby odróżnić akcje od jednostek funduszu emerytalnego konieczna była komenda sed -i 's/PEKAO/OFEPEKAO/g' 20*.prn
.
Zapisujemy nasz zmodyfikowany skrypt nadajemy mu prawa wykonywania i testujemy go. Logujemy się do routera przez SSH i wydajemy komendy:
1 2 |
chmod +x /tmp/usb_mount/dev_sda3/bin/notowania /tmp/usb_mount/dev_sda3/bin/notowania |
lub podobne w zależności od ścieżki dostępu. Połączone notowania powinny znaleźć się w pliku notowania.prn
. Jeśli nie ma błędów przechodzimy do ostatniej części.
cron – automatyczne, codzienne aktualizacje notowań
Teraz nie pozostaje nam nic innego jak użycie cron-a do automatycznych, codziennych aktualizacji notowań. Zatem odpalamy komendę:
1 |
crontab -e |
i dopisujemy na końcu linijkę:
1 |
5 21 * * 1-5 /tmp/usb_mount/dev_sda3/bin/notowania |
dzięki której skrypt /tmp/usb_mount/dev_sda3/bin/notowania
będzie uruchamiany codziennie od poniedziałku do piątku o godzinie 21:05.