Jumaat, 25 Oktober 2013

#81: period_converter script modification for MT4

period_converter script with feedback
Ambe telah detect bahawa terdapat masaalah dengan skrip asal period_converter dari terminal MT4. Ia skrip yang bagus dalam menjalankan kerja tapi tidak memberikan apa-apa feedback bila ia telah siap memproses data. Jadi, disini saya membuat sedikit modifikasi keatas skrip asal period_converter untuk memberikan feedback bila kerja-kerja pemprosesan data sudah siap. Feedback terus dicetak diatas chart sebelah atas kiri. Contoh teks ialah "Converting using 15 multiplier.." akan keluar dan sewaktu memproses data dan teks "Conversion done! 33989 records(s) written using 15 multiplier" akan keluar setelah kerja-kerja memproses data selesai. Ini adalah kod bagi skrip period_converter yang telah dimodifikasi:

//+------------------------------------------------------------------+
//|                                             Period_Converter.mq4 |
//|                 Copyright © 2005-2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property show_inputs
#include <WinUser32.mqh>

extern int ExtPeriodMultiplier=3; // new period multiplier factor
int        ExtHandle=-1;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   Comment("Converting using " + ExtPeriodMultiplier + " multiplier...");
   int    i, start_pos, i_time, time0, last_fpos, periodseconds;
   double d_open, d_low, d_high, d_close, d_volume, last_volume;
   int    hwnd=0,cnt=0;
//---- History header
   int    version=400;
   string c_copyright;
   string c_symbol=Symbol();
   int    i_period=Period()*ExtPeriodMultiplier;
   int    i_digits=Digits;
   int    i_unused[13];
//---- 
   ExtHandle=FileOpenHistory(c_symbol+i_period+".hst", FILE_BIN|FILE_WRITE);
   if(ExtHandle < 0) return(-1);
//---- write history file header
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   FileWriteInteger(ExtHandle, version, LONG_VALUE);
   FileWriteString(ExtHandle, c_copyright, 64);
   FileWriteString(ExtHandle, c_symbol, 12);
   FileWriteInteger(ExtHandle, i_period, LONG_VALUE);
   FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //timesign
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //last_sync
   FileWriteArray(ExtHandle, i_unused, 0, 13);
//---- write history file
   periodseconds=i_period*60;
   start_pos=Bars-1;
   d_open=Open[start_pos];
   d_low=Low[start_pos];
   d_high=High[start_pos];
   d_volume=Volume[start_pos];
   //---- normalize open time
   i_time=Time[start_pos]/periodseconds;
   i_time*=periodseconds;
   for(i=start_pos-1;i>=0; i--)
     {
      time0=Time[i];
      //---- history may be updated
      if(i==0)
        {
         //---- modify index if history was updated
         if(RefreshRates())
            i=iBarShift(NULL,0,time0);
        }
      //----
      if(time0>=i_time+periodseconds || i==0)
        {
         if(i==0 && time0<i_time+periodseconds)
           {
            d_volume+=Volume[0];
            if (Low[0]<d_low)   d_low=Low[0];
            if (High[0]>d_high) d_high=High[0];
            d_close=Close[0];
           }
         last_fpos=FileTell(ExtHandle);
         last_volume=Volume[i];
         FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
         FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
         FileFlush(ExtHandle);
         cnt++;
         if(time0>=i_time+periodseconds)
           {
            i_time=time0/periodseconds;
            i_time*=periodseconds;
            d_open=Open[i];
            d_low=Low[i];
            d_high=High[i];
            d_close=Close[i];
            d_volume=last_volume;
           }
        }
       else
        {
         d_volume+=Volume[i];
         if (Low[i]<d_low)   d_low=Low[i];
         if (High[i]>d_high) d_high=High[i];
         d_close=Close[i];
        }
     }
   FileFlush(ExtHandle);
   Comment("Conversion done! "+cnt+" record(s) written using "+ ExtPeriodMultiplier +" multiplier");
   Print(cnt," record(s) written");
