Použití VB.NET pro obchodování na burze–6. díl

Dnes si vypočítáme indikátor RSI2. Ten budete potřebovat například pro výpočet kandidátů na strategii “90%”, ale i jinde. Aplikace výpočtu ve VB.NET je velice jednoduchá a přímočará, je jen potřeba myslet na to, že ve strategii používáme Wilderovo vyhlazování (Wilder’s smoothing) pro výpočet, a tudíž že potřebujeme více vstupních cen (typicky 14).

RSI2

Tady není moc co dodat, jen opět poukáži na dokumentaci. Výpočet indikátoru vychází z RS (relative strength), což je prostě podíl průměrných zisků za období ku průměru ztrát za období. (Respektive absolutní hodnoty ztrát, aby se to dalo vydělit). RSI je pak normalizovaná hodnota tohoto poměru, a pak je tu ono Wilderovo vyhlazování (neplést s průměrováním).

Code Snippet
Module Module1
  Sub Main()
    'ceny GLD za 14 obchodních dnů od 3.9.2014 do 22.9.2014
    Dim Ceny() As Decimal = {122.15, 121.48, 122.06,
                             120.73, 120.87, 120.26, 119.47,
                             118.38, 118.64, 118.83, 117.54,
                             117.78, 117.09, 116.85}

    Console.Write("{0:0.##}", RSI2(Ceny)) 'vrátí 9.43

  End Sub

  Function RSI2(Vstup As Decimal()) As Decimal
    Dim pocet As Integer = 14 'jak daleko musím do historie
    Dim Rada As Decimal() = (From d In Vstup Select d).Skip(Vstup.Count – pocet).Take(pocet).ToArray
    If Rada.Length < pocet Then Throw New Exception("příliš málo dat pro výpočet RSI2")

    Dim ups As Decimal() = New Decimal(pocet – 1) {}
    Dim avgups As Decimal() = New Decimal(pocet – 1) {}
    Dim downs As Decimal() = New Decimal(pocet – 1) {}
    Dim avgdowns As Decimal() = New Decimal(pocet – 1) {}

    'ups
    For i = 1 To pocet – 1 'nultý se vynechává !!!
      If Rada(i) > Rada(i – 1) Then
        ups(i) = (Rada(i) – Rada(i – 1))
      Else
        ups(i) = 0
      End If
    Next

    'avg ups podle Wilderse (vyhlazování)
    avgups(1) = ups(1)
    For i = 2 To pocet – 1
      avgups(i) = (avgups(i – 1) + ups(i)) / 2
    Next

    'downs
    For i = 1 To pocet – 1 'nultý se vynechává !!!
      If Rada(i) < Rada(i – 1) Then
        downs(i) = Math.Abs(Rada(i) – Rada(i – 1))
      Else
        downs(i) = 0
      End If
    Next

    'avg downs podle Wilderse (vyhlazování)
    avgdowns(1) = downs(1)
    For i = 2 To pocet – 1
      avgdowns(i) = (avgdowns(i – 1) + downs(i)) / 2
    Next
    Return 100 – (100 / (1 + (avgups(pocet – 1) / avgdowns(pocet – 1))))
  End Function
End Module

Ostatní články tohoto seriálu

  1. Použití VB.NET pro obchodování – zasílání e-mailů (25.2.2015)
  2. VB.NET, burza a Linux–není to šílené? (30.1.2015)
  3. Použití VB.NET pro obchodování na burze–10. díl (16.1.2015)
  4. Použití VB.NET pro obchodování na burze–9. díl (2.1.2015)
  5. Použití VB.NET pro obchodování na burze–8. díl (14.12.2014)
  6. Použití VB.NET pro obchodování na burze–7. díl (3.11.2014)
  7. Použití VB.NET pro obchodování na burze–6. díl (27.10.2014)
  8. VB.NET a burza – REALTIME data z Google–5. díl (20.10.2014)
  9. Použití VB.NET pro obchodování na burze–4. díl (13.10.2014)
  10. Použití VB.NET pro obchodování na burze–3. díl (6.10.2014)
  11. Použití VB.NET pro obchodování na burze - 2. díl (29.9.2014)
  12. Použití VB.NET pro obchodování na burze–1. díl (22.9.2014)
Příspěvek byl publikován v rubrice Nezařazené. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

9 komentářů u Použití VB.NET pro obchodování na burze–6. díl

  1. foglik napsal:

    ‚UPs a ‚DOWNs se dají počítat v jednom cyklu – stačí prohodit větve DOWNs a přidat do UPs.

    Celý ten pomocný výpočet pro RSI (MoveUP, MoveDw, AvgUP, AvgDw) lze dát mezi jedinou cyklus For…Next a zkrátit ho přesně na 9, resp. 11 řádků.

  2. cubecoop napsal:

    Když cena 14 dní roste, nakonec dělíš nulou…

    • admin napsal:

      To je fakt, měla by tam být podmínka. V takovém případě je RSI z definice rovno 100. Díky za upozornění.

  3. Mirek napsal:

    Ahoj Zajíci,
    nemáš prosímtě někde již napsán kód jak by vypadal pro jinou periodu RSI jež by jsi sem mohl vložit? Například 5 nebo 14…

    Tento výpočet jsem si přepsal do excelu a přicházím na to že není úplně jasné jak přesně to počítat – a to z důvodu přesnosti výsledku. Pokud počítám RSI 5 z historických dat za 14 dní zpětně, tak výsledek je značně nepřesný. Pokud jej počítám z 30 dní do historie tak se přesnost zvýší.
    Jinými slovy je záhadou kolik historických dat potřebuji pro určitou periodu RSI.

    • admin napsal:

      Hele, toto už jsem vysvětloval tolikrát, a na internetu je to na tak mnoha místech, že to už pro mě nemá význam opakovat.

  4. Zat napsal:

    Čau WinPse,

    přepsal jsem si tvůj kód do Pythonu a vychází mi rsi 77.7563965754. Použil jsem stejná data i pro již naprogramovaný indikátor RSI z pyalgotrader a ten mi dává to samé číslo, tedy 77.7563965754.

    Opravdu ti vychází 9.43 nebo to byla hodnota pro jiná data než si je změnil a neupdatoval si komentář?

  5. Jelimán napsal:

    Zdravím Vás:)

    díky Vám za uveřejnění tohoto kódu, který mi pomohl překonat nástrahy při výpočtu, zdánlivě tak prostého indikátoru jako je RSIW. On samotný výpočet není složitý, když víte „jak na to“ naštěstí jsem kód po 3 hlubokých depresí, 2 roztřískaných hrnečcích a neustálých myšlenkách „jak jsem blbej“ „prolomil“ Výsledek jsem si ověřil na 2 platformách. Vím že už toho máte po krk vysvětlovat něco k RSI, prosím Vás nemohl byste mi jenom říct jak jste přišel na to, že avgdown1=down1 a avgup1=up1. Zdroje uvádí, že se začíná s MA. Promiňte mi, jestli to je blbá otázka, ale nějak mi to vrtá hlavou. Pokud mi napíšete že to je mimo, že ta podmínka není tak, jak jsme si ji vyložil, tak si to půjdu asi hodit :) samozřejmě pochopím, i když na to nebudete reagovat. i tak Vám děkuji. S pozdravem Jelimán

Napsat komentář

Vaše emailová adresa nebude zveřejněna.