Laman utama Perdagangan Sistem Siaran

Panduan Lengkap 2 MA Crossing untuk MetaTrader 4

Lampiran
34176.zip (2.06 KB, Muat turun 2 kali)

Dalam post kali ini, kita akan membincangkan tentang cara membuat Expert Advisor (EA) untuk strategi 2 MA Crossing di MetaTrader 4. Mari kita mulakan dengan mendefinisikan input parameter.

//--- parameter input
input    int      period_ma_cepat = 8;  //Tempoh MA Cepat
input    int      period_ma_lambat = 20;//Tempoh MA Lambat

input    double   takeProfit  = 20.0;  //Ambil Untung (pips)
input    double   stopLoss    = 20.0  //Had Kerugian (pips)

input    double   saizLot     = 0.10;  //Saiz Lot
input    double   ekuitiMin   = 100.0;//Min. Ekuiti ($)

input    int Slippage = 3;       //Slippage
input    int MagicNumber = 889;  //Nombor Ajaib


Seterusnya, kita akan mendefinisikan variabel global. Variabel dengan skop global ini akan dikenali atau dapat diakses oleh semua fungsi.

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


Apabila EA dilaksanakan, fungsi pertama yang akan dijalankan adalah OnInit(). Oleh itu, kita sering menggunakan fungsi ini untuk mengesahkan dan memulakan variabel global yang akan digunakan.

int OnInit()
{
   //validasi input, sebaiknya kita selalu melakukan validasi pada initialisasi data input
   if (period_ma_cepat >= period_ma_lambat || takeProfit < 0.0 || stopLoss < 0.0 || saizLot < 0.01 || ekuitiMin < 10) {
      Alert("AMARAN - Data input tidak sah");
      return (INIT_PARAMETERS_INCORRECT);
   }
   
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(saizLot<min_volume)
   {
      string pesan =StringFormat("Volume lebih kecil dari batas yang dibolehkan iaitu %.2f",min_volume);
      Alert (pesan);
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint = GetPipPoint(Symbol());
   mySlippage = GetSlippage(Symbol(),Slippage);

   return(INIT_SUCCEEDED);
}


Ketika harga pasaran bergerak (tick), fungsi OnTick() akan dipanggil dan melaksanakan semua arahan / fungsi yang terdapat dalam blok fungsi ini.

Di dalam fungsi OnTick(), pelbagai fungsi lain akan dipanggil.

Kita mula dengan memanggil fungsi checkMinEquity() untuk mengawal kesesuaian ekuiti perdagangan. Jika dana ekuiti mencukupi (melebihi ekuiti minimum), ia akan diikuti dengan deklarasi variabel isyarat dan seterusnya memanggil fungsi NewCandle() yang berfungsi untuk memaklumkan apabila lilin baru terbentuk.

Fungsi getSignal() akan membaca nilai pada kedua-dua indikator moving average dan mengembalikan maklumat isyarat sama ada berlaku persilangan ke atas atau ke bawah sebagai isyarat untuk beli / jual.

Berdasarkan maklumat isyarat ini, ia akan diteruskan ke fungsi transaction() untuk menetapkan posisi beli atau jual yang dibuka.

Seterusnya, kita akan memanggil fungsi setTPSL() yang berfungsi untuk menetapkan harga ambil untung dan had kerugian.


Jika ekuiti tidak memenuhi syarat minimum, amaran akan dipaparkan 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 perdagangan, kerana ekuiti tidak cukup
      Print("EA akan dihentikan kerana ekuiti tidak mencukupi");
   }
}


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 ("Pengubahsuaian Pesanan Berjaya");
               }
            }
         }
         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 ("Pengubahsuaian Pesanan Berjaya");
               }
            }
         }
      }//tamat jika nombor ajaib && pasangan
      
   }//tamat for
}


Untuk pendidikan dan perkongsian dalam Bahasa Melayu, sila sertai kami di grup telegram t.me/codeMQL


Jika anda sedang mencari aplikasi untuk menyokong perdagangan anda, sila muat turun aplikasi SignalForex kami di play store

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


Siaran berkaitan

Komen (0)