//---- collect incoming ticks
   int last_time=LocalTime()-5;
   while(IsStopped()==false)
     {
      int cur_time=LocalTime();
      //---- check for new rates
      if(RefreshRates())
        {
         time0=Time[0];
         FileSeek(ExtHandle,last_fpos,SEEK_SET);
         //---- is there current bar?
         if(time0<i_time+periodseconds)
           {
            d_volume+=Volume[0]-last_volume;
            last_volume=Volume[0];
            if (Low[0]<d_low) d_low=Low[0];
            if (High[0]>d_high) d_high=High[0];
            d_close=Close[0];
           }
         else
           {
            //---- no, there is new bar
            d_volume+=Volume[1]-last_volume;
            if (Low[1]<d_low) d_low=Low[1];
            if (High[1]>d_high) d_high=High[1];
            //---- write previous bar remains
            FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
            FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
            last_fpos=FileTell(ExtHandle);
            //----
            i_time=time0/periodseconds;
            i_time*=periodseconds;
            d_open=Open[0];
            d_low=Low[0];
            d_high=High[0];
            d_close=Close[0];
            d_volume=Volume[0];
            last_volume=d_volume;
           }
         //----
         FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
         FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
         FileFlush(ExtHandle);
         //----
         if(hwnd==0)
           {
            hwnd=WindowHandle(Symbol(),i_period);
            if(hwnd!=0) Print("Chart window detected");
           }
         //---- refresh window not frequently than 1 time in 2 seconds
         if(hwnd!=0 && cur_time-last_time>=2)
           {
            PostMessageA(hwnd,WM_COMMAND,33324,0);
            last_time=cur_time;
           }
        }
      Sleep(50);
     }     
//----
  
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void deinit()
  {
   if(ExtHandle>=0) { FileClose(ExtHandle); ExtHandle=-1; }
  }
//+------------------------------------------------------------------+

Khamis, 24 Oktober 2013

#80: Mencapai 90% Modelling Quality dalam Strategy Tester MT4

The worst: Modelling Quality not available
Modelling Quality dalam pengujian Expert Advisor menjadi satu kayu ukur untuk hasil keputusan report yang berkualiti. Sudah kerap kali ambe mencuba fungsi Strategy Tester didalam terminal MT4 tetapi jarang sangat boleh dapat report yang bermakna. Seperti gambar disebelah, Modelling Quality n/a (not available).

So sekarang ambe akan tunjukkan cara untuk memastikan Strategy Tester didalam MT4 akan mencapai sekurang-kurangnya 90% modelling quality. Modelling adalah dengan menggunakan data-data ticks dari masa lalu (History Center) bagi period M1, M5, M15, M30, H1, H4, D1, W1 dan MN.

Preparation yang pertama adalah download file history data M1 di mana-mana sumber yang anda mahu. Seperti ambe, ambe download dari FXDD. Broker-broker lain seperti Alpari juga ada menyediakan resource yang sama. Anda boleh download data M1 dari FXDD dengan klik link ini. Pilih currency pair yang anda ingin gunakan dan terus download. Ia adalah file HST yang dicompress kedalam file ZIP. Selepas download, anda boleh terus uncompress file ini dengan aplikasi 7zip. File HST selepas diuncompressed biasanya bersaiz 130MB dan menyimpan lebih 2 juta data ticks.

Selepas uncompressed, anda perlu prepare terminal MT4 pula. Buka kekunci Ctrl+O untuk membuka Options. Kemudian pilih tab Charts. Di ruang "Max bars in chart", letakkan nilai maksimum. Ambe letakkan ruang itu dengan 9999999999999. Klik OK. Kemudian buka History Center dengan klik pada menu Tools dan pilih History Center (atau tekan kekunci F2). Disini, anda perlu double klik pada currency pair yang anda telah download tadi dan double klik sekali lagi pada 1 Minute (M1) seperti dibawah.

MT4 History Center
Selepas itu, anda perlu tekan button Import dan mula import file HST yang telah anda uncompressed sekejap tadi. Tekan button Close. Sekarang anda telah ada data M1 yang berkualiti! Anda boleh lihat data ini dengan membuka chart baru bagi currency pair yang anda pilih tadi dan pilih chart M1 dan chart M1 anda telah sedia ada data yang banyak. Bagaimana pula dengan chart M5, M15, H1, H4 dan seterusnya?

Sebenarnya anda boleh menggunakan data M1 bagi mendapatkan data M5, M15, M30 dan seterusnya. Anda hanya perlu convert data M1 untuk mendapatkan data bagi period yang seterusnya. Dengan bantuan skrip yang datang bersama MT4, kerja-kerja untuk convert data M1 kepada M5, M15, M30 dan seterusnya menjadi amat mudah.

Navigator window in MT4
Pertama sekali, buka chart currency pair yang anda telah tambah dalam History Center tadi dan pilih M1. Di sebelah kiri window MT4 terdapat satu window kecil dengan nama "Navigator". Double klik pada "Scripts" dan anda akan dapat lihat satu skrip bernama "period_converter" disitu. Skrip inilah yang akan menukar data M1 anda kepada period yang anda mahukan.

