Transcript Aplikacja C# Testująca Systemy Inwestycyjne
Prezentacja pracy dyplomowej „Aplikacja C# Testująca Systemy Inwestycyjne”
Autor: Ryszard Pietrzak Opiekun pracy: dr Jacek Matulewski
Cele pracy dyplomowej
Powstanie aplikacji testującej przydatność systemów inwestycyjnych z uwzględnieniem cech osobowych inwestora oraz zmienności dynamiki rynku.
Nauka i doskonalenie umiejętności programowania dyplomanta w VisualC#.
Przeznaczenie aplikacji
Aplikacja testowania przeznaczona instrumentach pochodnych jest dla inwestorów operujących na tzw.
rynków kapitałowych oraz na walutach. Służy do systemów inwestycyjnych, opartych zarówno o rekomendację instytucji doradczych, jak i metody analizy technicznej, czyli interpretację zmian cen i wolumenu przedstawionych na wykresach.
Systemy inwestycyjne są tutaj rozumiane jako systemy określające czas otwarcia i zamknięcia inwestycji pozwalające osiągnąć maksymalny zysk przy minimalnym ryzyku.
Test jest przeprowadzany poprzez obliczanie i archiwizowanie „skuteczności” (różnicy cen otwarcia i zamknięcia inwestycji) oraz wykonywanie na tych wielkościach obliczeń i zestawień pozwalających stwierdzić, które z systemów są najskuteczniejsze w danym stadium trendu rynkowego. Te obliczenia i zestawienia omawianiu algorytmu programu. Do zostaną szczegółowo opisane przy obliczeń stosowana jest skuteczność krótko-terminowa (po dwóch godzinach od rozpoczęcia inwestycji) oraz finalna, czyli całkowity zysk bądź strata. Oprogramowanie powinno być używane w dłuższym okresie i przez jednego tylko inwestora ze względu na duże znaczenie cech osobowych (szczególnie poziomu kontroli emocji) przy interpretacji płynących z systemów sygnałów dokonywania transakcji.
Aplikacja ma pomóc inwestorowi w wybraniu najlepszego dla niego w danym momencie systemu podejmowania decyzji inwestycyjnych poprzez pokazanie skuteczności osiąganej za pomocą poszczególnych systemów w: całym okresie inwestowania, całym okresie przy malejącej wadze inwestycji odległych w czasie, w okresach przeszłości, w których dynamika rynku, mierzona odczytywanymi z wykresu cen parametrami, jest najbardziej zbliżona do tej, w jakiej przyszło działać inwestorowi obecnie, czyli w momencie podejmowania decyzji.
Danymi programu są:
Skuteczność Ceny otwarcia i zamknięcia transakcji.
Ceny po dwóch godzinach.
Daty zawarcia transakcji.
Porównywanie okresów Zakres zmienności cen ATR.
Współczynnik ruchu kierunkowego cen ADX.
Początki i końce okresów.
Wartości zwracane przez program
Skuteczność Średnia + średnia wykładnicza.
Średnia/ATR – wzór (5). Średni zysk.
Średnia strata.
Porównania
Średnia + średnia wykładnicza ATR i ADX.
Suma różnic kwadratów – wzór (4).
Odchylenie standardowe – wzór (3).
Wzory wykorzystane do obliczeń
Wyniki obliczeń podstawowej skuteczności (różnicy cen otwarcia i zamknięcia) oraz charakteryzujących trend rynkowy współczynników ATR i ADX są dla każdej transakcji dopisywane i archiwizowane w dołączonej do aplikacji bazie danych, skąd pobierane są do obliczeń.
Ogólny schemat blokowy programu Rys.2
START WYBÓR PAPIERU WARTOŚCIOWEGO WPROWADZENIE CEN ORAZ ATR I ADX WYBÓR JEDNEGO LUB KILKU SYSTEMÓW INWESTYCYJNYCH WYBÓR OKRESU RODZAJ TRANSAKCJI DŁUGA KRÓTKA CENY * -1 OBLICZANIE SKUTECZNOŚCI DOPISANIE WYNIKU DO BAZY DANYCH I AKTUALIZACJA KWEREND EDYCJA DANYCH W TABELACH ODCZYT Z TABEL BAZY DANYCH I TWORZENIE TABLIC WG DATY OBLICZANIE ŚREDNIEJ ,WYKŁADNICZEJ ŚREDNIEJ WAŻONEJ ORAZ STOSUNKU TYCH SREDNICH DO ATR DLA: 1)SKUTECZNOŚCI 2)ZYSKU 3)STRATY PREZENTACJA WYNIKÓW W ZESTAWIENIU Z ADX PORÓWNANIE TABLIC ATR I ADX PREZENTACJA WYNIKÓW PORÓWNANIA INNY INSTRUMENT TEN SAM INSTRUMENT NASTĘPNA INWESTYCJA?
NIE STOP
Podblok wyboru rodzaju transakcji i okresu Rys.3
WYBÓR SYSTEMU ,DATY I RODZAJU TRANSAKCJI
Krótka Zmień znak Zastosuj system TMS* Długa Oblicz skuteczność idodaj do tabeli Pomiń Cały okres Wybór okresu* Od dnia Od do Krótka Zmień znak Zastosuj system KM* Długa Oblicz skuteczność idodaj do tabeli Pomiń Przypisz zmiennym typu data wartości:przed powstaniem programu i teraz Przypisz zmiennym typu data wartości : wprowadzoną z DateTimePicker teraz Krótka Zmień znak Zastosuj system SCHT* Długa Oblicz skuteczność i dodaj do tabeli Pomiń Przypisz zmiennym typu data wartości: wprowadzne z komponentów AateTimePicker Zastosuj system UBS* Krótka Pomiń Zmień znak Długa Oblicz skuteczność i dodaj do tabeli Wczytywanie z tabel do kolekcji filtr czasowy obliczń i obliczenia.
* if this.RadioButtonChecked
Podblok porównania dwóch okresów Rys.4
PORÓWNYWAIE TABLIC WSPÓLCZYNNIKÓW
ZDEFINIUJ PORÓWNYWANE OKRESY - POCZĄTEK PIERWSZEGO D1 - KONIEC PIERWSZEGO D2 - POCZĄTEK DRUGIEGO D3 UTWÓRZ DWIE PUSTE TABLICE P1,P2 BRAK WYBIERZ DATY W ZAKRESIE D1-D2 TAK DOPISZ DO TABKICY P1 ELEMENTY TABLICY WSPÓLCZYNIKÓW WYBIERZ DATY WIĘKSZA OD D3.
CZYLICZBA ELEMENTÓW >= OD LICZBY ELEMENTÓW P1 TAK DOPISZ DO TABLICY P2 N KOLEJNYCH ELEMENTÓW TABLICY WSPÓŁCZYNNIKÓW GDZIE N = ROZMIAR TABLICY P1 PORÓWNAJ TABLICE P1 &P2 METODĄ NAJMNIEJSZYCH KWADRATÓW POKAŻ RÓŻNICĘ I ŚREDNIE NIE POKAŻ KOMUNIKAT " PORÓWNANIE NIEMOŻLIWE"
Dlaczego Visual C# ?
Dobry mechanizm podłączenia i aktualizacji bazy danych.
Jest to nowoczesne środowisko programowania obiektowego współpracujące z rozwojową platformą .NET
Bogaty zestaw, wygodnych w użyciu komponentów graficznych.
Początki
Stanem wyjściowym aplikacji, przed rozpoczęciem programowania czyli pisania metod zdarzeniowych, jest zaprojektowanie wyglądu okna przez rozmieszczenia i nazwanie wszystkich komponentów graficznych
….oraz utworzenie i podłączenie bazy danych. Każdy instrument wymaga bazy danych złożonej z dziewięciu prostych tabel, po dwie dla każdego systemu i jednej dla współczynników ATR&ADX. Kluczem podstawowym wszystkich tabel jest pole autonumeracja. Pomiędzy tabelami nie występują relacje gdyż wyniki inwestycyjne poszczególnych systemów są niezależne. Na postawie tabel skuteczności finalnej tworzone są dwie kwerendy z kryterium: wartość dodatnia i ujemna.
Po ustanowieniu połączenia między bazą danych a aplikacją i konfiguracji komponentu
DataSet
, czyli reprezentacji bazy danych w aplikacji, umieszczono na „formie” (czyli w oknie programu) komponent
DataGrid View
, służący do przeglądania danych. Następnie przez podłączanie do niego (jako źródła danych) wszystkich tabel bazy danych uzyskano dla każdej z tabel następujący zapis w kodzie programu:
“// TODO: This line of code loads data into the 'db1DataSet.EURUSDUBSzK' table. You can move, or remove it, as needed. this.eURUSDUBSzKTableAdapter.Fill(this.db1DataSet.EURU
SDUBSzK);”
Ten przykładowy zapis oznacza, że za pomocą metody
eURUSDUBSzKTableAdapter.Fill
wypełniona została tabela EURUSD komponentu
DataSet.
Operacja ta uaktywnia tabelę w oknie aplikacji.
Konstrukcja programu Program wykonuje obliczenia na żądanie użytkownika przez uruchamianie metod zdarzeniowych.
Wszystkie metody zdarzeniowe wywoływane są kliknięciem przycisku, czyli obiektu klasy
Button.
Kliknięcie przycisku uruchamia zdefiniowane w klasie
Button
zdarzenie
Click.
Automatycznie generowany kod wygląda następująco:
private void button2_Click(object sender, EventArgs e) { tu opisujemy zdarzenie }
Jak widać metoda ma dwa argumenty: pierwszy typu
Object,
zawierający referencje do obiektu generującego zdarzenie i drugi typu
EventArgs
zawierający dodatkowe parametry zdarzenia.
Konstrukcja programu –metody klasy form Oprócz metod zdarzeniowych w klasie form umieszczono metody zwracające wartość o ogólnej konstrukcji: typ_wyniku nazwa_metody(argumenty_metody) {instrukcje metody} //Obliczanie wykladniczej sredniej kroczącej(metoda zwracajaca wartosc) double Sr_wykladnicz(List
Metoda zdarzeniowa „Przelicz” - najbardziej rozbudowana metoda zdarzeniowa wykonująca zasadnicze obliczenia dla każdego z instrumentów. Składa się z następujących bloków: Blok wyboru okresu czasu dla Realizowany jest za którego wykonywane są obliczenia.
pomocą przycisków
RadioButton
i instrukcji warunkowej
if
.
Blok wyboru rodzaju/kierunku transakcji realizowany za przycisków
RadioButton
, instrukcji warunkowej
if,
pomocą dodatkowej zmiennej oraz etykiet.
Blok wprowadzania
TextBox
i instrukcję danych, realizowany
ConvertToDouble.
poprzez komponent Blok dopisujący dane i wyliczenia do tabel oraz aktualizujący tabele bazy danych. Operacja taka wymaga inicjalizacji zmiennej typu wiersz tabeli, nadanie jej wartości obliczonej skuteczności, dopisanie powstałego wiersza do reprezentującego bazę danych w aplikacji komponentu DataSet oraz aktualizacji bazy danych w folderze bin/debug aplikacji.
Przykładowy kod (dla jednej tabeli) to:
// zapis do bazy danych wierszy skuteczn ości po 2 godzinach i daty db1DataSet.EURUSDTMS2hRow wiersz2h = db1DataSet.EURUSDTMS2h.NewEURUSDTMS2hRow(); wiersz2h.SKUT = skuT2h; wiersz2h.Data = DateTime.Now; db1DataSet.EURUSDTMS2h.AddEURUSDTMS2hRow(wiersz2h); //aktualizacja bazy danych eURUSDTMS2hBindingSource.EndEdit(); eURUSDTMS2hTableAdapter.Update(db1DataSet);
Metoda zdarzeniowa „Przelicz” kontynuacja Blok wczytywania danych z tabel do kolekcji.
Zmienne wypełniające listy zostały zadeklarowane jako zmienne typu var. Zmienne takie opisywane w C# jako
variables
,
implicitly-typed
przybierają typ domyślnie na podstawie przypisanej im podczas inicjacji wartości. Warunkiem jest umieszczenie instrukcji deklaracji i przypisania w jednym wierszu.
Oto fragment kodu jej deklarujący zmienną typu
var
, przypisujący wartość wraz z jej typem oraz wypełniający listę rekordami tabeli.
var DaneADX = from rekord in db1DataSet.ADX select rekord.SKUT; kolumnaADX = DaneADX.ToList();
Metoda zdarzeniowa „Przelicz” kontynuacja Blok obliczeń i prezentacji wyliczonych wartości. Wyliczenia prezentowane są w obiektach
GroupBox
zatytułowanych wyniki. Metody obliczeniowe umieszczone są bezpośrednio w instrukcji: przypisz tekst do obiektu.
//PREZENTACJA WYNIKOW UBS this.groupBox71.Text
= ("SKUTECZNOŚĆ Śr = " + Math.Round(kolumnaU.Average(), 5) + " \ nŚr.wkł= " + Sr_wykladnicz(kolumnaU, kolumnaDU) + " \ nŚr./ATR=" + Math.Round((kolumnaU.Average() / kolumnaATR.Average()), 3) + (" \ nŚr.wkł/ATR=") + Math.Round((Sr_wykladnicz(kolumnaU, kolumnaDU)) / (Sr_wykladnicz(kolumnaATR, kolumnaDArx)), 3) + (" \nSTRATA Śr=") + Math.Round(kolumnaUS.Average(), 5) + (" \nZYSK Śr=") + Math.Round(kolumnaUZ.Average(), 5) + ("\n\ nUżyto ") + kolumnaU.Count + (" rekordów"));
Prezentowane wyniki wyglądają tak
Metoda zdarzeniowa ATR ADX przedstawia w komponencie MessageBox (wyświetlanym okienku) następujące wyliczenia dla współczynników ATR I ADX: Średnie.
Wykładnicze średnie ważone.
Odchylenia standardowe.
Poniżej przykładowa prezentacja wyników.
Metoda zdarzeniowa „Porównywanie dynamiki rynku” Komponenty służące do porównywania przeszłych okresów inwestycyjnych, pod względem charakteru trendu rynkowego zlokalizowane zostały na osobnej zakładce
Tab Page
obiektu
TabControl
klasy TabControl. Komponenty tam umieszczone wywołują metody realizujące blok porównania tablic współczynników oraz prezentują wyniki porównania w postaci sumy różnic kwadratów kolejnych odpowiadających sobie elementów, wartości średnich oraz odchylenia standardowego dla dwóch porównywanych okresów. Na podstawie dat wprowadzonych przez komponenty
DateTimePicker
określających początek i koniec pierwszego z porównywanych okresów oraz koniec drugiego utworzone zostaje dwie, zadeklarowane lokalnie w metodzie zdarzeniowej tablice, które posłużą do porównywania. Po wywołanie tej metody zdarzeniowej zadeklarowanym w klasie ADX, przypisane
Form
, listom współczynników ATR i zostają kolumny z bazy danych (tak samo jak w metodzie zdarzeniowej „Przelicz”), dzięki czemu porównywanie może być wykonywane w dowolnym momencie, bez list. Tworzenie list do wcześniejszego wykonywania obliczeń w celu wypełnienia porównywania odbywa się za pomocą pętli
for
i instrukcji warunkowej
if
użytej, jak zwykle, do filtrowania względem daty. Taki sam rozmiar porównywanych list uzyskuje się przez zastosowanie dodatkowego indeksu i instrukcji
break
w pętli wypełniającej listy. Oto fragment kodu tworzący porównywane listy:
int k = 1; int l = 1; } { for (int i = 0; i < kolumnaATR.Count; i++) { if ((kolumnaDArx[i] >= ODDATY1) && (kolumnaDArx[i] <= DODATY1)) kolumnaP1.Add(kolumnaATR[i]); //kolumnaP1[k] = kolumnaATR[i]; k++; } //k - ile rekordow { for (int i = 0; i < kolumnaATR.Count; i++) { if (kolumnaDArx[i] >= ODDATY2) kolumnaP2.Add(kolumnaATR[i]); l++; } if (l >= k) break; } this.label71.Text=(kolumnaDArx[l].ToShortDateString()); } { if (k != l) MessageBox.Show("Okresy nie są porównywalne"); return;
Metoda zdarzeniowa „Porównywanie dynamiki rynku” zwraca następujące wielkości: Sumę różnic kwadratów, będącą wynikiem porównania metodą najmniejszych kwadratów.
Zestawione dla obydwu okresów średnie.
Zestawione dla obydwu okresów odchylenia standardowe. Widok okna porównywania dynamiki rynku
Zakładka edycja danych w tabelach Mimo zagrożeń z tym związanych, takich jak utrata części danych lub wygenerowanie trudnych do wykrycia błędów, w aplikacji istnieje możliwość przeglądania i „ręcznej” edycji danych z poziomu danych w tabelach bazy użytkownika oprogramowania. Ostatnia zakładka
Tab Page
stwarza możliwość otwarcia bazy danych w pliku aplikacji
bin/debug.
Jest to wykreowana przez ADO.NET baza danych będąca kopią utworzonego w MS Access pierwowzoru. Ten właśnie plik jest reprezentowany przez obiekt
DataSet
i aktualizowany na podstawie zmian w tym obiekcie. Otwarcie pliku bazy danych realizowane jest przez metodę zdarzeniową wywoływaną jak zwykle przyciskiem. W metodzie umieszczone zostało okno dialogowe, w którym otwiera bazę danych za pomocą klasy
System.Diagnostics.Process. Instrukcja dostępu do bazy danych db1 to: System.Diagnostics.Process.Start("db1.mdb");
Widok zakładki edycji danych w tabelach
Podsumowanie
Temat niniejszej pracy wybrany Po pierwsze, w celu został z dwóch powodów.
wypełnienia pewnej luki w oprogramowaniu wspierającym inwestycje, która w moim, drobnego inwestora, odczuciu istnieje. Przez wieki już istnienia branża wygenerowała ogromne ilości narzędzi mających ułatwiać podejmowanie decyzji.
W znakomitej większości są one różną, lub tylko nieco różną, interpretacją tych samych faktów czyli zmian cen. Jednocześnie wyraźnie brakuje prostego oprogramowania pozwalającego oszacować skuteczność osiąganą przez pojedynczego inwestora przy zastosowaniu wybranych przez niego potrzeb modyfikować tę aplikację.
systemów. Mam zamiar użytkować i w miarę Po drugie z lub powodów szkoleniowych. Dotyczy to głownie użycia Visual C#. Takie same zbliżone efekty, uwzględniając również wspomniany przeze mnie w rozdziale czwartym łatwy dostęp do wyników obliczeń, można uzyskać za pomocą odpowiedniej bazy danych, jednak aplikacji użycie C# wydaje mi się ciekawsze. Pierwsze próby napisania tej podjęte były w opartym na znanym mi w pewnym zakresie Pascalu środowisku Borland Delphi, które uważam za bardzo przyjazne i interesujące. Jednak brak możliwości zastosowania bazy danych oraz niezbyt dobre widoki na przyszłość tego środowiska sprawiły, że zwróciłem się ku C#, którego uczę się od podstaw. To ostatnie zdanie zostało zamieszczone jako wyjaśnienie do zamieszczonych dalej podziękowań.
Dziękuję opiekunowi pracy - Panu doktorowi Jackowi Matulewskiemu oraz kierownikowi Studium - Pani doktor Danucie Jeziorek za okazaną pomoc i cierpliwość.