Friday 7 July 2017

Simple Moving Average Algorithm Java


Implementasi Rata-rata Bergerak Sederhana di Jawa Pada beberapa kesempatan, saya ingin menghitung metrik sederhana dalam aplikasi Java saya, misalnya jumlah klik per jam, atau kesalahan selama periode waktu tertentu. Sementara menghitung metrik sederhana tidak terlalu sulit, hanya kerja ekstra dan Id lebih suka menghabiskan waktu pada masalah domain. Saya terkejut tidak menemukan solusi metrik yang diterima secara luas di Jawa. Saya menemukan Metrik tapi sepertinya agak terlalu rumit dan tidak terdokumentasi dengan baik - Yang saya benar-benar inginkan adalah menghitung rata-rata bergerak. Saya memikirkan masalah ini lagi dan memutuskan bukan masalah yang sulit. Heres solusi saya Ini bekerja dengan menciptakan sebuah array dari ukuran frekuensi update jendela, maka sebuah thread menetapkan penghitungan ke indeks berikutnya dalam array pada frekuensi update. Hitungan untuk interval hanya arrayi - arrayi1, yang merupakan hitungan terakhir dikurangi hitungan tertua. Untuk interval 10 menit, hitungan tertua (i1) tepat 10 menit. Untuk menambahkan moving average ke kode kita terlebih dahulu perlu counter, menggunakan AtomicLong. Penghitung ini harus ditambahkan berdasarkan kejadian yang Anda minati dalam komputasi (misalnya permintaan POST untuk layanan REST). Kita perlu memberikan implementasi dengan akses ke loket dan itu dilakukan melalui antarmuka GetCount. Disini Ill menciptakan moving average dengan jendela 5 menit yang update setiap detiknya. Dan untuk mendapatkan rata-rata saat ini, kita cukup memanggil metode getAverage: Rincian implementasi kunci adalah bagaimana ukuran array ditentukan: dengan membagi jendela dengan frekuensi update. Jadi jendela besar dengan frekuensi update sering bisa mengkonsumsi memori dalam jumlah yang cukup banyak. Dalam contoh ini, ukuran array masuk akal 300. Namun, jika kita membuat moving average 24 jam dengan selang waktu 1 detik, ukurannya adalah 86400. Frekuensi update yang lebih masuk akal untuk periode 24 jam mungkin setiap 5 menit (ukuran array 288 ). Pertimbangan lain untuk memilih jendela dan update frekuensi adalah jendela harus bisa dibagi oleh frekuensi. Misalnya jendela 2 menit dengan frekuensi update 6 detik tidak apa-apa, tapi frekuensi update 7 detik tidak, karena tidak dapat dibagi oleh 120. IllegalArgumentException dilemparkan jika frekuensi update modulus jendela tidak nol. Implementasi ini membutuhkan satu thread per moving average, yang tidak terlalu efisien. Solusi yang lebih baik adalah berbagi benang di banyak rata-rata. Update. Saya telah memperbarui kode untuk berbagi thread di sini. Terakhir, ada masalah keadaan awal: kita tidak punya data untuk seluruh jendela. Misalnya jika Anda memiliki jendela 5 menit dan hanya 15 detik data. Implementasi ini mengembalikan null sampai kita memiliki data 5 menit. Pendekatan lain adalah memperkirakan rata-rata. Misalkan kita memiliki hitungan 10 dalam 30 detik, maka kita bisa memperkirakan rata-rata 40 dalam 2 menit. Namun ada risiko kesalahan yang signifikan dengan mengekstrapolasikan data yang tidak lengkap. Misalnya, jika kita mengalami ledakan 20 hit dalam 2 detik, pasti mengestimasi 1200 per 2 menit, yang kemungkinan besar jauh. Rata-rata Bergerak Sederhana - SMA BREAKING DOWN Simple Moving Average - SMA Rata-rata bergerak sederhana dapat disesuaikan di Bahwa hal itu dapat dihitung untuk jangka waktu yang berbeda, cukup dengan menambahkan harga penutupan keamanan untuk sejumlah jangka waktu dan kemudian membagi jumlah ini dengan jumlah periode waktu, yang memberi harga rata-rata keamanan selama jangka waktu. Rata-rata bergerak sederhana menghaluskan volatilitas, dan membuatnya lebih mudah untuk melihat tren harga suatu keamanan. Jika nilai rata-rata bergerak sederhana naik, ini berarti harga keamanan semakin meningkat. Jika mengarah ke bawah berarti harga keamanan menurun. Semakin panjang jangka waktu untuk moving average, semakin halus moving average yang sederhana. Rata-rata pergerakan jangka pendek lebih mudah berubah, namun bacaannya lebih mendekati data sumber. Signifikansi Analitis Moving averages adalah alat analisis penting yang digunakan untuk mengidentifikasi tren harga saat ini dan potensi perubahan dalam tren yang telah mapan. Bentuk paling sederhana menggunakan rata-rata bergerak sederhana dalam analisis adalah menggunakannya untuk mengidentifikasi dengan cepat apakah keamanan dalam tren naik atau tren turun. Alat analisis lain yang populer, walaupun sedikit lebih kompleks, adalah membandingkan rata-rata bergerak sederhana dengan masing-masing yang mencakup rentang waktu yang berbeda. Jika rata-rata bergerak sederhana jangka pendek berada di atas rata-rata jangka panjang, uptrend diharapkan terjadi. Di sisi lain, rata-rata jangka panjang di atas rata-rata jangka pendek menandakan pergerakan turun dalam tren. Pola Perdagangan Populer Dua pola perdagangan populer yang menggunakan moving average sederhana mencakup salib kematian dan salib emas. Salib kematian terjadi saat rata-rata pergerakan sederhana 50 hari di bawah rata-rata pergerakan 200 hari. Ini dianggap sebagai sinyal bearish, sehingga kerugian lebih lanjut di simpan. Salib emas terjadi ketika rata-rata pergerakan jangka pendek di atas rata-rata bergerak jangka panjang. Diperkuat oleh volume perdagangan yang tinggi, ini dapat memberi sinyal keuntungan lebih lanjut di toko. Saya perlu melacak jam kerja 7 hari terakhir dalam sebuah loop pembacaan file datar. Ini digunakan untuk mengukur kelelahan dari daftar pekerjaan. Saat ini saya memiliki sesuatu yang berhasil, tapi sepertinya agak verbose dan saya tidak yakin apakah ada pola yang lebih ringkas. Saat ini, saya memiliki kelas Java dengan array statis untuk menyimpan data x hari terakhir, lalu saat membaca file, saya memotong elemen pertama dan memindahkan 6 lainnya (untuk keseluruhan putaran keseluruhan) satu per satu. Pengolahan dari array statis ini dilakukan dengan metode sendiri yaitu. Pertanyaan saya: apakah ini pendekatan desain yang masuk akal, atau adakah sesuatu yang menyilaukan dan sederhana untuk melakukan tugas ini Terima kasih guys tanya 30 Agustus 11 jam 14:33 Terima kasih banyak guys: Saya sudah mendapat pesannya: gunakan benda tingkat lebih tinggi dan eksploitasi Metode yang relevan atau penyangga melingkar. Jawaban yang bagus, semuanya. Bila Anda memikirkannya, Anda selalu membutuhkan akses ke keseluruhan rangkaian sehingga Anda bisa menyingkirkan entri pertama - yang saya tidak yakin dengan keinginan saya sendiri. Saya merasa lega bahwa saya tidak dapat melewati satu kapal pun dan pada dasarnya berada pada jalur yang masuk akal, jika tidak efisien dan singkat Inilah yang saya sukai dari situs ini: jawaban berkualitas tinggi dan relevan dari orang-orang yang mengetahui kemampuan mereka. Ndash Pete855217 30 Agu 11 11 di 15:05 Mengapa Anda menginisialisasi runningTotal untuk null Apa jenisnya Dimana dideklarasikan Akan lebih baik jika Anda memasukkan beberapa contoh kode yang menyerupai kode Java yang sebenarnya. Pindah, kritik saya adalah sebagai berikut: fungsi Anda terlalu banyak. Suatu fungsi, atau metode, harus bersifat kohesif. Lebih tepat, mereka harus melakukan satu hal dan satu hal saja. Lebih buruk lagi, apa yang terjadi dalam lingkaran Anda saat x 5 Anda menyalin runningTotal6 ke runningTotal5. Tapi kemudian Anda memiliki dua salinan dengan nilai yang sama pada posisi 5 dan 6. Dalam desain Anda, fungsi Anda menggerakkan item pada array Anda menghitung total barang cetakan ke kesalahan standar mengembalikan totalnya. Saran pertama saya adalah tidak memindahkan barang-barang ke dalam array. Sebagai gantinya, terapkan buffer lingkaran dan gunakan sebagai pengganti array. Ini akan mempermudah disain anda. Saran kedua saya adalah memecah hal-hal ke dalam fungsi yang bersifat kohesif: memiliki struktur data (buffer melingkar) yang memungkinkan Anda menambahkannya (dan itu memasukkan entri tertua kapan pun mencapai kapasitasnya.) Miliki struktur data yang menerapkannya. Interator memiliki fungsi yang menghitung total pada iterator (Anda tidak peduli jika Anda menghitung total dari array, list atau circular bufer.) Jangan menyebutnya total. Sebut itu jumlah, apa yang Anda komputasi. Thats apa yang Id lakukan :) Itu info bagus luis, namun ingat fungsi ini adalah bagian kecil dari fungsionalitas kelas, dan akan terlalu banyak menambahkan terlalu banyak kode untuk membuatnya sempurna. Anda secara teknis benar, dan saya mengerti kode saya tidak banyak, tapi pada saat yang sama kadang-kadang lebih baik berbuat salah pada kode yang lebih kecil dan lebih jelas daripada memilih kesempurnaan. Mengingat kemampuan Java saya, bahkan membuat pseudocode yang Anda gambarkan kompilasi akan membuat saya meniup anggaran saya untuk ini (), namun terimakasih atas deskripsi yang jelas. Ndash Pete855217 31 Agustus 11 at 2:23 Hmmm, ini bukan tentang kesempurnaan, tapi tentang praktik industri mapan yang telah kita ketahui selama 3 dekade terakhir. Kode bersih selalu satu yang dipartisi. Kami memiliki beberapa dekade bukti yang menunjukkan bahwa ini adalah cara untuk pergi dalam kasus umum (dalam hal efisiensi biaya, pengurangan cacat, pemahaman, dll.). Kecuali itu adalah kode membuang jauh untuk hal satu kali. Tidak perlu melakukan hal ini bila seseorang memulai analisis masalah dengan cara ini. Coding 101, memecahkan masalah dan kode berikut, tidak berlebihan atau sulit) ndash luis. espinal 31 Agustus 11 at 15:55 Tugas Anda terlalu sederhana dan pendekatan yang Anda adopsi tentu saja bagus untuk pekerjaan itu. Namun, jika Anda ingin menggunakan desain yang lebih baik, Anda harus menyingkirkan semua gerakan angka itu dengan lebih baik menggunakan antrian FIFO dan gunakan metode push and pop dengan baik sehingga kode tersebut tidak mencerminkan pergerakan data apa pun, hanya dua tindakan logika. Data baru dan menghapus data lebih tua dari 7 hari. Jawab 30 Agustus pukul 14:49

No comments:

Post a Comment