Een trailing stop is een geweldige manier om je trades te ondersteunen door de stop loss automatisch naar het winstgebied te verschuiven. Op deze manier kun je altijd je winst veiligstellen zonder constant je trades in de gaten te houden.
Laten we beginnen met de code door de invoerparameters voor de trailing stop te specificeren:
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
Hier is de globale variabele die we nodig hebben:
//Globale Variabele
double myPoint = 0.0;
Wanneer we deze Expert Advisor (EA) uitvoeren, wordt de functie OnInit() voor de eerste keer uitgevoerd. In deze functie controleren en initialiseren we de invoervariabelen:
int OnInit()
{
if (isTrailingStop && trailingStart <= 0){
Alert ("Parameters incorrect");
return(INIT_PARAMETERS_INCORRECT);
}
myPoint = GetPipPoint(Symbol());
return(INIT_SUCCEEDED);
}
Elke keer dat er een prijsbeweging (tick) plaatsvindt op de grafiek waar deze EA aan is gekoppeld, wordt de functie OnTick() uitgevoerd. In deze functie roepen we de functie setTrailingStop() aan:
void OnTick()
{
//---
setTrailingStop(MagicNumber);
}
Hier is de functie 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(), " fout bij het updaten van 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(), " fout bij het updaten van sl");
}
}
} //einde als magicNumber
}//einde voor
}
Andere standaardfuncties die nodig zijn, zijn GetPipPoint():
// Functie 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);
}
Als je vragen hebt, laat ze dan achter in de reacties of sluit je aan bij onze groepschat (in het Nederlands) t.me/codeMQL.
We hebben ook de SignalForex App beschikbaar.
Je kunt ons steunen door de SignalForex App te downloaden en deze te blijven gebruiken voor een winstgevender handelsresultaat.
Download hier de SignalForex App.
Reactie 0