Artikel ini adalah tentang Oracle Database, PL / SQL, SQL, MATCH_RECOGNIZE, MODEL klausa, agregat, dan fungsi pipelined.
Analisis teknis (TA) dari pasar digunakan sebagai area fungsional. Pertama, catatan pengantar dangkal kecil tentang perdagangan di pasar, lalu perhitungan.
Analisis teknis - seperangkat alat untuk memperkirakan kemungkinan perubahan harga berdasarkan pola perubahan harga sebelumnya. Secara teoritis, Analisis Teknis berlaku di pasar mana pun. Tetapi analisis teknis yang paling luas adalah di pasar bebas yang sangat likuid, misalnya, di bursa.
Banyak pernyataan, prosedur, dan grafik SQL telah dikembangkan. Bagian - di bawah ini, kode lengkap - di GitHub di tautan di bagian bawah artikel.
Indikator Pasar Teknis (TIR) ββ- grafik tambahan untuk grafik harga,
dibentuk atas dasar konversi nilai yang terkandung dalam grafik harga dasar . Biasanya ini adalah berbagai jenis rata-rata (titik berikutnya dari grafik dihitung sebagai nilai rata-rata dari sejumlah nilai harga sebelumnya, misalnya, rata-rata bergerak), hubungan (titik berikutnya adalah hasil membandingkan sejumlah harga sebelumnya - perbedaannya, turunan dari perubahan selama suatu periode), atau tertinggal ( keterlambatan). Indikatornya dengan jelas menunjukkan beberapa informasi tidak jelas yang terkandung dalam statistik perubahan harga, dan dapat membentuk rekomendasi untuk pesanan perdagangan - BELI / JUAL. Indikator memiliki setidaknya satu parameter variabel, dari nilai yang hasilnya akan berubah.
Untuk membuka transaksi nyata, biasanya beberapa indikator digunakan dalam kombinasi, ditambah informasi tambahan sesuai kebijaksanaan trader.Salah satu prinsip Analisis Teknis adalah "sejarah berulang dengan sendirinya": Pelaku pasar dalam keadaan yang sama berperilaku kira-kira dengan cara yang sama, membentuk dinamika perubahan harga yang serupa. Dan wajar untuk mengasumsikan bahwa perilaku pasar di masa depan terutama akan mengulangi pola yang telah muncul di masa lalu. Mengikuti pernyataan ini, investor dapat memilih dari parameter TIR yang memungkinkan yang telah membuktikan diri terbaik di masa lalu.
Artikel ini membangun grafik kinerja perdagangan saat menggunakan setiap indikator pada nilai parameter TIR, ini dalam representasi dua dimensi. Tetapi pada kenyataannya, saya akan membangun dalam representasi tiga dimensi untuk mengevaluasi juga efek dari keterlambatan dalam pelaksanaan urutan pada hasil, sehingga parameter akan menjadi sumbu X (abscissa), penundaan akan menjadi sumbu Y (ordinat), hasilnya akan menjadi sumbu Z (applicate). Ini adalah beberapa upaya untuk mengevaluasi efek "selip", yang, sayangnya, selalu terjadi. Alih-alih "selip" nyata di sepanjang sumbu Y, saya menunda pelaksanaan pesanan BUY / SELL untuk periode 1 hingga 5 periode.
Jika maksimum global disorot pada grafik ini dan grafik itu sendiri akan terlihat seperti topi (secara umum, itu disebut "distribusi normal", tetapi mengasumsikan simetri ketat tentang sumbu vertikal), kerucut, piramida juga cocok - itu berarti Anda dapat memilih nilai parameter tertentu untuk ini , yang akan menunjukkan hasil tertinggi, dan dengan indikator ini Anda dapat mencoba berdagang. Jika bagan kinerja, tergantung pada parameter, menyerupai "stockade", tidak mungkin untuk memilih nilai parameter yang optimal dan tidak ada gunanya menggunakan
TIR ini dalam perdagangan.
Kita dapat mengatakan bahwa dalam artikel ini saya hanya menghitung βpersentase hitβ dari indikator. Masalahnya, untuk mengevaluasi seberapa banyak Anda bisa "menghasilkan", saya tidak berani.Berhasil menyelesaikan tes yang dijelaskan adalah salah satu faktor yang diperlukan, tetapi tidak cukup untuk perdagangan yang efektif.Untuk informasi ... Berbeda dengan Analisis Teknis, Analisis Fundamental (FA) adalah istilah untuk menunjuk metode untuk memprediksi nilai pasar (pertukaran) instrumen berdasarkan analisis indikator kinerja keuangan dan produksi.
"Nilai intrinsik"
FA dalam banyak kasus tidak sesuai dengan harga saham perusahaan, yang ditentukan oleh rasio penawaran dan permintaan di pasar saham. Investor yang menggunakan
FA dalam kegiatan mereka terutama tertarik pada situasi di mana "nilai intrinsik" dari saham perusahaan melebihi harga saham di bursa. Saham semacam itu dianggap undervalued, yang artinya harganya akan naik, dan mereka adalah target investasi potensial.
Salah satu investor paling terkenal yang menggunakan Analisis Fundamental adalah Warren Buffett.
Lihat trailernya:
https://www.youtube.com/watch?v=SqE8fnvmV1YDengan demikian, kami memiliki dua pendekatan yang berlawanan secara diametral -
TA dan
FA .
FA biasanya menarik minat investor jangka panjang, TA - jangka pendek dan menengah dan digunakan untuk transaksi yang bersifat spekulatif, ketika subjek perdagangan tidak tertarik pada pedagang.
Dan tujuan dari artikel ini adalah dua ...
Selain diskusi tentang
TA dan
FA yang dijelaskan di atas, saya
ingin mengeksplorasi dan menunjukkan kemampuan Oracle Database untuk melakukan perhitungan indikator pasar Teknis .
Saya menyajikan kesempatan ini untuk penilaian pembaca.
Jika Anda memutuskan untuk mengulangi perhitungan saya - unduh kode dari GitHub di tautan di bagian bawah artikel. Kode diverifikasi pada versi 12.2.0.1.
Pertama buat objek yang dibagikan. Yang pertama adalah tabel dan tampilan. Dalam file yang sama di bawah ini adalah paket pemodelan transaksi.
Langkah kedua adalah pembuatan fungsi yang melakukan perhitungan
TIR .
Langkah ketiga adalah perhitungan.
Semua fungsi penghitungan semua
TIR akan menghasilkan kursor dengan bidang-bidang berikut: STOCK_NAME, ADATE, ACLOSE (harga penutupan hari), AACTION (pesanan jual / beli)
Paket ini berisi tiga fungsi pemodelan tabular yang mengambil kursor input dari fungsi perhitungan
TIR yang dijelaskan di atas, offset (keterlambatan dalam eksekusi order, lag), dan modal awal, secara default adalah 1000 USD. Fungsi paket disebut seperti ini:
select * from HABR_TRADEMODELLING_P.TRADE_LOG (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1) order by 1, 2; select * from HABR_TRADEMODELLING_P.CALC_ACTIONS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1); select * from HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1);
di mana XXXXXXXX adalah nama
TIR .
Semua fungsi menghitung hasil perdagangan yang tunduk pada reinvestasi laba secara penuh, tidak termasuk biaya transaksi dan pajak, dan tidak termasuk inflasi dan diskon.Fungsi pertama
TRADE_LOG
membentuk log transaksi pedagang yang disederhanakan. Fungsi ini memungkinkan Anda untuk melacak seluruh rantai transaksi. Jika pada akhir periode investor "dalam sekuritas", untuk menghitung saldo dalam mata uang (hasil keuangan), fungsi mensimulasikan penjualan semua sekuritas pada harga penutupan terakhir dan membentuk tanda yang sesuai di bidang IN_STOCK.
Fungsi kedua
CALC_ACTIONS
mengembalikan kolom yang sama dengan kursor penghitungan
TIR yang disebut, ditambah menambahkan kolom berikut:
AACTION_LAG
(pesanan dengan offset),
BALANCE_CURRENCY
(saldo akun pedagang secara tunai),
BALANCE_STOCK
(jumlah instrumen dalam posisi terbuka). Bergantung pada nilai bidang
AACTION_LAG
, pembelian atau penjualan pada harga penutupan disimulasikan, dan karenanya, keseimbangan dalam mata uang dan jumlah posisi terbuka diubah.
Di baris terakhir dari setiap instrumen, Anda dapat melihat hasil perdagangan untuk setiap instrumen, serta dalam fungsi sebelumnya, jika investor "dalam sekuritas", penjualan disimulasikan untuk menghitung saldo dalam mata uang asing
Fungsi ketiga
CALC_ACTIONS_TOTALS
melakukan hal yang sama dengan yang kedua, tetapi hanya mengembalikan baris terakhir - hasil perdagangan untuk setiap instrumen. Ini akan digunakan dalam pemodelan.
Unduh data
Perhitungan diberikan untuk pasar dan indeks tersebut: S & P500, NYSE, Brent, BTCUSD, EURUSD.
4 yang pertama diunduh dari Yahoo Finance, yang terakhir dari sumber lain. Hasil perhitungan untuk kursus dari sumber lain dapat bervariasi.
Harap dicatat bahwa periode kursus setiap instrumen berbeda, yaitu:
- S & P500 - 03/01/1950 ... 29/01/2019, 69 tahun;
- NYSE - 31/12/1965 ... 22/03/2019, 54 tahun;
- Brent - 17/05/1991 ... 06/02/2019, 28 tahun;
- BTCUSD - 16/07/2010 ... 29/01/2019, 9 tahun;
- EURUSD - 16/02/2001 ... 27/05/2019, 18 tahun.
Oleh karena itu, tidak mungkin untuk membandingkan profitabilitas instrumen yang dicapai satu sama lain, tetapi dimungkinkan untuk membandingkan profitabilitas masing-masing instrumen menggunakan indikator yang berbeda.
File unduhan (SQL * Loader) juga dapat diambil dari GitHub di tautan di bagian bawah artikel.
Rata-rata bergerak
Setidaknya ada tiga jenis rata-rata bergerak:
- linear (Simple Moving Average, SMA),
- Exponential Moving Average (EMA) dan
- linear tertimbang (Weighted Moving Average, WMA).
Mereka berbeda dalam bobot bagian-bagian penyusunnya. Untuk rata-rata bergerak linier, bobotnya sama, untuk bobot berbobot eksponensial dan linear, bobotnya berkurang ketika komponen bergerak lebih jauh dari tepi kanan jendela - secara eksponensial atau linear.
Rata-rata bergerak linier adalah yang paling mudah untuk dihitung. Di Oracle, ini adalah fungsi
avg (VALUE) over (partition by STOCK_NAME order by ADATE rows between 9 preceding and current row)
- rata-rata bergerak dengan jendela rata-rata 10 nilai.
Rata-rata bergerak linier memiliki kelemahan. Pertama, rata-rata tersebut merespons secara perlahan terhadap pembalikan pasar. Karena banyak nilai dirata-rata, masing-masing diberi bobot yang sama, respons rata-rata sering terjadi beberapa jangka waktu setelah pembalikan harga aset.
Juga, rata-rata bergerak linier tidak terlalu efektif, karena merespon sinyal dua kali: ketika indikator memasuki jendela geser dan meninggalkannya. Sisanya hanya bereaksi terhadap input indikator dan menghapusnya dengan lancar dari perhitungan saat Anda bergerak dari tepi kanan jendela ke kiri.
Dalam menghitung
TIR , ketiga jenis moving average digunakan. Untuk bobot eksponensial dan linear dalam artikel ini, fungsi agregat
EMA
dan
WMA
dikembangkan, yang digunakan dalam bentuk analitis. Selain itu, rata-rata bergerak ini dapat dihitung dengan rekursi atau model (frase
MODEL
).
Perhitungan EMA dan WMA, tanpa rekursi atau modelka, hanya dengan analisis, dalam Oracle Database, tampaknya, tidak mungkin.
Namun masih ada keberatan terkait moving average:
- semakin pendek periode rata-rata dan semakin sensitif metode bereaksi terhadap belokan, semakin banyak memberikan sinyal palsu;
- semakin pendek periode rata-rata, semakin banyak sinyal yang dihasilkan, semakin besar overhead transaksi, yang dapat menjadi sangat signifikan.
Indikator Pasar Teknis
Untuk hampir setiap indikator, beberapa metode perhitungan akan diberikan: CALC - perhitungan menggunakan kode PL / SQL, perhitungan SIMP oleh satu operator atau RECU - perhitungan dengan rekursi, AGRF - perhitungan menggunakan fungsi agregat, MODE - perhitungan dengan model.
Ada alasan untuk mengembangkan beberapa metode. Pertama, dengan menghitung
TIR menggunakan beberapa metode dan membandingkan indikator, jika indikatornya sama, Anda dapat yakin bahwa perhitungan dilakukan dengan benar (dengan mempertimbangkan berbagai metode pembulatan dan pemrosesan nilai NULL dan "0"). Pada artikel ini saya akan membandingkan hash sampel metode yang berbeda, sehingga pencocokan hingga bit dan pemrosesan yang sama oleh semua algoritma dijamin.
Saya percaya bahwa Oracle perlu mulai mengembangkan
TIR dengan metode SIMP - perhitungan oleh satu operator. Ketika ini dilakukan, oracleoid memiliki rencana dan algoritma perhitungan di kepalanya, dan dapat dengan mudah ditransfer ke PL / SQL atau ke bahasa prosedural lain.
Saya perhatikan bahwa metode perhitungan CALC untuk PL / SQL di sini lebih cepat daripada metode SIMP (dengan satu operator) jika seluruh perhitungan dapat dilakukan dalam satu lintasan sepanjang kursor. Tetapi jika untuk perhitungan Anda harus membuat tabel atau koleksi sementara, atau lebih dari 1 melewati kursor - saya pikir metode "satu operator" akan berubah menjadi lebih cepat dan kurang intensif sumber daya.
Untuk semua metode, termasuk metode SIMP ("satu operator"), saya akan menempatkan fungsi operator sehingga perhitungan dapat dipanggil dengan parameter untuk memilih nilai optimal.
Perhitungan diberikan untuk tujuh
TIR : Persimpangan Rata-Rata Bergerak (EMASIMPLE), Salib Emas dan Mematikan (LINTAS), Volume Saldo (OBV), Saluran Keltner (KELTNER), Tren Harga dan Volume (PVT), Indikator indikator kemudahan lengan (EMV) ), Indeks Saluran Komoditas (CCI).
Untuk tujuh indikator dari dua artikel ini akan ada satu parameter "rata-rata ukuran jendela", dan parameter kedua - shift (lag). Pergeseran tersebut mengatakan berapa banyak bilah yang Anda butuhkan untuk menunda pelaksanaan pesanan BELI / SELL - berapa banyak bilah untuk memindahkan harga penutupan (semua pesanan dilakukan pada harga penutupan bilah). Ini mirip dengan "slippage," tetapi itu tidak sepenuhnya "slippage." Slippage biasanya tidak berpihak pada klien, dan kelambatan kami mungkin berubah menjadi tidak berpihak pada klien, dan mendukung. Namun demikian, penggunaan pemodelan dengan lag 1 hingga 5 bar untuk beberapa indikator menunjukkan bahwa selip memiliki pengaruh yang signifikan terhadap hasilnya. Dan untuk beberapa indikator, lag dan slippage tidak begitu penting.
Metode SIMP ("operator tunggal") dan RECU ("rekursi") secara aktif menggunakan frase
MATCH_RECOGNIZE
untuk menghasilkan sinyal perdagangan BELI / JUAL berdasarkan pada entri / keluar dari
TIR yang dihitung ke dalam rentang yang ditentukan atau perilakunya relatif terhadap rata-rata bergeraknya.
Deskripsi terperinci dari semua TIR dapat ditemukan di Wikipedia atau dalam buku Robert Colby, Encyclopedia of Technical Market Indicators.Perpotongan rata-rata bergerak eksponensial
Metode memotong rata-rata bergerak eksponensial adalah
TIR paling sederhana.
Metode ini melibatkan: membeli (membuka posisi buy) jika nilai harga melintasi bottom-up exponential moving average (ESA); jual (menutup posisi buy) jika harga memotong ESS dari atas ke bawah.
Posisi sell, serta perdagangan margin secara umum, tidak dipertimbangkan dalam artikel ini.
Di masa depan, indikator inilah yang dapat digunakan sebagai standar untuk dibandingkan dengan yang lain. Perbandingan dengan
TIR ini lebih baik daripada perbandingan dengan strategi Beli dan Tahan, karena strategi ini tidak menguntungkan di pasar yang jatuh.
Satu-satunya parameter
TIR adalah panjang rata-rata bergerak.
Perhitungan menggunakan PL / SQL
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_CALC (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T pipelined is l_result HABR_MARKETINDEXES_RESULT_LIST_T; EMA number; prev_EMA number; prev_TYPICAL_PRICE number; retval HABR_MARKETINDEXES_RESULT_T := HABR_MARKETINDEXES_RESULT_T (null, null, null, null, null, null, null, null, null); prev_STOCK_NAME varchar2(256); l_alpha number; begin l_alpha := 2 / (p_averaging_window_width + 1); for c1 in (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE from LOAD_YAHOO_V order by 1, 2) loop retval.ADATE := c1.ADATE; retval.ACLOSE := c1.ACLOSE; if prev_STOCK_NAME is null or prev_STOCK_NAME <> c1.STOCK_NAME then retval.STOCK_NAME := c1.STOCK_NAME; EMA := c1.TYPICAL_PRICE; prev_EMA := null; else EMA := round (c1.TYPICAL_PRICE * l_alpha + EMA * (1 - l_alpha), 20); end if; if prev_TYPICAL_PRICE < prev_EMA and c1.TYPICAL_PRICE > EMA then retval.AACTION := 'BUY'; elsif prev_TYPICAL_PRICE > prev_EMA and c1.TYPICAL_PRICE < EMA then retval.AACTION := 'SELL'; else retval.AACTION := null; end if; retval.IND_VALUE := EMA; pipe row (retval); prev_STOCK_NAME := c1.STOCK_NAME; prev_EMA := EMA; prev_TYPICAL_PRICE := c1.TYPICAL_PRICE; end loop; end;
Perhitungan oleh satu operator rekursif
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_RECU (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 (STOCK_NAME, ADATE, TYPICAL_PRICE, EMA, ACLOSE, RN) as (select STOCK_NAME, ADATE, TYPICAL_PRICE, round (TYPICAL_PRICE, 20), ACLOSE, RN from LOAD_YAHOO_V where RN = 1 union all select b.STOCK_NAME , b.ADATE , b.TYPICAL_PRICE , round (b.TYPICAL_PRICE * 2 / (p_averaging_window_width + 1) + a.EMA * (1 - 2 / (p_averaging_window_width + 1)), 20) , b.ACLOSE , b.RN from T1 a, LOAD_YAHOO_V b where b.RN = a.RN + 1 and b.STOCK_NAME = a.STOCK_NAME) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Perhitungan menggunakan frase MODEL
Teks fungsi HABR_MARKETINDEXES_EMASIMPLE_F_MODE create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_MODE (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select * from LOAD_YAHOO_V model dimension by (STOCK_NAME, RN) measures (ADATE, TYPICAL_PRICE, ACLOSE, to_number(null) as EMA) rules (EMA[any, any] = round (TYPICAL_PRICE [cv(), cv()] * 2 / (p_averaging_window_width + 1) + nvl(EMA [cv(), cv() - 1], TYPICAL_PRICE [cv(), cv()]) * (1 - 2 / (p_averaging_window_width + 1)), 20))) , T2 as (select STOCK_NAME, ADATE, ACLOSE , TYPICAL_PRICE, LAG (TYPICAL_PRICE) over (partition by STOCK_NAME order by ADATE) as PREV_TYPICAL_PRICE , EMA, lag (EMA) over (partition by STOCK_NAME order by ADATE) as PREV_EMA from T1) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null , case when prev_TYPICAL_PRICE < prev_EMA and TYPICAL_PRICE > EMA then 'BUY' when prev_TYPICAL_PRICE > prev_EMA and TYPICAL_PRICE < EMA then 'SELL' end) bulk collect into l_result from T2 order by STOCK_NAME, ADATE; return l_result; end;
Perhitungan menggunakan fungsi agregat
Teks fungsi agregat EMA dan fungsi HABR_MARKETINDEXES_EMASIMPLE_F_AGRF create or replace type EMA_DATA_T as object (AVALUE number, AVERAGING_WINDOW integer); create or replace type EMA_IMPL_T as object ( l_window_width integer, l_ema number, static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number, member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number, member function ODCIAggregateMerge (self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number, member function ODCIAggregateTerminate (self in EMA_IMPL_T, returnValue out number, flags in number) return number ); create or replace type body EMA_IMPL_T is static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number is begin sctx := EMA_IMPL_T (null, null); return ODCIConst.Success; end; member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number is begin if value.AVALUE is not null then if l_window_width is null then l_window_width := value.AVERAGING_WINDOW; self.l_ema := value.AVALUE; else self.l_ema := round (value.AVALUE * 2 / (l_window_width + 1) + self.l_ema * (1 - 2 / (l_window_width + 1)), 20); end if; end if; return ODCIConst.Success; end; member function ODCIAggregateMerge(self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number is begin return ODCIConst.Error; end; member function ODCIAggregateTerminate(self in EMA_IMPL_T, returnValue out number, flags in number) return number is begin returnValue := self.l_ema; return ODCIConst.Success; end; end; create or replace function EMA (input EMA_DATA_T) return number aggregate using EMA_IMPL_T; create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE , round (EMA (EMA_DATA_T (TYPICAL_PRICE, p_averaging_window_width)) over (partition by STOCK_NAME order by ADATE), 20) as EMA from LOAD_YAHOO_V) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Bandingkan hasil perhitungan dengan satu parameter:
select COLUMN_VALUE as ALG, dbms_sqlhash.gethash (COLUMN_VALUE, 2) as RECORDSET_HASH from table (sys.odcivarchar2list ('select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_RECU (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_MODE (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) order by 1, 2'));
Semua hash harus cocok untuk keempat metode.
Jika hash tidak cocok, Anda dapat mengetahui dengan tepat di mana perbedaan terbentuk, menggunakan operator ini (ganti nama fungsi yang ingin Anda bandingkan):
select coalesce (a.STOCK_NAME, b.STOCK_NAME) as STOCK_NAME, coalesce (a.ADATE, b.ADATE) as ADATE , a.ACLOSE as CALC_ACLOSE, b.ACLOSE as AGRF_CLOSE , a.IND_VALUE as CALC_EMA, b.IND_VALUE as AGRF_EMA , a.AACTION as CALC_AACTION, b.AACTION as AGRF_AACTION from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) a full outer join table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) b on a.STOCK_NAME = b.STOCK_NAME and a.ADATE = b.ADATE
Pemilihan parameterTIR itu sendiri menggunakan satu parameter, untuk ini dan untuk semua
TIR lainnya saya mengubahnya dalam kisaran dari 1 hingga 200, tetapi untuk menghitung gambar tiga dimensi untuk ketergantungan dan pada lag juga, kami akan memperkenalkan parameter kedua yang akan bervariasi dari 1 hingga 5.
Operator membuka 200 * 5 = 1000 kursor, jadi Oracle
OPEN_CURSORS mungkin perlu diubah
Kueri di bawah ini menjalankan produk Cartesian dari tabel dengan angka dari 1 hingga 200, dengan tabel dengan angka dari 1 hingga 5, dan Cartesian mengalikan semua ini dengan memanggil fungsi tabel
HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS
.
Setelah beberapa manipulasi lebih lanjut dalam MATLAB, kita selanjutnya akan mendapatkan matriks 200 * 5, di mana dalam sel-sel matriks akan ada nilai modal total untuk setiap nilai dari masing-masing dua parameter. Selanjutnya dalam MATLAB kita membuat gambar tiga dimensi.
rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
Semua perhitungan dalam artikel ini dilakukan dengan lambat, hingga 20 menit, ini disebabkan oleh pembukaan sejumlah besar kursor.
Saya juga mengembangkan metode simulasi yang lebih cepat dengan satu kursor, tanpa membuka 1000 kursor, tetapi sangat produktif sehingga butuh setengah dari artikel. Karena itu, saya tidak akan membawanya ke sini.
Hasil pemodelan persimpangan rata-rata bergerak (semua grafik dapat diklik):

