Saturday, 19 January 2013

Studi Kasus: Membuat EA Sederhana by Dwim

Atas dukungan bro toni17 dan bro Fx1st, saya akan mencoba membuat thread baru. Thread ini berisi cara membuat EA dari ide/konsep, membuat coding, testing hingga siap digunakan. 

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

Spoiler Spoiler:
Kita santai aja ya, kalau ada yang mau bertanya silakan diposting disini. Master EA yang lain dimohon turut membantu memberikan arahan.


=================================================


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 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 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 Spoiler:



Sekarang kita akan test program ini lewat Strategy Tester. Buka window Strategy Tester :

Spoiler Spoiler:



Maka akan terbuka Strategy Tester di bagian bawah. Inilah window yang legendaris untuk melakukan BACKTESTING.

Spoiler 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 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.


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;
Lalu kita masukkan function Moving Average di dalam coding EA.


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);
  }
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.

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 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.


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);
  }
Maka nanti di dalam program, kita akan melakukan BUY jika MA1 memotong MA2 dari bawah ke atasKita akan melakukan SELL jika MA1 memotong MA2 dari atas ke bawah.

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.

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);
  }
//+------------------------------------------------------------------+
Lalu kita lakukan backtesting dengan strategy tester seperti dijelaskan di depan tadi.

Spoiler Spoiler:



Hasil akhir grafik backtesting adalah :

Spoiler 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 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.

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;
Perlu diperhatikan, deklarasi variabel yang menggunakan extern , nantinya bisa diubah oleh user EA kita ketika EA ini di attach ke chart. Gambarnya seperti ini :

Spoiler 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.

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);
                    }
                 }
         }
   
      }
   
   }

   }
Hasil akhirnya ketika di backtester, akan kita lihat Trailing Stop ini akan menggeser SL ketika nilai profit semakin naik.

Spoiler 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 BUY

Code:
         
         if((dSMA1<dSMA2) && (dSMA1before>dSMA2before))
         {
            OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);
         }
Menutup Order SELL

Code:
       if((dSMA1>dSMA2) && (dSMA1before<dSMA2before))
         {
            OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet);
         }
Kita nanti akan bersama-sama melihat keseluruhan programmnya di bawah. Namun sebelum itu kita membahas sejenak mengenai indikator tambahan yaitu RSI.

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 :

Code:
RSI = iRSI(NULL, PERIOD_D1, 14, PRICE_CLOSE, 0);
Tampak RSI-nya memakai period D1.

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.

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);
  }
//+------------------------------------------------------------------+
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.

Salam Profit 
Spoiler Spoiler:

Last edited by DwiM; 11-27-2010 at 08:25 PM.


===========================================================


 Mohon ditambahkan gan :
1. Ea biar bisa jln untk semua broker baik broker 4 digit maupun 5 digit. Kalau tak perhatikan ea ini baru bisa jln untk broker 4 digit
2. OP nya dikasih magic number dunk.... biar nanti untuk penanganan OP selanjutnya bisa lebih flexibel. Biar ea bisa dicampur dng ea2 / OP manual tanpa adanya saling ganggu...

Thanks
Pertama... SALUT buat dirimu Boss... weleh2.. mantab dah... udah jadi Guru EA nih... 

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"MagicNumber0,Blue);  
      }  
ok siplah ..dilanjut boss.

========================================

Bisa jg dg setting auto point..
PHP Code:
double point;  
trus masukkan di init() atau start() jg boleh 
PHP Code:
if(Digits==|| Digits==5point=10*Point;
    else                       
point=Point;  
Selesai sudahh memeriksa digit broker

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"MagicNumber0,Blue);   
      }  
Ingat.. semua variabel Point udh bsa dganti skrg mnjadi point.. agar otomatis mendeteksi broker 4 ato 5 digit..

================================================

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 :

