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"
}
}
}
}
}
Komentar 0