MQL5/3_MQL5_EA_Tools/08_Trailing_Stop_03.mq5

182 lines
4.7 KiB
MQL5
Raw Permalink Normal View History

2025-04-16 11:59:03 -04:00
#property copyright "Santiago Cruz"
2025-02-12 12:06:37 -05:00
#property link "https://www.mql5.com/en/users/algo-trader/"
#property version "1.00"
#property strict
#include <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>
#include <Trade/PositionInfo.mqh>
input group "=== Trading Inputs ==="
input int WhenToBreak = 20; //When to Breakeven in pips
input int BreakBy = 5; //Break even in pips
input int WhenToTrail = 50; //When to Start Trailing in pips
input int TrailBy = 20; //TrailingStop in pips
input int Slippage = 10;
double m_whentobreak;
double m_breakby;
double m_whentotrail;
double m_trailby;
CTrade trade;
CSymbolInfo m_symbol;
CPositionInfo PositionInfo;
int OnInit()
{
trade.SetDeviationInPoints(Slippage);
trade.SetExpertMagicNumber(EA_Magic);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
if(PositionsTotal()>0)
{
BreakEven();
TrailingStopLoss();
}
}
void BreakEven()
{
m_whentobreak = WhenToBreak*_Point;
m_breakby= BreakBy*_Point;
if(_Digits==5 || _Digits==3){m_whentobreak=m_whentobreak*10;}
for(int i = PositionsTotal()-1; i>=0; i--)
{
if(!PositionInfo.SelectByIndex(i))
{
continue;
}
if(PositionInfo.Magic() != EA_Magic)
{
continue;
}
if(PositionInfo.Symbol() != m_symbol.Name())
{
continue;
}
double current_sl = PositionInfo.StopLoss();
double openingPrice = PositionInfo.PriceOpen();
if(PositionInfo.PositionType()==POSITION_TYPE_BUY)
{
if(current_sl>=openingPrice)
{
continue;
}
}
if(PositionInfo.PositionType()==POSITION_TYPE_SELL)
{
if(current_sl!=0 && current_sl<=openingPrice)
{
continue;
}
}
//---Checking if price has arrived at BE point
double breakevenprice = PositionInfo.PositionType()==POSITION_TYPE_BUY ? openingPrice+m_whentobreak : openingPrice-m_whentobreak;
double current_price = PositionInfo.PriceCurrent();
if(PositionInfo.PositionType()==POSITION_TYPE_BUY)
{
if(current_price<breakevenprice)
{
continue;
}
}
else
{
if(current_price>breakevenprice)
{
continue;
}
}
//---Breaking even
double new_sl=PositionInfo.PositionType() == POSITION_TYPE_BUY ? openingPrice + m_breakby : openingPrice - m_breakby;
//---Modify position
if(!trade.PositionModify(PositionInfo.Ticket(),new_sl,PositionInfo.TakeProfit()))
{
Alert("Error Modifying position [%d]",GetLastError());
}
}
}
void TrailingStopLoss()
{
m_trailby = TrailBy*_Point;
m_whentotrail = WhenToTrail*_Point;
if(_Digits==5 || _Digits==3){
m_trailby=m_trailby*10;
m_whentotrail=m_whentotrail*10;}
for(int i = PositionsTotal()-1; i>=0; i--)
{
if(!PositionInfo.SelectByIndex(i))
{
continue;
}
if(PositionInfo.Magic() != EA_Magic)
{
continue;
}
if(PositionInfo.Symbol() != m_symbol.Name())
{
continue;
}
//---Getting the Stoploss and OpenPrice
double current_sl = PositionInfo.StopLoss();
double opening_price = PositionInfo.PriceOpen();
double current_price = PositionInfo.PriceCurrent();
//---Checking if Price Has reached the trailmark
double trailprice = PositionInfo.PositionType()==POSITION_TYPE_BUY ? opening_price + m_whentotrail : opening_price - m_whentotrail;
if(PositionInfo.PositionType()==POSITION_TYPE_BUY)
{
if(current_price < trailprice)
{
continue;
}
}
else
{
if(current_price > trailprice)
{
continue;
}
}
//---Getting the new sl and checking if position sl has moved
double new_sl = PositionInfo.PositionType()==POSITION_TYPE_BUY ? current_price - m_trailby : current_price + m_trailby;
//---Checking if new SL is valid
if(PositionInfo.PositionType()==POSITION_TYPE_BUY && new_sl < current_sl)
{
continue;
}
if(PositionInfo.PositionType()==POSITION_TYPE_SELL && new_sl > current_sl)
{
continue;
}
ulong m_ticket = PositionInfo.Ticket();
double TP = PositionInfo.TakeProfit();
if(!trade.PositionModify(m_ticket,new_sl,TP))
{
Alert("Error Modifying position [%d]",GetLastError());
}
}
}