Code:
void BuyTrailing()
{

    if(Bid-OrderOpenPrice()>Point*TrailingStop)
    {
        if(OrderStopLoss()<Bid-Point*TrailingStop)
        {
             OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
             return(0);
        }
    }


}
Dan fungsi trailing untuk sell menjadi SellTrailing() seperti di bawah ini :

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);
         }
     }

}
Lalu saya pecah fungsi OrderSend() untuk Buy dan Sell menjadi seperti di bawah :

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);
}
Akibatnya kita akan mendapatkan code complete dari program EA adalah seperti ini. Perhatikan cara memanggil fungsi (Call).

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);
         }
     }

}
Saya coba menjalankan lagi di Strategy Tester, hasilnya berjalan baik :

Spoiler 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 :

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);
   }        

}
Dengan code sederhana ini, begitu EA kita drag ke chart, EA akan langsung menyesuaikan programnya menjadi program 5 Digit atau 4 Digit.

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.

===================================


==============================================================

iya master benar sekali maksud saya seperti itu biar fungsi itu bisa di panggil secara praktis,..
atau dengan cara membuat fungsi-fungsi tersebut dalam satu file2 yang berbeda misal ma.mq4, macd.mq4
nah file tersebut kita panggil fungsinya pada ea dengan menambahkan code
Code:
#include ma.mq4
jadi ibaratnya menjalankan mq4 pada file EA, ato bisa di bilang komunikasi antar MQ4 gitu master,..
Mungkin yang dimaksud adalah fungsi-fungsi dikumpulkan dalam Libraries ya ?. Ya bisa saja, kalau kita punya function yang akan sering dipanggil berulang-ulang maka diletakkan saja di file Library.

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 

===============================================

27 comments:

  1. help gan nubi,,,
    maksud 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,,

    ReplyDelete
  2. 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; "

    ReplyDelete
  3. Saya 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?
    Thanks before..

    ReplyDelete
  4. Mas kalo SMA 8 bisa gk Aplly = close,nya diganti open. Gitu

    ReplyDelete
  5. kenapa void menggunakan return (0)..
    karena jika saya compile dengan build terbaru. pasti error

    ReplyDelete
  6. Hello Everybody,

    I'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.

    ReplyDelete
  7. Mantap Boss.... Izin Ngganti Property... :D
    Saya 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..

    ReplyDelete
  8. 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

    ReplyDelete
  9. ada ke programer yg dari malasyia, jika ada berapa kos kalau nak buat 1 EA

    ReplyDelete
  10. mau nanya knp ya pada saat aku backtest tanggal terakir selalu minus, di type keterangannya close at stop. thanks

    ReplyDelete
  11. Bila 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 ?

    ReplyDelete
  12. bila ingin menambahkan OP setelah Lock Profit bagaimana caranya ?

    ReplyDelete
  13. om kalau membuat logic seperti ini gi mana om cara masukin indinya
    2 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

    ReplyDelete
  14. Much obliged, that was a truly cool read! Trade Online Market

    ReplyDelete
  15. The 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.

    ReplyDelete
  16. Government 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?

    ReplyDelete
  17. I am glad to be one of several visitors on this outstanding site (:, thanks for putting up. ThanksGiving Day

    ReplyDelete
  18. My 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

    ReplyDelete
  19. hallo 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
    dan apabila udah close, otomatis membuat OP_BUY lagi
    jadi kita nga susah untuk memodifikasi transaksi nya.

    thx mas atas perhatiannya...

    ReplyDelete
  20. Web bagus untuk belajar EA mulai konsep, coding dan terus testing hingga siap digunakan. Teruskan MAS DWI M, selamat!

    ReplyDelete
  21. Bolavita Agen Judi Online terbesar di Indonesia yang sudah berdiri sejak 2014 menawarkan permainan online lengkap yang aman dan terjamin !

    📌 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

    ReplyDelete
  22. sangat bermanfaat artikelnya bro,barangkali butuh EA agar profitnya konsisten silahkan Disini

    ReplyDelete
  23. saya mau membuat MA dengan shift -3 dan periode 0 gmn ya?
    klo saya tilis ma_shift -3 nilainya selalu nol.

    ReplyDelete
  24. saya mau membuat Ma_shift -3 dan shift 0 gmn ya?
    klo saya tulis ma_shift -3 nilainya selalu nol.

    ReplyDelete
  25. do you know off grid solar system installation bnifits for home off grid solar system

    ReplyDelete