Rabu, 20 April 2011

Technical Error

Pak Ary,

Sembari menunggu hasil Vito EA, ada yang ingin saya tanyakan mengenai masalah operasional EA. Ini bukan masalah coding atau algoritma, tapi saya mengalami masalah teknis dalam menjalankan EA saat forward test pada demo account. Saya harap ini tidak mengganggu aktifitas Pak Ary.

Singkat cerita, EA saya sering tidak melakukan ordersend() dimana semua kondisi sudah terpenuhi padahal sebelum dan sesudahnya EA masih melakukan ordersend(). Menurut Pak Ary yang sudah berpengalaman dengan testing forward EA, apa yang terjadi dengan kasus saya ini? Saya menggunakan FX Open Demo Account, apakah server demo account pada broker ini bermasalah?

Sekedar informasi tambahan, saat membuat demo account, ping yang saya peroleh mencapai angka lebih dari 1500ms. Saya sempat curiga dengan koneksi internet, tapi streaming radio (bahkan sembari streaming live video) dan browsing tetap berjalan lancar, jadi ini berarti koneksi internet saya tidak bermasalah. Koneksi MetaTrader pun tidak mengalami masalah. Warna koneksi pada bar Connection Status adalah hijau biru (sebenarnya saya belum ngerti apa beda koneksi antara hijau biru dan hijau merah).

Ada kecurigaan bahwa memory komputer bermasalah, tapi tampaknya tidak terbukti lantaran beban memory terminal.exe hanya menghabiskan lebih kurang 27 MB dari total memori sebesar 2 GB. Sisa memori komputer lebih dari 50%. Beberapa waktu lalu saat melakukan backtest (sempat memakan waktu lebih dari 5 jam) memang membuat komputer menjadi lemot. Tapi untuk kali ini, saya melakukan forward test tanpa dibarengi dengan backtest. Artinya, memori seharusnya tidak menjadi masalah juga.

Wah, saya benar-benar bingung luar binasa, Pak. Sempat rasa putus asa muncul kembali sehingga sekilas terpikir untuk berhenti saja, tapi kemudian saya teringat pesan seseorang. Apa gak terbuang sia-sia waktu yang telah digunakan selama ini untuk merancang program jika pada akhirnya menyerah? Mungkin saja saya hanya butuh beberapa langkah lagi. Trims, Pak. :) Andalah yang mengingatkan saya.

Kembali ke masalah teknis. Hal berikutnya yang membuat cukup pusing adalah hasil backtest yang selama ini saya lakukan selalu berakhir dengan hasil yang sangat buruk. Saya berasumsi, pasti ada yang gak beres dengan sistem backtest ini.

Asumsi saya tadi tidak salah, setelah result dari backtest saya cocokkan dengan chart (dan logika program), ternyata memang benar ada order yang tidak terbuka disaat seharusnya terbuka, dan yang paling menarik adalah order yang seharusnya tidak terbuka malah terbuka. Apakah karena kasus diatas itu yang membuat hasil backtest selama ini buruk?

Terlepas dari semuanya, saya puas karena mengerti bahwa backtest yang selama ini saya lakukan ternyata 'bodong'. Artinya, bisa saja algoritma terdahulu saya sebenarnya baik tapi karena saya meyakini hasil backtest, maka ide tersebut buru-buru saya tinggalkan tanpa melakukan forward test lebih dalam lagi. Saya bergumam dalam hati: "dalam forward test saja terjadi masalah missed order seperti ini, apalagi dalam backtest yang cuma mengandalkan history market".

Semoga Pak Ary dapat memberikan jawaban dan solusi untuk masalah saya ini. Mohon bantuannya, Pak Ary. Terima kasih banyak untuk perhatiannya.

Regards,
Aras




Pak Aras,

Pengkodean Metatrader sangatlah efisien sehingga memerlukan hanya sedikit memory untuk mengoperasikannya. Justru terkadang custom indicators yang pengkodeannya tidak efisien membuat memory yang dibutuhkan oleh Metatrader menjadi meningkat.

Tingginya nilai ping pun bukanlah penyebab order tidak tereksekusi. Nilai ping yang tinggi hanyalah akan menyebabkan terjadinya delay pada saat eksekusi. Order tetap akan terjadi tetapi dengan jeda dan tidak seketika.

Kemungkinan besar problem yang dialami dikarenakan Pak Aras menggunakan bar-0 sebagai patokan eksekusi order. Karena bar-0 masih berubah-ubah maka akibatnya kadang kala order tereksekusi dan kadang tidak.

Sebagai contoh:

if( iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0) > iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0) )
{
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,30,0,0,"BuyOrder #1",0,0,Green);

}

Bila eksekusi order dilakukan seperti diatas yaitu berpatokan pada bar-0 maka akan terjadi kekacauan seperti yang Pak Aras alami.

Seharusnya adalah sebagai berikut:

Print("Test 1");
if( iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,2) < iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,2) )
{
Print("Test 2");
if( iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1) > iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1) )
{

ticket=OrderSend(Symbol(),OP_BUY,1,Ask,30,0,0,"BuyOrder #1",0,0,Green);

Print("Test 3");

}
}

Kode diatas menunjukkan bahwa patokan eksekusi berdasarkan bar-2 dan bar-1, bukan bar-0. Disamping itu ditambahkan fungsi Print untuk memudahkan trasir apabila kode mengalami kesalahan.

Pemprograman memerlukan kesabaran dan ketelatenan. Hasil akhir yang baik tidak akan dapat diperoleh kalau mudah putus asa dan mudah menyerah.

Semoga artikel ini dapat membantu Pak Aras.

Tidak ada komentar:

Poskan Komentar