Penulis:
gpwr
Sejarah Versi:
26/06/2009 - menambah indikator baru BPNN Predictor dengan Smoothing.mq4, di mana harga diratakan menggunakan EMA sebelum ramalan dibuat.
20/08/2009 - membetulkan kod pengiraan fungsi pengaktifan neuron untuk mengelakkan pengecualian aritmetik; mengemas kini BPNN.cpp dan BPNN.dll
21/08/2009 - menambah pembersihan memori pada akhir pelaksanaan DLL; mengemas kini BPNN.cpp dan BPNN.dll
Teori Ringkas tentang Neural Networks:
Neural network adalah model yang boleh disesuaikan bagi output sebagai fungsi input. Ia terdiri daripada beberapa lapisan:
- lapisan input, yang terdiri daripada data input
- lapisan tersembunyi, yang terdiri daripada nod pemprosesan yang dipanggil neuron
- lapisan output, yang terdiri daripada satu atau beberapa neuron, yang outputnya adalah output rangkaian.
Semua nod pada lapisan bersebelahan saling berkaitan. Sambungan ini dipanggil sinaps. Setiap sinaps mempunyai koefisien penskalaan yang ditetapkan, di mana data yang diteruskan melalui sinaps didarab. Koefisien penskalaan ini disebut sebagai berat (w[i][j][k]). Dalam Feed-Forward Neural Network (FFNN), data dipindahkan dari input ke output. Berikut adalah contoh FFNN dengan satu lapisan input, satu lapisan output dan dua lapisan tersembunyi:

Topologi FFNN sering disingkat seperti berikut: <# input> - <# neuron dalam lapisan tersembunyi pertama> - <# neuron dalam lapisan tersembunyi kedua> -...- <# output>. Rangkaian di atas boleh dirujuk sebagai rangkaian 4-3-3-1.
Data diproses oleh neuron dalam dua langkah, yang ditunjukkan dalam bulatan dengan tanda penjumlahan dan tanda langkah:
- Semua input didarab dengan berat yang berkaitan dan dijumlahkan
- Jumlah yang terhasil diproses oleh fungsi pengaktifan neuron, yang outputnya adalah output neuron.
Fungsi pengaktifan neuron inilah yang memberikan nonlinieriti kepada model neural network. Tanpa itu, tidak ada sebab untuk mempunyai lapisan tersembunyi, dan neural network menjadi model autoregresif linear (AR).
Fail perpustakaan yang dilampirkan untuk fungsi NN membolehkan pemilihan antara tiga fungsi pengaktifan:
- sigmoid sigm(x)=1/(1+exp(-x)) (#0)
- tangen hiperbolik tanh(x)=(1-exp(-2x))/(1+exp(-2x)) (#1)
- fungsi rasional x/(1+|x|) (#2)

Syarat pengaktifan bagi fungsi ini adalah x=0. Syarat ini boleh dipindahkan sepanjang paksi x terima kasih kepada input tambahan bagi setiap neuron, yang dipanggil bias input, yang juga mempunyai berat yang ditetapkan kepadanya.
Bilangan input, output, lapisan tersembunyi, neuron dalam lapisan ini, dan nilai berat sinaps sepenuhnya menggambarkan FFNN, iaitu model nonlinear yang ia hasilkan. Untuk mencari berat, rangkaian mesti dilatih. Semasa latihan terawasi, beberapa set input lalu dan output yang diharapkan yang berkaitan dimasukkan ke dalam rangkaian. Berat dioptimumkan untuk mencapai kesalahan terkecil antara output rangkaian dan output yang diharapkan. Kaedah pengoptimuman berat yang paling mudah adalah back-propagation kesalahan, yang merupakan kaedah penurunan gradien. Fungsi latihan yang dilampirkan Train() menggunakan varian kaedah ini, dipanggil Improved Resilient back-Propagation Plus (iRProp+). Kaedah ini diterangkan di sini
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.1332
Kelemahan utama kaedah pengoptimuman berasaskan gradien adalah bahawa ia sering mencari minimum tempatan. Untuk siri yang bercampur seperti siri harga, permukaan kesilapan latihan mempunyai bentuk yang sangat kompleks dengan banyak minimum tempatan. Untuk siri sedemikian, algoritma genetik adalah kaedah latihan yang lebih disukai.
Fail yang dilampirkan:
- BPNN.dll - fail perpustakaan
- BPNN.zip - arkib semua fail yang diperlukan untuk menyusun BPNN.dll dalam C++
- BPNN Predictor.mq4 - indikator yang meramalkan harga buka masa depan
- BPNN Predictor with Smoothing.mq4 - indikator yang meramalkan harga buka yang diratakan
Fail BPNN.cpp mempunyai dua fungsi: Train() dan Test(). Train() digunakan untuk melatih rangkaian berdasarkan nilai input lalu dan output yang diharapkan yang diberikan. Test() digunakan untuk mengira output rangkaian menggunakan berat yang dioptimumkan, yang ditemui oleh Train().
Berikut adalah senarai parameter input (hijau) dan output (biru) bagi Train():
double inpTrain[] - Data latihan input (1D array yang membawa 2D data, lama dahulu)
double outTarget[] - Data sasaran output untuk latihan (2D data sebagai 1D array, paling lama dahulu)
double outTrain[] - Array output 1D untuk menyimpan output rangkaian dari latihan
int ntr - # set latihan
int UEW - Gunakan Berat Eksternal untuk inisialisasi (1=guna extInitWt, 0=guna rnd)
double extInitWt[] - Array 1D input untuk menyimpan array 3D berat awal luar
double trainedWt[] - Array output 1D untuk menyimpan array 3D berat terlatih
int numLayers - # lapisan termasuk input, tersembunyi dan output
int lSz[] - # neuron dalam lapisan. lSz[0] adalah # input rangkaian
int AFT - Jenis fungsi pengaktifan neuron (0:sigm, 1:tanh, 2:x/(1+x))
int OAF - 1 mengaktifkan fungsi pengaktifan untuk lapisan output; 0 menonaktifkan
int nep - Max # epoch latihan
double maxMSE - Max MSE; latihan berhenti setelah maxMSE dicapai.
Berikut adalah senarai parameter input (hijau) dan output (biru) bagi Test():
double inpTest[] - Data ujian input (2D data sebagai 1D array, paling lama dahulu)
double outTest[] - Array output 1D untuk menyimpan output rangkaian dari latihan (paling lama dahulu)
int ntt - # set ujian
double extInitWt[] - Array 1D input untuk menyimpan array 3D berat awal luar
int numLayers - - # lapisan termasuk input, tersembunyi dan output
int lSz[] - # neuron dalam lapisan. lSz[0] adalah # input rangkaian
int AFT - Jenis fungsi pengaktifan neuron (0:sigm, 1:tanh, 2:x/(1+x))
int OAF - 1 mengaktifkan fungsi pengaktifan untuk lapisan output; 0 menonaktifkan
Keputusan untuk menggunakan fungsi pengaktifan di lapisan output atau tidak (nilai parameter OAF) bergantung pada sifat output. Jika output adalah binari, yang sering berlaku dalam masalah klasifikasi, maka fungsi pengaktifan harus digunakan di lapisan output (OAF=1). Sila ambil perhatian bahawa fungsi pengaktifan #0 (sigmoid) mempunyai tahap tepu 0 dan 1 manakala fungsi pengaktifan #1 dan #2 mempunyai tahap -1 dan 1. Jika output rangkaian adalah ramalan harga, maka tiada fungsi pengaktifan yang diperlukan di lapisan output (OAF=0).
Contoh menggunakan perpustakaan NN:
BPNN Predictor.mq4 - meramalkan harga buka masa depan. Input rangkaian adalah perubahan harga relatif:
x[i]=Open[test_bar]/Open[test_bar+delay[i]]-1.0
di mana delay[i] dikira sebagai nombor Fibonacci (1,2,3,5,8,13,21..). Output rangkaian adalah perubahan relatif yang diramalkan bagi harga seterusnya. Fungsi pengaktifan dimatikan di lapisan output (OAF=0).
Input indikator:
extern int lastBar - Bar terakhir dalam data lalu
extern int futBars - # bar masa depan untuk diramalkan
extern int numLayers - # lapisan termasuk input, tersembunyi & output (2..6)
extern int numInputs - # input
extern int numNeurons1 - # neuron dalam lapisan tersembunyi atau output pertama
extern int numNeurons2 - # neuron dalam lapisan tersembunyi atau output kedua
extern int numNeurons3 - # neuron dalam lapisan tersembunyi atau output ketiga
extern int numNeurons4 - # neuron dalam lapisan tersembunyi atau output keempat
extern int numNeurons5 - # neuron dalam lapisan tersembunyi atau output kelima
extern int ntr - # set latihan
extern int nep - Max # epoch
extern int maxMSEpwr - sets maxMSE=10^maxMSEpwr; latihan berhenti < maxMSE
extern int AFT - Jenis fungsi aktivasi (0:sigm, 1:tanh, 2:x/(1+x))
Indikator ini memplot tiga lengkung pada carta:
- warna merah - ramalan harga masa depan
- warna hitam - harga buka latihan lalu, yang digunakan sebagai output yang diharapkan untuk rangkaian
- warna biru - output rangkaian untuk input latihan

BPNN Predictor.mq4 - meramalkan harga buka yang diratakan masa depan. Ia menggunakan pemadaman EMA dengan tempoh smoothPer.

Penyediaan Semua:
- Salin BPNN.DLL yang dilampirkan ke C:\Program Files\MetaTrader 4\experts\libraries
- Dalam metatrader: Alat - Pilihan - Penasihat Pakar - Benarkan import DLL
Anda juga boleh menyusun fail DLL anda sendiri menggunakan kod sumber dalam BPNN.zip.
Saranan:
- Satu rangkaian dengan tiga lapisan (numLayers=3: satu input, satu tersembunyi dan satu output) sudah cukup untuk kebanyakan kes. Menurut Teorem Cybenko (1989), rangkaian dengan satu lapisan tersembunyi mampu menghampiri sebarang fungsi multivariat berterusan dengan tahap ketepatan yang diingini; rangkaian dengan dua lapisan tersembunyi mampu menghampiri sebarang fungsi multivariat tidak berterusan:

- Bilangan neuron yang optimum dalam lapisan tersembunyi boleh dicari melalui percubaan dan ralat. Berikut adalah "peraturan jari" yang boleh ditemui dalam literatur: # neuron tersembunyi = (# input + # output)/2, atau SQRT(# input * # output). Ikuti kesalahan latihan, yang dilaporkan oleh indikator dalam tetingkap pakar metatrader.
- Untuk generalisasi, bilangan set latihan (ntr) harus dipilih 2-5 kali ganda dari jumlah berat dalam rangkaian. Sebagai contoh, secara default, BPNN Predictor.mq4 menggunakan rangkaian 12-5-1. Jumlah berat adalah (12+1)*5+6=71. Oleh itu, bilangan set latihan (ntr) harus sekurang-kurangnya 142. Konsep generalisasi dan memori (over-fitting) diterangkan pada graf di bawah.
- Data input ke rangkaian harus ditransformasi menjadi stasionari. Harga Forex bukan stasionari. Ia juga disyorkan untuk menormalkan input ke julat -1..+1.
Graf di bawah menunjukkan fungsi linear y=b*x (x-input, y-output) yang outputnya dicemari oleh bunyi. Bunyi tambahan ini menyebabkan output fungsi yang diukur (titik hitam) menyimpang dari garis lurus. Fungsi y=f(x) boleh dimodelkan oleh neural network feed forward. Rangkaian dengan bilangan berat yang besar boleh dipadankan dengan data yang diukur dengan kesalahan sifar. Tingkah laku ini ditunjukkan sebagai lengkung merah yang melalui semua titik hitam. Namun, lengkung merah ini tidak ada kaitan dengan fungsi linear asal y=b*x (hijau). Apabila rangkaian over-fitted ini digunakan untuk meramalkan nilai masa depan fungsi y(x), ia akan menghasilkan kesalahan besar disebabkan oleh kebolehubahan bunyi yang ditambah.

Sebagai balasan untuk berkongsi kod ini, penulis mempunyai sedikit permintaan. Jika anda berjaya membina sistem perdagangan yang menguntungkan berdasarkan kod ini, sila kongsikan idea anda dengan saya melalui emel secara langsung ke vlad1004@yahoo.com.
Semoga berjaya!