Untuk menggunakan skrip ini hanya perlu double klik diatas "period_converter" dan satu window akan keluar. Pilih tab "Inputs". Disitu anda akan setkan berapakah period yang ingin anda tukarkan data M1 anda kepada. Setkan di variable ExtPeriodMultiplier dalam unit minit contohnya nilai 5 untuk tukar kepada 5 minit (M15), 15 untuk 15 minit (M15) 60 untuk 1 jam (H1), 1440 untuk 1 hari (D1) dan seterusnya. Dengan cara ini anda boleh mendapatkan kesemua data dari M5, M15, M30, H1, H4, D1, W1 hingga MN.

Setelah anda letakkan nilai yang sesuai untuk ExtPeriodMultiplier, anda hanya perlu tekan OK dan skrip ini akan mula memproses data. Berikanlah masa 30 saat hingga 1 minit untuk pemprosesan kerana skrip ini tidak memberikan feedback setelah kerja-kerja conversion selesai. Tidak perlu terlalu gopoh atau mungkin anda akan kehilangan ticks yang tak sempat diproses. Selepas 30 saat hingga 1 minit, bagi meneruskan dengan period baru, anda perlu run semula skrip yang sama. Di waktu ini, anda akan ditanya samaada untuk menghentikan skrip. Anda boleh hentikan skrip ini dan teruskan dengan pemprosesan seterusnya.

Setelah mempunyai data-data yang berkualiti, anda boleh teruskan dengan Strategy Tester. Pilih currency pair dan period yang telah anda proses tadi. Setelah itu, mengikuti langkah-langkah ini, anda akan dapati Modelling Quality bagi Strategy Tester anda akan mencapai lebih dari 90% hingga 100%. Selamat berstrategy testing!

Jumaat, 18 Oktober 2013

#79: Another Recently Developed Film I Exposed 2-3 Years Ago

My younger brother and cousins
My cousin, Rizal. He work as IT Technician in Bachok, Kelantan
My younger brother, Udin.
Tree trunk
My nephews and in-laws
My old Holga camera
My younger brother Udin holding Squire Telecaster California Series electric guitar

Khamis, 3 Oktober 2013

#77: Knowledge of the deep understanding of things

Ambe suka filem sains fiksyen. Saintis yang gila-gila mencipta banyak alat-alat yang pelik. Banyak filem di luar sana seperti filem Flubber dan Back To The Future mengetengahkan saintis. Tapi kebanyakannya tidak scientifically accurate. Jelly boleh menari, kereta merentas masa pada 88 batu/jam, adalah filem berkaitan saintis yang secara entertainment yang sangat menarik tapi secara saintifik tidak tepat. Tapi baru-baru ini ambe ada mengikuti satu drama bersiri berkenaan seorang Chemist (ahli kimia/saintis kimia) iaitu drama bersiri Breaking Bad.

Walter White and Jesse Pinkman
Ambe kurang meminati menonton filem bersiri kerana mempunyai banyak episod dan ambe perlukan satu reason yang kuat untuk mula menonton filem bersiri baru. Ambe find out mengenai filem bersiri ini melalui laman IMDB (Internet Movie DataBase) setelah mendapati filem bersiri Breaking Bad ini mendapat rating yang sangat memuaskan di laman itu (tak silap ambe ketika itu ratingnya 9.8/10). Ambe lambat jumpa filem bersiri ini kerana sewaktu pertama kali melihatnya, ia sudah pada season 5 iaitu season terakhir Breaking Bad.

Walter White aka "Heisenberg"
Filem bersiri ini mengisahkan tentang seorang chemist yang overqualified berkerja sebagai cikgu kimia di sebuah sekolah menengah tahu bahawa dia mengidap kanser tahap 3. Beliau overqualified kerana beliau sebenarnya seorang saintis kimia yang hebat, pernah bekerja dengan rakan-rakan syarikat yang beliau sendiri letakkan nama Grey Matter sehingga mendapat hadiah Nobel dalam Chemistry. Tetapi atas masaalah peribadi, beliau menarik diri dari Grey Matter dengan mendapat tebusan 5000 dollar. Grey Matter kemudian menjadi satu syarikat yang berjaya hingga bernilai berbillion dollar sedangkan Walter hanya bekerja sebagai cikgu di sekolah menengah.

