Mengoptimalkan Trailing Stop dengan MagicNumber di MetaTrader 4

Mike 2021.03.30 22:17 7 0 0
Lampiran


Trailing stop adalah fitur yang sangat membantu dalam trading kita. Dengan menggunakan trailing stop, kita bisa secara otomatis memindahkan stop loss ke area profit, sehingga kita bisa lebih aman dalam mengelola posisi trading kita.

Pada artikel kali ini, kita akan membahas cara membuat kode untuk trailing stop dengan parameter input yang bisa disesuaikan.

1. Menentukan Parameter Trailing Stop

input    bool     isTrailingStop = true;  // Mengaktifkan Trailing Stop
input    int      trailingStart  = 15;    // Trailing Start (pips)
input    int      trailingStep   = 5;     // Trailing Step (pips)
input    int      MagicNumber = 0;        // Magic Number

2. Variabel Global

// Variabel Global
double   myPoint    = 0.0;

3. Fungsi OnInit

Ketika kita menjalankan EA ini, fungsi OnInit() akan dieksekusi untuk pertama kalinya. Di fungsi ini, kita akan memvalidasi dan menginisialisasi variabel input.

int OnInit()
  {
    if (isTrailingStop && trailingStart <= 0){
      Alert ("Parameter tidak valid");
      return(INIT_PARAMETERS_INCORRECT);
   }
  
   myPoint     = GetPipPoint(Symbol());
  
   return(INIT_SUCCEEDED);
  }

4. Fungsi OnTick

Setiap kali terjadi pergerakan harga (tick) pada chart tempat EA ini dipasang, fungsi OnTick() akan dieksekusi. Di dalam fungsi ini, kita akan memanggil fungsi setTrailingStop().

void OnTick()
  {
    //---
     setTrailingStop(MagicNumber);
  }

5. Fungsi setTrailingStop()

void setTrailingStop(int magicNumber=0){
   if (isTrailingStop==false) return;
   int      tOrder = 0;
   string   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);
      if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY){
            if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice() && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() ) )
            {
               sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                Print ("#", OrderTicket(), " gagal update sl");
               }
            }
         }
         if (OrderType() == OP_SELL){
            if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice() && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0) )
            {
               sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                Print ("#", OrderTicket(), " gagal update sl");
               }
            }
      }
  }
}

6. Fungsi GetPipPoint()

Fungsi standar lain yang diperlukan adalah GetPipPoint().

// Fungsi GetPipPoint
double GetPipPoint(string pair)
{
   double point= 0.0;
   int digits = (int) MarketInfo(pair, MODE_DIGITS);
   if(digits == 2 || digits== 3) point= 0.01;
   else if(digits== 4 || digits== 5) point= 0.0001;
   return(point);
}


7. Ajak Diskusi

Jika ada pertanyaan, silakan tinggalkan di kolom komentar atau bergabunglah dengan grup diskusi kami di t.me/codeMQL.


8. Dukungan Aplikasi SignalForex

Kami juga menyediakan aplikasi SignalForex. Anda dapat mendukung kami dengan mengunduh dan menggunakan aplikasi ini untuk trading yang lebih menguntungkan.

Download Aplikasi SignalForex


Daftar
Komentar 0