Mari kita belajar sama-sama cara membuat EA, supaya trader Indonesia dihormati dan dihargai oleh dunia. Saat ini di Championsip EA cuma ada 7 EA buatan trader Indonesia (termasuk buatan master dpkforex dari forum IndoMT5 ini). Tahun depan harus ada 10 trader tambahan dari Indonesia ya? termasuk buatan saya. Ayo semangat
Ide-nya saya ambil dari thread di Forum ini juga yaitu buatan bro pantang_merah.
http://indo.mt5.com/showthread.php?8...isi-dengan-SMA
Kita santai aja ya, kalau ada yang mau bertanya silakan diposting disini. Master EA yang lain dimohon turut membantu memberikan arahan.Spoiler:
=================================================
Buat template dulu
Pertama kali, pahami dulu konsep trading yang akan dibuat. Pahami dari si pembuat konsep:
- Indikator apa yang digunakan ?
- Bagaimana OP ke dalam market ?
- Bagaimana cara exit ?
Setelah membaca dan paham, kita bisa mulai start membuat coding dalam bahasa MQL-nya.
Tapi pertama kali, hal yang penting adalah membuat template-nya dulu.Spoiler:
Dalam gambar di atas, saya membuat chart yang berisi indikator-indikator yang akan digunakan. Lalu saya simpan ke dalam template chart. Karena sistem ini menggunakan 2 buah SMA, maka templatenya saya namakan 2sma.
Template yang dibuat ini akan kita pakai berkali-kali ketika melakukan backtesting. Maka pembuatan template ini merupakan hal penting yang harus dillakukan pertama kali oleh seorang EA Coder.
==================================
Membuat Coding, Mengaktifkan Strategy Tester dan Backtesting.
Coding paling sederhana, dan yang mengekpresikan narsisme kita sebagai EA Coder adalah menampilkan nama kita sebagai pembuat EA di ujung kiri atas.
Kita masukkan comment di dalam int start()
Kenapa diletakkan disini ? PERHATIKAN bahwa setiap ada tick di dalam chart, maka fungsi int start() akan dijalankan. EA berjalan karena ada tick. Dan setiap ada tick, start() akan dipanggil !!. Pahami ini sebagai dasar pemrograman EA.Spoiler:
Ini adalah program kita yang paling sederhana. Baiklah, kita save dan kita compile. Kalau program tidak ada kesalahan error, maka akan tampak seperti pada gambar.Spoiler:
Sekarang kita akan test program ini lewat Strategy Tester. Buka window Strategy Tester :Spoiler:
Maka akan terbuka Strategy Tester di bagian bawah. Inilah window yang legendaris untuk melakukan BACKTESTING.Spoiler:
Isikan nama file EA yang kita buat yaitu EA2sma.
Masukkan Pair dan Time Frame sesuai konsep trading, yaitu GBPUSD 1H
Jika sudah, klik start.
Ketika chart mulai menjalankan simulasi, pada chartnya hanya ada chandlestick kosong. Tidak ada indikator.
Maka kita load template 2sma yang tadi kita simpan. Hasilnya adalah seperti ini :Spoiler:
Code pertama kita, yaitu menampilkan nama di pojok kiri atas sudah selesai.
Mari kita mulai masuk ke coding sistem trading yang ingin kita buat.
============================================
Mulai Coding
Kita mulai coding di Meta Editor.
Parameter apa saja yang sudah kita ketahui ?. Pertama kali kita masukkan SL, TP dan Slippage di dalam code. Dan karena periode dari indikator-indikatornya sudah ada, maka kita masukkan juga.
Di dalam pembahasan thread bro pantang_merah, tidak ada nilai SL dan TP. Karena itu saya tetapkan SL 30 pip dan TP juga 30 pip. Angka slippage standar adalah 3 pip.Lalu kita masukkan function Moving Average di dalam coding EA.Code://+------------------------------------------------------------------+ //| EA2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 30; extern int SMA1Periode = 4; extern int SMA2Periode = 8;Variable dMA1 dan dMA2 harus kita perkenalkan (declare) dulu ke dalam program. Jadi ada 2 variabel yang saya buat yaitu dMA1 dan dMA2. Huruf "d" di depan variabel dMA1 adalah kebiasaan para programmer C/C++ untuk mengingatkan bahwa variabel ini bertype double.Code:int start() { //---- double dMA1, dMA2; Comment("EA 2SMA (c) Dwi M"); dMA1=iMA(NULL,0,SMA1Periode,0,MODE_SMA,PRICE_CLOSE,0); dMA1=iMA(NULL,0,SMA2Periode,0,MODE_SMA,PRICE_CLOSE,0); //---- return(0); }
Kenapa bertype double ? Ya sebab dMA1 dan dMA2 akan menyimpan nilai price dimana MA itu berada. Jadi yang disimpan misalnya angka 1.9768. Maka perlu tipe data double.
Kita lihat function Moving Average.
double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Di atas adalah standar masukan untuk function MA. Jadi kita masukkan simbol, timeframe, periode, ma_shif, method dan seterusnya. Coba lihat function yang saya isikan. Karena Periode dari SMA ini sudah saya letakkan di atas sana, maka tinggal dimasukkan saja ke dalam coding.
iMA(NULL,0,SMA1Periode,0,MODE_SMA,PRICE_CLOSE,0)
=====================================================
Logika dari MA yang berpotongan
Perhatikan gambar di bawah ini. Kita akan membuat coding dari proses MA yang berpotongan. Bagaimana caranya program tahu bahwa sebuah MA terjadi perpotongan ?Spoiler:
Lihat di titik candle 1 : MA 4 yang berwarna merah terletak di bawah dari MA 8.
Lihat di titik candle 2 : MA 4 sudah berada di atas MA 8.
Perhatikan function iMA ini --> double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Ada parameter int shift yang penting disini. Kalau shift diisi 0, maka itu akan mengambil nilai candle sekarang. Kalau diisi 1, akan mengambil nilai MA dari 1 candle sebelumnya. Kalau diisi 2, akan mengambil nilai MA dari 2 candle sebelumnya. Demikian seterusnya.
Kalau dibuatkan logika-nya, kita akan tahu telah terjadi perpotongan MA jika berlaku seperti ini :
(MA4 shift 0 > MA8 shift 0) DAN (MA4 shift 1 < MA8 shift 1)
Harap ini direnungkan, terutama yang belum pernah membuat program komputer.
OK, dari logika di atas ternyata kita butuh 4 variabel iMA. Dua variabel untuk mendeteksi nilai MA saat ini, dan 2 variabel untuk mendeteksi nilai MA pada 1 candle di belakang.Maka nanti di dalam program, kita akan melakukan BUY jika MA1 memotong MA2 dari bawah ke atas. Kita akan melakukan SELL jika MA1 memotong MA2 dari atas ke bawah.Code:int start() { //---- double dMA1, dMA2, dMA1before, dMA2before; Comment("EA 2SMA (c) Dwi M"); dMA1=iMA(NULL,0,SMA1Periode,0,MODE_SMA,PRICE_CLOSE,0); // untuk mendeteksi candle saat ini dMA1=iMA(NULL,0,SMA2Periode,0,MODE_SMA,PRICE_CLOSE,0); // shift diisi 0 dMA1before=iMA(NULL,0,SMA1Periode,0,MODE_SMA,PRICE_CLOSE,1); // untuk mendeteksi satu candle sebelumnya dMA1before=iMA(NULL,0,SMA2Periode,0,MODE_SMA,PRICE_CLOSE,1); // shift diisi 1 //---- return(0); }Code:if ( (dMA1 > dMA2) && (dMA1before < dMA2before) ) // memotong dari bawah ke atas { // Lakukan perintah BUY disini } else if ( (dMA1 < dMA2) && (dMA1before > dMA2before) ) // memotong dari atas ke bawah { // Lakukan perintah SELL disini }
** istirahat bentar ah **
==========================================
Perintah BUY dan SELL
Sekarang kita akan masuk ke perintah BUY dan SELL.
Menurut panduan, function BUY dan SELL memakai kode OrderSend() dengan format di bawah ini :int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Jika kita meminta EA memasukkan sell/buy sebesar 1.0 lot, maka perintah OrderSend() pada kasus coding kita adalah sebagai berikut :
Perintah BUY : OrderSend(Symbol(),OP_BUY, 1.0, Ask, Slippage,Bid-StopLoss*Point, Ask+TakeProfit*Point, 0);
Perintah SELL : OrderSend(Symbol(),OP_SELL, 1.0, Bid, Slippage, Ask+StopLoss*Point, Bid-TakeProfit*Point, 0);
Kita akan melihat coding lebih lengkap di bawah ini.Code:if(OrdersTotal()<1) // cuma boleh ada satu OP pada satu saat saja { if ( (dMA1 > dMA2) && (dMA1before < dMA2before) ) // memotong dari bawah ke atas { // Lakukan perintah BUY disini OrderSend(Symbol(),OP_BUY, 1.0, Ask, Slippage,Bid-StopLoss*Profit, Ask+TakeProfit*Point, 0); } else if ( (dMA1 < dMA2) && (dMA1before > dMA2before) ) // memotong dari atas ke bawah { // Lakukan perintah SELL disini OrderSend(Symbol(),OP_SELL, 1.0, Bid, Slippage, Ask+StopLoss*Profit, Bid-TakeProfit*Point, 0); } }
Last edited by DwiM; 10-10-2010 at 01:41 PM.
=========================================================
Code Complete dan backtesting
Baiklah kita gabungkan semua code kita diatas.
Ups, di atas saya melakukan kesalahan coding. Slippage saya tulis 30 , error itu sudah biasa lah. Yang penting segera diperbaiki. Slippage yang wajar adalah 3. Di bawah ini code complete dari EA sederhana kita.Lalu kita lakukan backtesting dengan strategy tester seperti dijelaskan di depan tadi.Code://+------------------------------------------------------------------+ //| EA 2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int SMA1Periode = 4; extern int SMA2Periode = 8; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double dSMA1, dSMA2, dSMA1before, dSMA2before; dSMA1=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA2=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA1before=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,1); dSMA2before=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,1); if (OrdersTotal()<1) { if (AccountFreeMargin()<1000*Lots) { Comment("EA tidak bekerja, dana kurang :", AccountFreeMargin()); return(0);} if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } if ((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); } } //---- return(0); } //+------------------------------------------------------------------+Spoiler:
Hasil akhir grafik backtesting adalah :Spoiler:
Hasil test di atas, walau grafik-nya terlihat menurun (Loss) bukan berarti strategy tradingnya salah. Tidak boleh kita cepat-cepat mengambil kesimpulan seperti itu. Ada perbedaan mendasar antara trading manual dan trading EA.
Pada kode EA, kita memasukkan SL 30 pip dan TP 30 pip. Padahal master pantang_merah yang menciptakan sistem ini mungkin melakukan exit ketika MA kembali berpotongan pada arah yang beda. Maka disini kita harus memperbaiki logic programming kita menyesuiakan trading yang sebenarnya.Spoiler:
Sampai disini kita akan mulai tanya jawab ya. Ke depan kita akan bahas coding-coding penyempurna seperti trailing stop, locking atau Close Order jika MA kembali berpotongan dari arah berlawanan.
==========================================
Membuat Fungsi Trailing Stop
Sambil menanti pertanyaan-pertanyaan yang akan masuk, kita coba lanjut sebentar dengan membuat fungsi Trailing Stop. Ini sekalian menjawab pertanyaan bro toni17 di thread sebelah, dan bagaimana menambahkan pilihan TRUE atau FALSE untuk mengaktifkan dan mematikan Trailing Stop di EA buatan kita.
Kita tambahkan dulu deklarasi bool Trailing=true di atas coding.Perlu diperhatikan, deklarasi variabel yang menggunakan extern , nantinya bisa diubah oleh user EA kita ketika EA ini di attach ke chart. Gambarnya seperti ini :Code:extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int TrailingStop = 5; extern bool Trailing = true; extern int SMA1Periode = 4; extern int SMA2Periode = 8;Spoiler:
Kode Trailing saya jembreng langsung di bawah ini. Silakan saya beri waktu untuk merenungkan jalan pemikiran dari coding ini. Kalau ada yang bingung, kita bahas saja di tanya jawab nanti.Hasil akhirnya ketika di backtester, akan kita lihat Trailing Stop ini akan menggeser SL ketika nilai profit semakin naik.Code:/* >>> Fungsi Trailing Stop <<< */ if(Trailing==true) { for(iTrade=0;iTrade<OrdersTotal();iTrade++) { OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else { if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } }Spoiler:
Code Complete dari EA 2sma yang sudah ditambahkan Fungsi TrailingStop adalah di bawah ini. Silakan teman-teman mengcompile code ini di Meta Editornya dan silakan test di strategy tester masing-masing.
Tanya jawab dibuka lagi nih..Code://+------------------------------------------------------------------+ //| EA 2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int TrailingStop = 5; extern bool Trailing = true; extern int SMA1Periode = 4; extern int SMA2Periode = 8; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double dSMA1, dSMA2, dSMA1before, dSMA2before; int iTrade=0; dSMA1=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA2=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA1before=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,1); dSMA2before=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,1); Comment("EA 2SMA \n"+ "System : pantang_merah \n"+ "Coding : DwiM ea@dwim.web.id \n"+ "http://ea.dwim.web.id"); if (OrdersTotal()<1) { if (AccountFreeMargin()<1000*Lots) { Comment("EA tidak bekerja, dana kurang :", AccountFreeMargin()); return(0);} if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } if ((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); } } /* >>> Fungsi Trailing Stop <<< */ if(Trailing==true) { for(iTrade=0;iTrade<OrdersTotal();iTrade++) { OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else { if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } //---- return(0); } //+------------------------------------------------------------------+
Last edited by DwiM; 11-27-2010 at 08:24 PM.
======================================================
Close Order dan Konfirmasi RSI.
Studi Kasus tentang pembuatan EA sederhana akan saya akhiri dengan posting ini. Selanjutnya thread tetap dibuka untuk pembahasan tanya jawab. Belajar EA tidak pernah berakhir, tapi diharapkan dengan dasar yang secuprit tadi bisa membuka sedikit minat untuk mengoprek EA.
Di awal kita belajar melakukan OP dengan sinyal dari MA yang saling berpotongan. Bagaimana jika TP belum tersentuh namun MA kembali berpotongan dari arah berlawanan ? Seharusnya pada kondisi ini kita melakukan Close Order.
Functionnya adalah sbb : bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
Kita hanya perlu membalik logika perpotongan MA tadi, dengan coding di bawah ini untuk menutup Order.
Menutup Order BUYMenutup Order SELLCode:if((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet); }Kita nanti akan bersama-sama melihat keseluruhan programmnya di bawah. Namun sebelum itu kita membahas sejenak mengenai indikator tambahan yaitu RSI.Code:if((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet); }
Saya sedikit keluar jalur dari sistem trading master pantang_merah, dimana dalam sistem aslinya hanya memakai 2 MA yang berpotongan. Namun pada thread ini saya menambahkan konfirmasi dengan indikator RSI dengan maksud memberikan gambaran pembuatan EA yang sering memakai lebih dari 1 jenis indikator.
Di luar sana, ada pendapat bahwa RSI dengan setelan standar pada TF Daily adalah petunjuk paling handal mengenai arah trend besar pada hari itu. Pendapat ini masih bisa diperdebatkan, namun disini kami hanya ingin menunjukkan bagaimana aplikasi coding RSI pada Expert Advisor.
Function RSI berwujud seperti ini : double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Contoh coding yang kita pakai pada EA kita adalah sbb :Tampak RSI-nya memakai period D1.Code:RSI = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 0);
Keseluruhan program EA Sederhana kita yang sudah ditambahkan konfirmasi RSI dan Close Order ketika MA berpotongan kembali adalah sbb, harap teman-teman mengcompile sendiri di Meta Editornya dan melakukan testing di Strategy Tester.NB : Mohon jika hasil testingnya menunjukkan anjlok, belum tentu konsep tradingnya salah. Coba kita bahas kembali dengan pembuat sistem. Atau setelan SL, TP dan Trailing harus diubah supaya pas dengan karakter pairnya.Code://+------------------------------------------------------------------+ //| EA 2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int TrailingStop = 5; extern bool Trailing = true; extern int SMA1Periode = 4; extern int SMA2Periode = 8; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double dSMA1, dSMA2, dSMA1before, dSMA2before, RSI; int iTrade=0; dSMA1=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA2=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA1before=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,1); dSMA2before=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,1); RSI = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 0); Comment("EA 2SMA \n"+ "System : pantang_merah \n"+ "Coding : DwiM ea@dwim.web.id \n"+ "http://ea.dwim.web.id"); if (OrdersTotal()<1) { if (AccountFreeMargin()<1000*Lots) { Comment("EA tidak bekerja, dana kurang :", AccountFreeMargin()); return(0);} if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before) && RSI>50) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } if ((dSMA1<dSMA2) && (dSMA1before>dSMA2before) && RSI<50) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); } } /* >>> Fungsi Trailing Stop <<< */ if(Trailing==true) { for(iTrade=0;iTrade<OrdersTotal();iTrade++) { OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { if((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet); } if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else { if((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet); } if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } //---- return(0); } //+------------------------------------------------------------------+
Salam ProfitSpoiler:
Last edited by DwiM; 11-27-2010 at 08:25 PM.
===========================================================
Mohon ditambahkan gan :
sedikit bantuan jawab nih pertanyaan diatas.
untuk menambah Buat broker 5 digit dan magic.
tambahkan di input:
extern int MagicNumber = 123;
extern double xDigit = 1; //kalo 4 digit isi 1; untuk 5 digits isi 10.
nah disetiap perkalian POINT, tambahkan Point*xDigit.
cara ini lebih mudah, karena untuk mayor 5 digits, sedangkan spt JPY jadinya 4 digits, shg gak perlu logic lagi.
contoh order spt dibawah
PHP Code:
if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before) && RSI>50)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point*xDigit,Ask+TakeProfit*Point*xDigit, "EAKU", MagicNumber, 0,Blue);
}
========================================
Bisa jg dg setting auto point..
trus masukkan di init() atau start() jg boleh
Selesai sudahh memeriksa digit broker
logic di order jd gini
Ingat.. semua variabel Point udh bsa dganti skrg mnjadi point.. agar otomatis mendeteksi broker 4 ato 5 digit..
PHP Code:
double point;
PHP Code:
if(Digits==3 || Digits==5) point=10*Point;
else point=Point;
logic di order jd gini
PHP Code:
if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before) && RSI>50)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*point,Ask+TakeProfit*point, "EAKU", MagicNumber, 0,Blue);
}
================================================
Membuat Fungsi.
Teman-teman trader.
Sedikit melanjutkan pembahasan dasar kita. Pada coding sebelumnya ada kesalahan logika yang sebetulnya cukup menganggu, tapi nanti saya kita perbaiki agar tidak membingungkan alur pembelajaran teman-teman yang pemula.
Kesalahan logika itu adalah penempatan if(Trailing==true). Sebetulnya fungsi ini hanya untuk menyetel agar fungsi trailing bisa dihidupkan atau dimatikan. Tapi kesalahan saya adalah menempatkan fungsi OrderClose di dalam bracketif(Trailing==true) ini. Akibatnya jika user mematikan fungsi Trailing, maka program EA tidak akan menutup OP jika MA berpotongan pada arah berlawanan.
Kita akan perbaiki hal ini.
Tapi, YA AMPUN kalau kita menambahkan coding di dalam program ini, maka baris coding akan bertambah banyak dan bertambah ruwet. Semakin sulit jika nanti kita harus memperbaiki kode EA ini. Disarankan, untuk EA yang semakin banyak code-nya, kita memecah fungsi-fungsinya agar semakin gampang dilacak dan diperiksa masalahnya.
Saya akan memecah fungsi Trailing untuk buy menjadi BuyTrailing() dan SellTrailing(), saya copy paste coding itu menjadi fungsi baru seperti ini :Dan fungsi trailing untuk sell menjadi SellTrailing() seperti di bawah ini :Code:void BuyTrailing() { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } }Lalu saya pecah fungsi OrderSend() untuk Buy dan Sell menjadi seperti di bawah :Code:void SellTrailing() { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } }Akibatnya kita akan mendapatkan code complete dari program EA adalah seperti ini. Perhatikan cara memanggil fungsi (Call).Code:void Buy() { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } void Sell() { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); }Saya coba menjalankan lagi di Strategy Tester, hasilnya berjalan baik :Code://+------------------------------------------------------------------+ //| EA 2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int TrailingStop = 5; extern bool Trailing = true; extern int SMA1Periode = 4; extern int SMA2Periode = 8; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double dSMA1, dSMA2, dSMA1before, dSMA2before, RSI; int iTrade=0; dSMA1=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA2=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA1before=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,1); dSMA2before=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,1); RSI = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 0); Comment("EA 2SMA \n"+ "System : pantang_merah \n"+ "Coding : DwiM ea@dwim.web.id \n"+ "http://ea.dwim.web.id"); if (OrdersTotal()<1) { if (AccountFreeMargin()<1000*Lots) { Comment("EA tidak bekerja, dana kurang :", AccountFreeMargin()); return(0);} if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before) && RSI>50) { Buy(); } if ((dSMA1<dSMA2) && (dSMA1before>dSMA2before) && RSI<50) { Sell(); } } /* >>> Fungsi Trailing Stop <<< */ for(iTrade=0;iTrade<OrdersTotal();iTrade++) { OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { if((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet); } if (Trailing==true) { if(TrailingStop>0) { BuyTrailing(); } } } else { if((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet); } if (Trailing==true) { if(TrailingStop>0) { SellTrailing(); } } } } //---- return(0); } //+------------------------------------------------------------------+ void Buy() { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } void Sell() { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); } void BuyTrailing() { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } void SellTrailing() { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } }Spoiler:
Last edited by DwiM; 11-27-2010 at 08:27 PM.
============================================================
Broker 5 Digits
Sekarang kita menambahkan satu fitur sederhana yang sudah dijawab oleh master dpkforex dan master amtwoxtwo mengenai broker 5 Digit. Kita hanya mengulas lagi dan memasukkan ke dalam code kita.
Agar EA kita bisa running di chart milik broker yang memiliki 5 Digits, kita harus memiliki variabel yang sudah disediakan oleh Metatrader, yaitu Digits.
Kalau Digits ini bernilai 3 atau 5 : ini adalah chart milik broker 5 Digit.
Kalau Digits ini bernilai 2 atau 4 : ini adalah chart milik broker 4 Digit.
Saya akan menambahkan fitur Digits ini ke dalam fungsi Buy() milik kita :Dengan code sederhana ini, begitu EA kita drag ke chart, EA akan langsung menyesuaikan programnya menjadi program 5 Digit atau 4 Digit.Code:void Buy() { if (Digits==3 || Digits==5) // Perintah untuk broker 5 Digits { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point*10,Ask+TakeProfit*Point*10,0); } else // Perintah untuk broker 4 Digits { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } }
Di bawah ini saya kutipkan keseluruhan kode yang memakai fitur 5 Digit. Harap diketahui, program ini sengaja saya panjangkan demi untuk edukasi. Supaya mudah dipahami alurnya buat programmer pemula. Dalam kenyataan sih kode fitur 5 Digit bisa kita singkat dengan mudah. Semoga berguna.Code://+------------------------------------------------------------------+ //| EA 2sma.mq4 | //| Dwi M ea@dwim.web.id | //| http://ea.dwim.web.id | //+------------------------------------------------------------------+ #property copyright "Dwi M ea@dwim.web.id" #property link "http://ea.dwim.web.id" extern int TakeProfit = 30; extern int StopLoss = 30; extern int Slippage = 3; extern double Lots = 1.0; extern int TrailingStop = 5; extern bool Trailing = true; extern int SMA1Periode = 4; extern int SMA2Periode = 8; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double dSMA1, dSMA2, dSMA1before, dSMA2before, RSI; int iTrade=0; dSMA1=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA2=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,0); dSMA1before=iMA(NULL,0,SMA1Periode,0,MODE_EMA,PRICE_CLOSE,1); dSMA2before=iMA(NULL,0,SMA2Periode,0,MODE_EMA,PRICE_CLOSE,1); RSI = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 0); Comment("EA 2SMA \n"+ "System : pantang_merah \n"+ "Coding : DwiM ea@dwim.web.id \n"+ "http://ea.dwim.web.id"); if (OrdersTotal()<1) { if (AccountFreeMargin()<1000*Lots) { Comment("EA tidak bekerja, dana kurang :", AccountFreeMargin()); return(0);} if ((dSMA1>dSMA2) && (dSMA1before<dSMA2before) && RSI>50) { Buy(); } if ((dSMA1<dSMA2) && (dSMA1before>dSMA2before) && RSI<50) { Sell(); } } /* >>> Fungsi Trailing Stop <<< */ for(iTrade=0;iTrade<OrdersTotal();iTrade++) { OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { if((dSMA1<dSMA2) && (dSMA1before>dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet); } if (Trailing==true) { if(TrailingStop>0) { BuyTrailing(); } } } else { if((dSMA1>dSMA2) && (dSMA1before<dSMA2before)) { OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet); } if (Trailing==true) { if(TrailingStop>0) { SellTrailing(); } } } } //---- return(0); } //+------------------------------------------------------------------+ void Buy() { if (Digits==3 || Digits==5) // Perintah untuk broker 5 Digits { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point*10,Ask+TakeProfit*Point*10,0); } else // Perintah untuk broker 4 Digits { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,Bid-StopLoss*Point,Ask+TakeProfit*Point,0); } } void Sell() { if (Digits==3 || Digits==5) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point*10,Bid-TakeProfit*Point*10,0); } else { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Ask+StopLoss*Point,Bid-TakeProfit*Point,0); } } void BuyTrailing() { if (Digits==3 || Digits==5) { if(Bid-OrderOpenPrice()>Point*10*TrailingStop) { if(OrderStopLoss()<Bid-Point*10*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*10*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } else { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } void SellTrailing() { if (Digits==3 || Digits==5) { if((OrderOpenPrice()-Ask)>(Point*10*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*10*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*10*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } else { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } }
Last edited by DwiM; 11-27-2010 at 08:27 PM.
===================================
==============================================================
OK deh, balik ke Laptop
Ayo teman-teman. Mana nih yang mau mencoba Coding pada Kasus-kasus yang saya usulkan di atas ?. Atau barangkali ada yang masih belum jelas mengenai pembahasan di atas. Kalau tidak ada yang bertanya, maka kita bingung lho : ini bener-bener sudah mengerti atau malahan tidak ada yang mengerti sama sekali hehehe.
Saya tunggu deh, siapa yang berani mengajukan Coding-nya atas kasus di atas. Atau ada yang mau tanya-tanya dulu ? Silakan
===============================================
help gan nubi,,,
ReplyDeletemaksud dari iTrade itu apa ya,,,
/* >>> Fungsi Trailing Stop <<< */
for(iTrade=0;iTrade<OrdersTotal();iTrade++)
{
OrderSelect(iTrade,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY && OrderSymbol()==Symbol())
{
soalnya ada error di situ pas compile,,, apakah perintah untuk set trailingstop sudah berbeda di MT4 sekarang,,, thanks,,
KangBoot.blogspot.com : coba bantu ya itu iTrade nama variable integer bisa di ganti dengan yg lain cuma harus dideklarasikan lebih dulu dengan cara " int iTrade; "
ReplyDeleteSaya mau tanya, kalau EA saya test di live trading dengan demo account USD EA nya bisa jalan, tapi kalau saya test dengan demo account IDR EA nya tidak berfungsi. Apakah ada coding yg harus ditambah?
ReplyDeleteThanks before..
Mas kalo SMA 8 bisa gk Aplly = close,nya diganti open. Gitu
ReplyDeletekenapa void menggunakan return (0)..
ReplyDeletekarena jika saya compile dengan build terbaru. pasti error
Hello Everybody,
ReplyDeleteI've attached a list of the highest ranking forex brokers:
1. Most Recommended Forex Broker
2. eToro - $50 min. deposit.
Here is a list of money making forex instruments:
1. ForexTrendy - Recommended Odds Software.
2. EA Builder - Custom Indicators Autotrading.
3. Fast FX Profit - Secret Forex Strategy.
I hope you find these lists beneficial.
wow panjang sekali_________
ReplyDeleteMantap Boss.... Izin Ngganti Property... :D
ReplyDeleteSaya pakai untuk PAIR GBP/USD M1..
Gimana supaya gak perlu pakai TakeProfit dan close saat fungsi indicator berbalik, dan langsung OP kebalikanya... Maksudnya Close Buy saat CrossDown dan sebaliknya..
Tolong ya boss.. Tks
Ini codenya : di http://www.ralindha.com/ mau saya tulis disini gak muat,gak tau caranya bikin scroll windows :D..
kok saya masih belum nyambung ya Gan dg bahasa EA, boleh gak gan, di pandu belajar buat EA nya, konsepnya adalah pending order Buy Stop dan Sell stop berdasarkan line. Jika harga berada di garis line maka otomatis muncul Buy Stop di atas garis & Sell stop dibawah garis
ReplyDeleteada ke programer yg dari malasyia, jika ada berapa kos kalau nak buat 1 EA
ReplyDeleteEAnya bagus
ReplyDeletemau nanya knp ya pada saat aku backtest tanggal terakir selalu minus, di type keterangannya close at stop. thanks
ReplyDeleteBila ingin menampilkan comment, secara spesifik. misalkan op buy ini di op dengan logika A , OP buy ini dilakukan dengan Logika C dan seterusnya. Bagaimana cara menuliskannya ?
ReplyDeletebila ingin menambahkan OP setelah Lock Profit bagaimana caranya ?
ReplyDeleteom kalau membuat logic seperti ini gi mana om cara masukin indinya
ReplyDelete2 indicator Envelopes semua berada di bawah EMA di 4H EA melakukan order sell saja di TF M15 atau H1 dengan di kasih beberapa layer marti/non marti
Much obliged, that was a truly cool read! Trade Online Market
ReplyDeleteThe Fibonacci based patterns can create bullish and bearish trading signals. The harmonic bat pattern must meet specific conditions to be considered a verified pattern. Key Fibonacci ratios are used to observe patterns that resemble and are similar to deformed "W" or "M" patterns within the chart.
ReplyDeleteGovernment reports indicate inflation is low at about 1.1% (Aug 2010). But Casey Research reports that prices are up when measured in commodity prices. Basic foods up 48%, fuels up 23%, meats up 39% and your cup of coffee up 36% (Oct 2010). World Coinmarketcap cannot create currency in the trillions backed by nothing and expect inflation to remain low. The truth is prices are rising rapidly right now. Do you want to know the safe investments?
ReplyDeleteI am glad to be one of several visitors on this outstanding site (:, thanks for putting up. ThanksGiving Day
ReplyDeleteMy brother suggested I may like this blog. He used to be entirely right. This put up actually made my day. You cann’t believe just how much time I had spent for this info! Thank you! Halloween
ReplyDeletehallo mass... saya newbie mas, mau minta bantuan bagaimana cara untuk buat EA yang hanya untuk melakukan buy apabila eA diaktifkan, dengan SL 30 , TP 30
ReplyDeletedan apabila udah close, otomatis membuat OP_BUY lagi
jadi kita nga susah untuk memodifikasi transaksi nya.
thx mas atas perhatiannya...
Web bagus untuk belajar EA mulai konsep, coding dan terus testing hingga siap digunakan. Teruskan MAS DWI M, selamat!
ReplyDeleteBolavita Agen Judi Online terbesar di Indonesia yang sudah berdiri sejak 2014 menawarkan permainan online lengkap yang aman dan terjamin !
ReplyDelete📌 Bonus 10% untuk new member
📌 Bonus 100% ( Win Beruntun 8x )
📌 Bonus Referral 7% + 2%
📌 Bonus Cashback s/d 10% Setiap Minggu
Minimal deposit hanya Rp 50.000 saja ! Menerima Pendaftaran Dan Deposit Menggunakan OVO, Gopay, Linkaja, Deposit Pulsa, Dan Rekening Bank Seluruh Indonesia.
Daftar sekarang juga ! Klik Disini >>> http://159.89.197.59/register/ <<< Klik sebelah
Atau Hubungi Kontak :
WA : +62812-2222-995
Wechat : Bolavita
Telegram : @bolavitacc
Line : cs_bolavita
Konten Lainnya :
Judi LinkAja
Situs Judi LinkAja
Bandar Judi LinkAja
sangat bermanfaat artikelnya bro,barangkali butuh EA agar profitnya konsisten silahkan Disini
ReplyDeletesaya mau membuat MA dengan shift -3 dan periode 0 gmn ya?
ReplyDeleteklo saya tilis ma_shift -3 nilainya selalu nol.
saya mau membuat Ma_shift -3 dan shift 0 gmn ya?
ReplyDeleteklo saya tulis ma_shift -3 nilainya selalu nol.
do you know off grid solar system installation bnifits for home off grid solar system
ReplyDelete