Walter baru mengetahui beliau mempunyai penyakit kanser dan dengan gaji sebagai cikgu yang tak seberapa beliau mula membanyangkan krisis kewangan untuk rawatan dan jika beliau tidak dapat melawan penyakit kanser ini, apakah aset yang beliau akan tinggalkan untuk membantu keluarganya menampung kehidupan tanpa adanya disisi. Disitulah bermulanya kisah mengenai Walter White ingin mencari jalan untuk mendapatkan wang secukupnya dalam tempoh yang singkat sebelum beliau mati akibat kanser. Cara beliau untuk mendapatkan wang dengan cepat ialah dengan membuat dadah Methamphetamine yang paling pure dan berkualiti dipasaran gelap! 

Character development untuk Walter White sangat bagus. Permulaan filem bersiri ini beliau adalah seorang lelaki yang nampak pemalu, pendiam, ayah yang baik, penyayang dan lain-lain. Setelah berkecimpung dalam pembuatan dadah, beliau mula berubah menjadi seorang yang tegas, hati kering, pemarah, tamak dan dalam masa yang sama tetap menjadi seorang ayah dan suami yang penyayang.

Gustavo, Walter & Jesse
Pada awal siri filem ini, ambe ada mengajak isteri ambe ikut tonton sekali filem ini. Tapi lama-kelamaan ambe rasa filem ni terlalu berat untuk ditonton. Terlalu ganas walaupun untuk ambe sendiri tonton. Ia filem yang brilliant, contohnya membuat bom kristal, bateri dengan teknik electrolysis etc seperti filem ala MacGyver, tapi disamping itu juga sangat ganas seperti menghapuskan bukti mayat dengan menghancurkan mayat dengan asid, hapus mayat dewasa, hapus mayat kanak-kanak, bagi racun pada kanak-kanak, kanak-kanak jual dadah etc.

Ia filem bersiri tentang transformasi dari seorang yang lemah kepada seorang penakluk empayar dadah yang bertembung dengan empayar dadah lain dan dalam masa yang sama menyembunyikan semua ini dari pengetahuan ahli keluarga beliau. Ia juga filem tentang moral-bankruptcy atau filem pengajaran moral kerana di akhir filem ini anda akan dapati wang tidak ada nilai lagi tetapi apa yang lebih penting adalah semua selain wang. Pendapat ambe sahaja..

Jesse dan Walter menunggu blue meth mengeras.
Bidang Chemistry bagi ambe adalah knowledge of the deep understanding of things. Ambe agak sedih kerana siri Breaking Bad ini hanya setakat 5 season. Breaking Bad setakat ini adalah antara filem bersiri yang paling ambe sukai. Highly recommended but you must have a strong gut to watch this awesome TV series!

Rabu, 2 Oktober 2013

#76: Use Tor as proxy in MetaTrader

Ambe baru dapat find out yang sebenarnya MT4 client boleh guna bersama TOR (TOR Onion Router) untuk mendapatkan connection dalam network anonymity. Tak kiralah apapun sebab kenapa anda mahu menggunakan MT4 bersama TOR, tapi ia boleh dilakukan dengan menyambung MT4 kepada proxy server TOR seperti untuk menggunakan Google Chrome dengan TOR. Anda perlu mendapatkan berapakah IP dan nombor Port dalam setting TOR anda (yang boleh didapati dari setting TorBrowser) dan menggunakan IP serta nombor Port yang sama didalam client MT4 anda. Untuk melihat berapakah IP dan Port anda di Tor Browser, anda boleh rujuk di menu TorBrowser > Options > Advance > Network > Connection dan klik button Settings.

This is where you know your TOR SOCKS Host and Port number
Catit IP SOCK Host dan nombor Port untuk rujukan dan pasang aplikasi MT4 yang anda ingin gunakan bersama TOR. Sekarang, pergi ke menu Tools > Options (atau Ctrl+O) di tab "Server" klik "Enable proxy" untuk membolehkan MT4 menggunakan ciri-ciri proxy. Kemudian klik button "Proxy" selepas itu masukkan IP SOCK Host yang anda catat tadi diikuti dengan tanda titik bertindih dan nombor Port (eg 127.0.0.1:9050). Pilih juga setting SOCKS5. Untuk menguji connection proxy telah berjaya, anda boleh klik button "Test". Jika ujian memberi keputusan ok, taniah kerana anda telah berjaya bersambung dengan TOR melalui MT4! Happy Trading!

Test passes ok! Happy trading!

#75: Inkscape, an OpenSource Alternative to Adobe Illustrator

Inkscape 0.48. Behind the scene of my poster design.