bitreport-org / Bitreport

Automated technical analysis reports for cryptocurrencies 🚀
MIT License
8 stars 1 forks source link

Charting refactor #111

Open turbaszek opened 5 years ago

turbaszek commented 5 years ago

Charting

Zamiast jednego ogólnego wedge wyróżnimy: 1) trójkąt górno-prostokątny up_right_triangle 2) trójkąt dolno-prostokątny down_right_triangle 3) flaga flag 4) wedge wedge

co więcej powyższa kolejność w pewnym stopniu definiuje już priorytet rysownia.

Szukanie patternu powinno mieć następujący proces:

Tym samym całe analizowanie ceny i jej opis będzie po stronie Core.

Wskaźniki

Ostatni punkt można rozszerzyć również na wskaźniki. Głównie chodziło by o ujednolicenie tokenów do postaci:

info = {
    sentiment: bear / bull / none, 
    signal: +10% / 0.34, # potencjalny ruch, może być tuplą wskazując up/down
    events: [CROSS, SPIKE, ...] # tokeny do tworzenie dodatkowej informacji
}
turbaszek commented 5 years ago

Proponuję też na początek zostać przy 3 wskaźnikach:

glowacki-dev commented 5 years ago

Oprócz RSI dałbym jeszcze coś drugiego co można na dolnym wykresie rysować (np MACD), żeby nie było nudno

turbaszek commented 5 years ago

Gdy stary wedge robi się nieaktualny to szukany jest nowy który może nie mieć sensu tak jak tu: preview preview-2

glowacki-dev commented 5 years ago

Wystarczy chyba pilnować, żeby nowy nie szukał się "wcześniej" niż stary - jeżeli już coś było to w sumie nas nie boli jak przez jakiś czas nic nowego się nie pojawi. Można też dodać jakiś warunek, żeby nie szukać trójkątów w przeszłości - bo taki co na tym drugim obrazku jest to można było rysować na początku marca, a nie teraz 😄

turbaszek commented 5 years ago

Zrobiłem wstępną wersją trójkątów z jedną krawędzią poziomą. Dla przykładu sposób szukania AscendingTriangle:

Trzeba się zastanowić nad dodatkowym ocenianiem tych setupów np. z użyciem metryki R2.

Plus generowanie info i sprawdzanie starych zapisanych patternów (ale to jak już będą wszystkie trójkąty)

glowacki-dev commented 5 years ago

Oprócz tego co zrobiłem to już nic więcej tu nie muszę robić? W sensie nadal rysuję wedge i to będzie działać?

turbaszek commented 5 years ago

Tak, będzie tylko jeden pattern typu wedge. Przynajmniej przez najbliższy czas.

turbaszek commented 5 years ago
turbaszek commented 5 years ago

@Bombasarkadian pamiętasz o co chodziło z tą całką? Bo teraz jak o tym myślę, to to nie ma sensu xD

Ja policzymy pole od dołu i pole od góry (puste przestrzenie) i je zsumujemy to dostaniemy zawsze to samo (sumę szerokości). A branie średniej z z dwóch sum mnie nie przekonuje 🤔

glowacki-dev commented 5 years ago

Chyba chodziło o porównywanie tej przestrzeni między kilkoma potencjalnymi trójkątami

57219525-aa39d480-6ff8-11e9-9df8-ebd4840f8764

Czyli np. tutaj byśmy chcieli niebieski bo jest "ciaśniej"

turbaszek commented 5 years ago

preview

glowacki-dev commented 5 years ago

Te nazwy coraz bardziej szalone się robią 😃

turbaszek commented 5 years ago

Te nazwy coraz bardziej szalone się robią 😃

Na szczęście od razu dodaję je do admina, żeby nie trzeba było pamiętać :D

turbaszek commented 5 years ago

Zmieniłem metryki:

peaks_fit_value: float = suma odległości górnej lini od 4 ostatnich maksimów + suma odległości dolnej lini od 4 ostatnich minimów

empty_field_value: float = wspomniana wyżej całka

length: int = długość od początku do przecięcia się linii

points_between: float = procent punktów między liniami patternu

I zasada wybierania jest mniej więcej tak:

    @staticmethod
    def _select_best_setup(setups: [Setup]) -> Setup:
        # Sort by number of points between bands
        setups.sort(key=lambda s: s.points_between, reverse=True)
        setups = setups[:20]

        # Sort by fit to peaks
        setups.sort(key=lambda s: s.peaks_fit_value)
        setups = setups[:4]

        # Sort by empty value
        setups.sort(key=lambda s: s.empty_field_value)
        setups = setups[:2]

        # Sort by length
        setups.sort(key=lambda s: s.length)

        return setups[-1]