Trailing stop sangat membantu dalam trading kita dengan memindahkan stop loss ke kawasan keuntungan, jadi kita sentiasa dapat mengamankan perdagangan secara automatik.
Kita akan mulakan kod dengan menetapkan parameter input trailing stop.
input bool isTrailingStop = true; //Trailing Stop
input int trailingStart = 15; //Trailing Start (pips)
input int trailingStep = 5; //Trailing Step (pips)
input int MagicNumber = 0; //Magic Number
Variabel Global
//Variabel Global
double myPoint = 0.0;
Apabila kita menjalankan EA ini, fungsi OnInit() akan dilaksanakan untuk kali pertama dan dalam fungsi ini, kita akan mengesahkan serta menginisialisasi variabel input.
int OnInit()
{
if (isTrailingStop && trailingStart <= 0){
Alert ("Parameter tidak betul");
return(INIT_PARAMETERS_INCORRECT);
}
myPoint = GetPipPoint(Symbol());
return(INIT_SUCCEEDED);
}
Setiap kali berlaku pergerakan harga (tick) pada carta di mana EA ini dipasangkan, fungsi OnTick() akan dilaksanakan. Dalam fungsi OnTick() ini, kita akan memanggil fungsi setTrailingStop().
void OnTick()
{
//---
setTrailingStop(MagicNumber);
}
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");
}
}
}
} //akhir if magicNumber
}//akhir for
}
Fungsi standard 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);
}
Jika anda ada sebarang pertanyaan, sila tinggalkan di ruangan komen atau anda juga boleh sertai kumpulan kami untuk berkongsi (dalam bahasa Indonesia) t.me/codeMQL
Kami juga menyediakan Aplikasi SignalForex
Anda boleh sokong kami dengan memuat turun dan terus menggunakan Aplikasi SignalForex untuk menyokong trading anda lebih menguntungkan
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Siaran berkaitan
- MQL5 Wizard: Cipta Sistem Trading Berdasarkan Pola Morning/Evening Star dan RSI
- Cara Mendapatkan Acara Berimpak Tinggi dari ForexFactory.com untuk EA Anda
- Panduan Lengkap MQL5 Wizard untuk Isyarat Dagangan Berdasarkan Morning/Evening Stars dan Stochastic
- MQL5 Wizard: Cipta Isyarat Dagangan Menggunakan Corak Morning/Evening Star dan MFI
- MQL5 Wizard: Cipta Isyarat Dagangan Berdasarkan Corak Hammer/Hanging Man dan Stochastic