Beranda Perdagangan Sistem Postingan

Uji Coba Alat Pembelajaran Mesin Schnick untuk MetaTrader 5

Lampiran
1370.zip (2.63 KB, Unduh 0 kali)

Artikel ini merupakan bagian dari "Pembelajaran Mesin: Bagaimana Support Vector Machines Dapat Digunakan dalam Trading" yang dipublikasikan di situs MQL5.

Versi skrip ini ditulis khusus untuk digunakan dengan versi demo dari Alat Pembelajaran Mesin Support Vector yang tersedia secara gratis di MQL5 Market.

Bayangkan skenario hipotetis di mana Anda adalah seorang peneliti yang menyelidiki hewan langka yang hanya ditemukan di kedalaman Arktik, yang disebut Schnicks. Mengingat keterpencilan hewan-hewan ini, hanya sedikit yang pernah ditemukan (katakanlah sekitar 5000). Sebagai peneliti, Anda terjebak dengan pertanyaan... bagaimana cara saya mengidentifikasi Schnick?

Yang Anda miliki hanyalah makalah penelitian yang dipublikasikan oleh beberapa peneliti yang pernah melihatnya. Dalam makalah-makalah ini, penulis menjelaskan karakteristik tertentu tentang Schnicks yang mereka temukan, seperti tinggi, berat, jumlah kaki, dll. tetapi semua karakteristik ini bervariasi di antara makalah tanpa pola yang jelas....

Bagaimana kita bisa menggunakan data ini untuk mengidentifikasi hewan baru sebagai schnick?

Salah satu solusi untuk masalah kita adalah menggunakan mesin vektor dukungan untuk mengidentifikasi pola dalam data dan membuat kerangka kerja yang dapat digunakan untuk mengklasifikasikan hewan sebagai schnick atau bukan schnick. Langkah pertama adalah membuat satu set data yang dapat digunakan untuk melatih mesin vektor dukungan Anda untuk mengidentifikasi schnicks. Data pelatihan adalah sekumpulan input dan output yang cocok untuk dianalisis oleh mesin vektor dukungan dan mengekstrak pola dari sana.

Skrip ini berusaha mendemonstrasikan kekuatan menggunakan mesin vektor dukungan dalam menyelesaikan masalah klasifikasi dengan menggunakan Alat Pembelajaran Mesin Support Vector yang tersedia di MQL5 Market. Deskripsi lengkap tentang masalah hipotetis ini dan skrip dapat ditemukan dalam artikel "Pembelajaran Mesin: Bagaimana Support Vector Machines Dapat Digunakan dalam Trading". Artikel ini mencakup panduan cara menggunakan skrip dan bagaimana masalah ini dapat memberikan wawasan tentang penggunaan pembelajaran mesin untuk menilai tren pasar.

Kode:

//+------------------------------------------------------------------+
//|                                                 Schnick_Demo.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Skrip ini menunjukkan kemampuan Alat Pembelajaran Mesin Support Vector
//|                     Machine Learning Tool
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Pernyataan berikut mengimpor semua fungsi yang termasuk dalam
//| alat mesin vektor dukungan 'svMachineTool.ex5'
//+------------------------------------------------------------------+
#import "svMachineTool_demo.ex5"
enum ENUM_TRADE {BUY,SELL};
enum ENUM_OPTION {OP_MEMORY,OP_MAXCYCLES,OP_TOLERANCE};
int  initSVMachine(void);
void setIndicatorHandles(int handle,int &indicatorHandles[],int offset,int N);
void setParameter(int handle,ENUM_OPTION option,double value);
bool genOutputs(int handle,ENUM_TRADE trade,int StopLoss,int TakeProfit,double duration);
bool genInputs(int handle);
bool setInputs(int handle,double &Inputs[],int nInputs);
bool setOutputs(int handle,bool &Outputs[]);
bool training(int handle);
bool classify(int handle);
bool classify(int handle,int offset);
bool classify(int handle,double &iput[]);
void deinitSVMachine(void);
#import
//--- Jumlah input yang akan kita gunakan untuk svm
int N_Inputs=7;
//+------------------------------------------------------------------+
//| Fungsi inisialisasi ahli                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   double inputs[];           //array double kosong yang akan digunakan untuk membuat input pelatihan
   bool   outputs[];          //array bool kosong yang akan digunakan untuk membuat input pelatihan
   int N_TrainingPoints=5000; //menentukan jumlah sampel pelatihan yang akan dihasilkan
   int N_TestPoints=5000     //menentukan jumlah sampel yang akan digunakan saat pengujian

   genTrainingData(inputs,outputs,N_TrainingPoints); //Menghasilkan input dan output yang akan digunakan untuk pelatihan svm

   int handle1=initSVMachine();             //menginisialisasi mesin vektor dukungan baru dan mengembalikan handle
   setInputs(handle1,inputs,7);             //mengoper input (tanpa kesalahan) ke mesin vektor dukungan
   setOutputs(handle1,outputs);             //mengoper output (tanpa kesalahan) ke mesin vektor dukungan
   setParameter(handle1,OP_TOLERANCE,0.01); //mengatur parameter toleransi kesalahan ke <5%
   training(handle1);                       //melatih mesin vektor dukungan menggunakan input/output yang diberikan

   insertRandomErrors(inputs,outputs,500);  //mengambil input/output asli yang dihasilkan dan menambahkan kesalahan acak ke data

   int handle2=initSVMachine();             //menginisialisasi mesin vektor dukungan baru dan mengembalikan handle
   setInputs(handle2,inputs,7);             //mengoper input (dengan kesalahan) ke mesin vektor dukungan
   setOutputs(handle2,outputs);             //mengoper output (dengan kesalahan) ke mesin vektor dukungan
   setParameter(handle2,OP_TOLERANCE,0.01); //mengatur parameter toleransi kesalahan ke <5%
   training(handle2);                       //melatih mesin vektor dukungan menggunakan input/output yang diberikan

   double t1=testSVM(handle1,N_TestPoints); //mengujicoba akurasi mesin vektor dukungan yang telah dilatih dan menyimpannya ke t1
   double t2=testSVM(handle2,N_TestPoints); //mengujicoba akurasi mesin vektor dukungan yang telah dilatih dan menyimpannya ke t2

   Print("Akurasi SVM adalah ",NormalizeDouble(t1,2),"% (menggunakan input/output pelatihan tanpa kesalahan)");
   Print("Akurasi SVM adalah ",NormalizeDouble(t2,2),"% (menggunakan input/output pelatihan dengan kesalahan)");
   deinitSVMachine(); //Membersihkan semua memori yang digunakan dalam menghasilkan SVM untuk menghindari kebocoran memori
   return(0);
  }