Baris kedua bagan sama dengan baris pertama, tetapi bagan sedikit diputar, bagan dengan jeda yang berbeda disusun satu demi satu. Ini memungkinkan Anda untuk mengevaluasi efek kelambatan pada hasilnya.
Secara umum, indikatornya tidak terlalu sensitif terhadap kelambatan. Untuk pasar S & P500 dan NYSE, parameter
TIR perlu dipilih lebih banyak, semakin baik. Untuk pasar Brent - sekitar 25. Di dua pasar lainnya, tidak ada korelasi antara profitabilitas dan parameter.
Mematikan dan Salib Emas
Dalam implementasi pada Oracle, indikator ini sangat mirip dengan yang sebelumnya, hanya di sini dua moving average digunakan, dan bukan satu. Karena itu, saya hanya akan memberikan satu opsi perhitungan.
Wiki menggambarkan Indikator Ichimoku. Ini adalah indikator yang kompleks. "Crosses" adalah salah satu bagian penyusunnya. Tetapi indikator tersebut tidak dijelaskan dengan baik pada Wiki, khususnya, mencatat bahwa garis Tenkan dan Kijun dijelaskan dengan kata-kata yang sama sekali berbeda, meskipun sebenarnya itu adalah hal yang sama, tetapi dengan periode yang berbeda.
Dalam buku Robert Colby, indikator ini juga tidak dijelaskan.
Analis Jepang menyebut persimpangan rata-rata, ketika rata-rata jangka pendek melintasi jangka panjang dari bawah ke atas, Salib Emas (Golden Cross), dan situasi yang berlawanan, ketika rata-rata bergerak jangka pendek melintasi jangka panjang dari bawah ke bawah, adalah Palang Mati.
Penulis memperhatikan bahwa indikator ini dijelaskan dalam artikel
"Minyak berjangka untuk Amerika membentuk" salib mematikan "" dan mulai mencari deskripsi dan penggunaannya di google.
Indikator ini dianggap serius di pasar saham, sebagian karena jarang memberikan sinyal.
Yang paling umum digunakan adalah rata-rata bergerak periode 50 dan 200.
Saat memodelkan kinerja di bawah ini, kami akan mengambil periode rata-rata bergerak panjang sama dengan periode empat kali lipat rata-rata bergerak pendek, dan mensimulasikan panjang pendek dari 1 hingga 200 hari (itu akan berubah dari 4 hingga 800 hari untuk panjang).
Kode untuk menghitung di GitHub.

