Beranda Perdagangan Sistem Postingan

Membuat Expert Advisor MA Crossing untuk MetaTrader 4

Lampiran
34176.zip (2.06 KB, Unduh 2 kali)

Halo sobat trader! Pada kesempatan kali ini, kita akan belajar cara membuat Expert Advisor (EA) sederhana dengan menggunakan teknik MA Crossing di MetaTrader 4. Mari kita mulai dengan mendefinisikan variabel input yang diperlukan.

//--- parameter input
input    int      period_ma_fast = 8;  //Periode MA Cepat
input    int      period_ma_slow = 20; //Periode MA Lambat

input    double   takeProfit  = 20.0;  //Take Profit (pips)
input    double   stopLoss    = 20.0;  //Stop Loss (pips)

input    double   lotSize     = 0.10;  //Ukuran Lot
input    double   minEquity   = 100.0; //Equity Minimum ($)

input    int Slippage = 3;       //Slippage
input    int MagicNumber = 889;  //Nomor Magis


Selanjutnya, kita akan mendefinisikan variabel global. Variabel dengan cakupan global ini akan dikenal dan dapat diakses oleh semua fungsi.

//Variabel Global
double   myPoint    = 0.0;
int      mySlippage = 0;
int      BuyTicket   = 0;
int      SellTicket  = 0;


Ketika EA dieksekusi, fungsi pertama yang dijalankan adalah OnInit(). Fungsi ini sering digunakan untuk memvalidasi dan menginisialisasi variabel global yang akan digunakan.

int OnInit()
{
   //validasi input, selalu lakukan validasi saat inisialisasi data input
   if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){
      Alert("PERINGATAN - Data input awal tidak valid");
      return (INIT_PARAMETERS_INCORRECT);
   }
   
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(lotSize<min_volume)
   {
      string pesan =StringFormat("Volume lebih kecil dari batas yang dibolehkan yaitu %.2f",min_volume);
      Alert (pesan);
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint = GetPipPoint(Symbol());
   mySlippage = GetSlippage(Symbol(),Slippage);

   return(INIT_SUCCEEDED);
}


Ketika harga pasar bergerak (tick), fungsi OnTick() akan dipanggil dan menjalankan semua instruksi/fungsi yang terdapat dalam blok fungsi OnTick().

Di dalam fungsi OnTick() akan memanggil berbagai fungsi lainnya.

Dimulai dengan memanggil fungsi checkMinEquity() untuk mengontrol kecukupan equity trading. Jika dana equity mencukupi (melebihi equity minimum), akan dilanjutkan dengan deklarasi variabel sinyal dan diikuti dengan pemanggilan fungsi NewCandle() yang berfungsi untuk memberi tahu ketika candle baru terbentuk.

Fungsi getSignal() akan membaca nilai pada kedua indikator moving average dan mengembalikan informasi sinyal apakah terjadi cross naik atau turun sebagai sinyal untuk beli/jual.

Berdasarkan informasi sinyal ini, akan diteruskan ke fungsi transaction() untuk membuka posisi beli atau jual.

Dan akan dilanjutkan dengan memanggil fungsi setTPSL() yang berfungsi untuk mengatur harga take profit dan stop loss.

Jika equity tidak memenuhi persyaratan minimum, akan muncul alert dan EA ini akan dihentikan.

void OnTick()
{
   if (cekMinEquity()){
      
      
      int signal = -1;
      bool isNewCandle = NewCandle(Period(), Symbol());
      
      signal = getSignal(isNewCandle);
      transaction(isNewCandle, signal);
      setTPSL();
      
      
   }else{
      //Hentikan trading, karena equity tidak cukup
      Print("EA akan segera diberhentikan karena equity tidak mencukup");
   }
}


Fungsi untuk setTPSL()

void setTPSL(){
   int   tOrder = 0;
   string   strMN = "", pair = "";
   double sl = 0.0, tp = 0.0;
   
   pair = Symbol();
   
   tOrder = OrdersTotal();
   for (int i=tOrder-1; i>=0; i--){
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      strMN = IntegerToString(OrderMagicNumber());
      if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ 
            if (takeProfit > 0) {
               tp = OrderOpenPrice() + (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() - (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){
               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){
                  Print ("OrderModify Berhasil");
               }
            }
         }
         if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){
            if (takeProfit > 0) {
               tp = OrderOpenPrice() - (takeProfit * myPoint);
            }else{
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() + (stopLoss * myPoint);
            }else{
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){
               if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){
                  Print ("OrderModify Berhasil");
               }
            }
         }
      }//akhir if magic number && pair
      
   }//akhir for
}



Untuk edukasi dan berbagi ilmu di Indonesia, silakan bergabung di grup telegram kami t.me/codeMQL


Jika Anda mencari aplikasi untuk mendukung trading Anda, silakan unduh aplikasi SignalForex kami di Play Store.

https://play.google.com/store/apps/details?id=com.autobotfx.signalforex






Postingan terkait

Komentar (0)