54 lines
1.7 KiB
MQL5
54 lines
1.7 KiB
MQL5
#ifndef __DUALEA_VOLATILITYEXIT_MQH__
|
|
#define __DUALEA_VOLATILITYEXIT_MQH__
|
|
|
|
#include <Trade/PositionInfo.mqh>
|
|
#include "..\LogMiddleware.mqh"
|
|
|
|
class CVolatilityExit
|
|
{
|
|
public:
|
|
// Evaluate ATR-based trailing exit. Returns true when exit is advised,
|
|
// and fills close_price_out/reason_out.
|
|
static bool Evaluate(const string symbol,
|
|
const int atr_period,
|
|
const double atr_mult,
|
|
const ENUM_POSITION_TYPE ptype,
|
|
const double bid,
|
|
const double ask,
|
|
const double current_sl,
|
|
double &close_price_out,
|
|
string &reason_out)
|
|
{
|
|
close_price_out = 0.0; reason_out = "";
|
|
if(atr_mult<=0.0 || atr_period<=0) return false;
|
|
|
|
int handle = iATR(symbol, PERIOD_CURRENT, atr_period);
|
|
if(handle==INVALID_HANDLE) return false;
|
|
double buf[]; int copied = CopyBuffer(handle, 0, 0, 1, buf);
|
|
IndicatorRelease(handle);
|
|
if(copied!=1) return false;
|
|
double atr = buf[0]; if(atr<=0.0) return false;
|
|
|
|
if(ptype==POSITION_TYPE_BUY)
|
|
{
|
|
double trail = bid - (atr * atr_mult);
|
|
if(current_sl>0.0 && trail<=current_sl) return false; // SL already protective
|
|
if(trail>0.0 && bid <= trail - _Point)
|
|
{
|
|
close_price_out = bid; reason_out = "VolatilityExit"; return true;
|
|
}
|
|
}
|
|
else if(ptype==POSITION_TYPE_SELL)
|
|
{
|
|
double trail = ask + (atr * atr_mult);
|
|
if(current_sl>0.0 && trail>=current_sl) return false;
|
|
if(trail>0.0 && ask >= trail + _Point)
|
|
{
|
|
close_price_out = ask; reason_out = "VolatilityExit"; return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
#endif // __DUALEA_VOLATILITYEXIT_MQH__
|