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.
Komentar 0