//+------------------------------------------------------------------+
//| Fungsi deinisialisasi ahli                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Tidak ada fungsi yang dieksekusi di OnDeinit()
  }
//+------------------------------------------------------------------+
//| Fungsi tick ahli                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Tidak ada fungsi yang dieksekusi di OnTick()   
  }
//+------------------------------------------------------------------+
//| Fungsi ini mengambil sifat pengamatan dari hewan yang diamati dan berdasarkan kriteria yang telah kita pilih, mengembalikan
//| true/false apakah itu schnick
//+------------------------------------------------------------------+
bool isItASchnick(double height,double weight,double N_legs,double N_eyes,double L_arm,double av_speed,double f_call)
  {
   if(height   < 1000  || height   > 1100)  return(false); //Jika tinggi berada di luar parameter > kembalikan(false)
   if(weight   < 40    || weight   > 50)    return(false); //Jika berat berada di luar parameter > kembalikan(false)
   if(N_legs   < 8     || N_legs   > 10)    return(false); //Jika N_Kaki berada di luar parameter > kembalikan(false)
   if(N_eyes   < 3     || N_eyes   > 4)     return(false); //Jika N_Mata berada di luar parameter > kembalikan(false)
   if(L_arm    < 400   || L_arm    > 450)   return(false); //Jika L_tangan  berada di luar parameter > kembalikan(false)
   if(av_speed < 2     || av_speed > 2.5)   return(false); //Jika kecepatan rata-rata berada di luar parameter > kembalikan(false)
   if(f_call   < 11000 || f_call   > 15000) return(false); //Jika f_call berada di luar parameter > kembalikan(false)
   return(true);                                           //Sebaliknya > kembalikan(true)
  }
//+------------------------------------------------------------------+
//| Fungsi ini mengambil array double kosong dan array boolean kosong
//| dan menghasilkan input/output yang akan digunakan untuk melatih SVM
//+------------------------------------------------------------------+ 
void genTrainingData(double &inputs[],bool &outputs[],int N)
  {
   double in[];                    //membuat array double kosong untuk digunakan
                                   //untuk menyimpan input yang dihasilkan sementara
   ArrayResize(in,N_Inputs);       //mengubah ukuran array in[] menjadi N_Inputs
   ArrayResize(inputs,N*N_Inputs); //mengubah ukuran array inputs[] menjadi N*N_Inputs
   ArrayResize(outputs,N);         //mengubah ukuran array outputs[] menjadi N
   for(int i=0;i<N;i++)
     {
      in[0]=    randBetween(980,1120);    //Input acak yang dihasilkan untuk tinggi
      in[1]=    randBetween(38,52);       //Input acak yang dihasilkan untuk berat
      in[2]=    randBetween(7,11);        //Input acak yang dihasilkan untuk N_kaki
      in[3]=    randBetween(3,4.2);       //Input acak yang dihasilkan untuk N_mata
      in[4]=    randBetween(380,450);     //Input acak yang dihasilkan untuk L_tangan
      in[5]=    randBetween(2,2.6);       //Input acak yang dihasilkan untuk kecepatan rata-rata
      in[6]=    randBetween(10500,15500); //Input acak yang dihasilkan untuk frekuensi panggilan

      //--- menyalin input acak baru yang dihasilkan ke dalam array input pelatihan
      ArrayCopy(inputs,in,i*N_Inputs,0,N_Inputs);
      //--- menilai input acak dan menentukan apakah itu schnick
      outputs[i]=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]);
   }
  }