Indikatornya tidak terlalu sensitif terhadap keterlambatan. Untuk pasar S & P500, ada maksimum di 48 (192 untuk SS panjang) dan 98 hari (392 untuk SS panjang). Perhatikan bahwa maksimum pertama sangat dekat dengan angka 50x200. Dapat diasumsikan bahwa jika Anda memilih parameter ini 1 dan 2 lebih sedikit daripada peserta pasar lainnya, Anda dapat mencoba untuk mengalahkan mereka hanya pada indikator ini.
Ada 4 tertinggi di NYSE. Di pasar Brent dan BTCUSD, indikator tidak berfungsi.
Untuk pasar EURUSD juga, parameter harus dipilih sedikit kurang dari 50 untuk SS pendek. Tetapi indikator tidak memberikan keuntungan di pasar ini. Ini hanya dapat digunakan sebagai indikator tambahan.
Volume Saldo, Volume Ekuilibrium, Volume Seimbang (OBV)
Indikator OBV adalah volume perdagangan rata-rata bergerak kumulatif yang diambil dengan tanda plus dalam kasus pasar yang berkembang dan dengan tanda minus dalam kasus yang jatuh.
Di sini kita akan menggunakan metode ini untuk menafsirkan nilai indikator: membeli ketika OBV memotong moving average-nya dari bawah ke atas, menjual ketika OBV memotong moving average-nya dari atas ke bawah.
Lebih lanjut tentang
Wiki atau Colby

