Panduan Menggunakan Trailing Stop di MetaTrader 5 untuk Trader Indonesia

Mike 2024.04.05 07:09 16 0 0
Lampiran

Kode ini berfungsi jika Anda menggunakan Stop Loss atau tidak.


Persyaratan

  • Anda perlu menyertakan "Trade.mqh" untuk mengakses kelas CTrade yang memungkinkan Anda bekerja dengan posisi dan order.

#include <Trade\Trade.mqh> // <<------------------------------------------ Sertakan "Trade.mqh" untuk mengakses kelas CTrade

  • Anda perlu mengatur parameter input untuk menyesuaikan jarak trailing sesuai keinginan Anda. Ini tidak wajib, tetapi sangat membantu.
input double Traling_Step = 3.0;
  • Anda perlu mendefinisikan instance untuk kelas CTrade. Namanya bisa apa saja, tetapi sebaiknya didefinisikan setelah handler acara OnInit.

  • Selanjutnya, Anda perlu membuat pernyataan if untuk memeriksa apakah ada posisi yang sedang berjalan saat ini. Pernyataan ini memanggil fungsi Check_TrailingStop(); untuk setiap tick. Ini penting karena EA harus melakukan trailing dengan tepat dan mulus. Ingat untuk menempatkan pernyataan ini di bagian atas handler acara OnTick agar berfungsi dengan baik.
//+------------------------------------------------------------------+ //| Fungsi inisialisasi Expert                                    | //+------------------------------------------------------------------+ int OnInit() 
  {
   //--- buat timer
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }

CTrade trade; // <<------------------------------------------ Deklarasikan kelas "CTrade". Anda bisa mengganti "trade" dengan nama apa pun yang Anda inginkan
void OnTick() 
  {
   if(PositionsTotal() > 0) // memanggil fungsi trailing stop untuk setiap tick jika ada posisi yang berjalan.
     {
      Check_TralingStop();
     }
    
      
  }

  • Anda perlu mendeklarasikan fungsi khusus bernama Check_TrailingStop(); (dalam hal ini) untuk menyelesaikan sisanya. Anda bisa menggunakan nama apa pun yang Anda mau.
  • Fungsi kustom ini akan melakukan loop melalui semua posisi terbuka dan melakukan trailing sesuai jarak yang Anda tentukan.
void Check_TralingStop() 
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // Mendapatkan nomor tiket posisi menggunakan 'indeks' posisi.

      if(PositionSelectByTicket(TicketNo)) // Memilih posisi menggunakan nomor tiket (kita sudah mengambil nomor tiketnya)
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // Memeriksa jenis posisi.
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<------------------- Mendapatkan Stop Loss saat ini
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Tidak ada stop loss yang benar.
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // Hanya berjalan sekali per posisi. Mengatur SL pertama.
                trade.PositionModify(ticket,trailingLevel,takeProfit); // Mengubah trailing Stop menggunakan "CTrade.trade"
              }

            if(bidPrice > openPrice && trailingLevel > stopLoss) // memeriksa level trailing di atas level sebelumnya.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Mengubah trailing Stop menggunakan "CTrade.trade"
              }

           }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double askPrice  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // Tidak ada stop loss yang benar.
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // Hanya berjalan sekali per posisi. Mengatur SL pertama.
                trade.PositionModify(ticket,trailingLevel,takeProfit); // Mengubah trailing Stop menggunakan "CTrade.trade"
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // memeriksa level trailing di atas level sebelumnya.
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // Mengubah trailing Stop menggunakan "CTrade.trade"
              }
           }
        }
    }
  }










    Daftar
    Komentar 0