//+------------------------------------------------------------------+
//| Fungsi ini mengambil handle untuk SVM yang telah dilatih dan menguji seberapa
//| suksesnya dalam mengklasifikasikan input acak baru
//+------------------------------------------------------------------+ 
double testSVM(int handle,int N)
  {
   double in[];
   int atrue=0;
   int afalse=0;
   int N_correct=0;
   bool Predicted_Output;
   bool Actual_Output;
   ArrayResize(in,N_Inputs);
   for(int i=0;i<N;i++)
     {
      in[0]=    randBetween(980,1120);    //Input acak yang dihasilkan untuk tinggi
      in[1]=    randBetween(38,52);       //Input acak yang dihasilkan untuk berat
      in[2]=    randBetween(7,11);        //Input acak yang dihasilkan untuk N_kaki
      in[3]=    randBetween(3,4.2);       //Input acak yang dihasilkan untuk N_mata
      in[4]=    randBetween(380,450);     //Input acak yang dihasilkan untuk L_tangan
      in[5]=    randBetween(2,2.6);       //Input acak yang dihasilkan untuk kecepatan rata-rata
      in[6]=    randBetween(10500,15500); //Input acak yang dihasilkan untuk frekuensi panggilan

      //--- menggunakan fungsi isItASchnick untuk menentukan output yang diinginkan
      Actual_Output=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]);
      //--- menggunakan SVM yang telah dilatih untuk mengembalikan output yang diprediksi.
      Predicted_Output=classify(handle,in);
      if(Actual_Output==Predicted_Output)
        {
         N_correct++; //Pernyataan ini menghitung jumlah kali output yang diprediksi benar.
        }
     }
//--- mengembalikan akurasi SVM yang telah dilatih dalam persentase
   return(100*((double)N_correct/(double)N));
  }
//+------------------------------------------------------------------+
//| Fungsi ini mengambil input pelatihan yang benar dan output yang dihasilkan
//| dan menyisipkan N kesalahan acak ke dalam data
//+------------------------------------------------------------------+ 
void insertRandomErrors(double &inputs[],bool &outputs[],int N)
  {
   int nTrainingPoints=ArraySize(outputs); //menghitung jumlah titik pelatihan
   int index;                              //membuat integer baru 'index'
   bool randomOutput;                      //membuat bool baru 'randomOutput'
   double in[];                            //membuat array double kosong untuk digunakan
                                           //untuk menyimpan input yang dihasilkan sementara
   ArrayResize(in,N_Inputs);               //mengubah ukuran array in[] menjadi N_Inputs
   for(int i=0;i<N;i++)
     {
      in[0]=    randBetween(980,1120);    //Input acak yang dihasilkan untuk tinggi
      in[1]=    randBetween(38,52);       //Input acak yang dihasilkan untuk berat
      in[2]=    randBetween(7,11);        //Input acak yang dihasilkan untuk N_kaki
      in[3]=    randBetween(3,4.2);       //Input acak yang dihasilkan untuk N_mata
      in[4]=    randBetween(380,450);     //Input acak yang dihasilkan untuk L_tangan
      in[5]=    randBetween(2,2.6);       //Input acak yang dihasilkan untuk kecepatan rata-rata
      in[6]=    randBetween(10500,15500); //Input acak yang dihasilkan untuk frekuensi panggilan

      //--- secara acak memilih salah satu dari input pelatihan untuk menyisipkan kesalahan
      index=(int)MathRound(randBetween(0,nTrainingPoints-1));
      //--- menghasilkan output boolean acak untuk digunakan dalam menciptakan kesalahan
      if(randBetween(0,1)>0.5) randomOutput=true;
      else                     randomOutput=false;

      //--- menyalin input acak baru yang dihasilkan ke dalam array input pelatihan
      ArrayCopy(inputs,in,index*N_Inputs,0,N_Inputs);
      //--- menyalin output acak baru yang dihasilkan ke dalam array output pelatihan
      outputs[index]=randomOutput;
     }
  }
//+------------------------------------------------------------------+
//| Fungsi ini digunakan untuk membuat nilai acak antara t1 dan t2
//+------------------------------------------------------------------+ 
double randBetween(double t1,double t2)
  {
   return((t2-t1)*((double)MathRand()/(double)32767)+t1);
  }
//+------------------------------------------------------------------+

Postingan terkait

Komentar (0)