Di pasar S & P500, indikatornya sangat sensitif terhadap penundaan (kelambatan), tetapi Anda dapat mencoba memilih parameter pada prinsip "semakin banyak semakin baik", beberapa keuntungan dicapai. Di NYSE, profitabilitas tidak dapat dicapai. Di pasar Brent, Anda dapat memilih nilai parameter dari 20 hingga 100. Di pasar BTCUSD, tidak ada hubungan linier yang jelas, tetapi memilih nilai parameter kurang dari 40 tidak praktis. Untuk pasar EURUSD, nilai parameter harus dipilih "semakin banyak semakin baik", tetapi profitabilitas tidak dapat dicapai.
Saluran Keltner
TIR terdiri dari dua band di atas dan di bawah harga rata-rata bergerak, lebar yang ditentukan sebagai sebagian kecil dari perubahan harga rata-rata untuk periode tersebut. Harga adalah harga tipikal.Garis tengah garis indikator adalah rata-rata bergerak sederhana dari harga umum.Garis atas dan bawah dari indikator dipisahkan dari garis tengah dengan jumlah yang sama dengan rata-rata bergerak sederhana dari kisaran perdagangan harian.Dalam perhitungan kami, sinyal TIR akan dibentuk sebagai berikut: Beli jika harga melintasi garis atas, Jual jika harga melintasi garis yang lebih rendah.
Ada yang tertinggi untuk pasar S & P500 dan NYSE. Di pasar Brent, tidak ada ketergantungan hasil pada parameter, dan semua perdagangan mengalami kerugian. Ada yang tertinggi di pasar BTCUSD, tetapi yang sempit, dan sulit untuk menerimanya. Di pasar EURUSD ada ketergantungan hasil pada parameter.Tren harga dan volume, Tren harga dan volume, Tren Harga - Volume, PVT
Nilai indikator PVT mewakili jumlah kumulatif produk dari volume perdagangan saat ini dengan penurunan harga yang relatif terhadap periode sebelumnya.Kami akan menghasilkan sinyal perdagangan di sini sebagai berikut: Beli ketika PVT melintasi moving average-nya dari bawah ke atas, Jual ketika PVT memotong moving average-nya dari atas ke bawah.Lebih lanjut tentang Wiki . Colby tidak menemukan. Untuk S & P500, nilai parameter "semakin besar semakin baik", hampir tidak ada ketergantungan pada NYSE, untuk Brent ada maksimum di wilayah 50, pada BTCUSD indikator hanya efektif dengan kelambatan minimum, 1-2, dan dengan nilai parameter minimum, hingga 50 , untuk EURUSD ketergantungan meningkat.
Kemudahan Gerakan, Nilai Kemudahan Gerakan, EMV
TIR EMV adalah ekspresi numerik tentang betapa mudahnya perubahan harga di pasar. Semakin kuat perubahan harga dan semakin rendah turnover, semakin mudah pasar naik atau turun.Pesanan perdagangan di sini kita akan membentuk sebagai berikut: Beli ketika EMV rata-rata bergerak naik di atas nol, Jual ketika EMV rata-rata bergerak turun di bawah nol.Lebih lanjut tentang Wiki atau Colby. Ada yang tertinggi di pasar S&P dan NYSE, di pasar Brent, indikator ini efektif dalam berbagai nilai parameter. Di pasar BTCUSD dan EURUSD, indikatornya tidak efektif.
Indeks saluran komoditas, CCI
TIR CCI adalah indikator yang didasarkan pada analisis perubahan saat ini dalam penyimpangan harga dari nilai rata-rata untuk periode tertentu dan nilai absolut rata-rata dari parameter ini. TIR berlaku untuk setiap pasar keuangan.Kami akan membentuk pesanan perdagangan sebagai berikut: Beli ketika CCI naik di atas 100, Jual ketika CCI turun di bawah 100.Lebih lanjut tentang Wiki atau Colby. Di pasar S & P500, NYSE, Brent, tidak ada ketergantungan hasil perdagangan pada nilai parameter. Ada ketergantungan pada pasar BTCUSD (dua tertinggi jelas), dan Anda dapat mencoba menangkapnya dalam perdagangan nyata. Di pasar EURUSD, indikator hasilnya tidak akan muncul. Sumber tersedia di github
Buat objek umum, unggah data, baik milikku (seperti yang saya katakan sebelumnya, semua pasar kecuali yang terakhir diambil dari Yahoo Finance), atau milik Anda sendiri, buat fungsi untuk menghitung, menghitung data kinerja perdagangan (seperti yang saya katakan sebelumnya, menghitung setiap indikator hingga 20 menit) .Kesimpulan umum mengenai TIR : penggunaan hanya satu indikator untuk untung tidak mungkin. Indikator yang berbeda berbeda efektif di pasar yang berbeda. Kemungkinan menghasilkan untung menggunakan beberapa indikator yang disesuaikan plus informasi eksternal tambahan tidak dikecualikan.Opsional:
Tiga indikator lagi dianalisis yang tidak termasuk dalam artikel. Tetapi mereka gagal mendapatkan hasil apa pun. Mungkin studi mereka akan dilanjutkan.Sangat mudah untuk melakukan perhitungan dan pemodelan kompleks TIR dan kegiatan keuangan secara umum di Oracle Database.