UTE/Strategy/Trailings/TrailingClassic.mqh

144 lines
12 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| TrailingClassic.mqh |
//| Copyright 2016, Vasiliy Sokolov. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "http://www.mql5.com"
#include "Trailing.mqh"
//+------------------------------------------------------------------+
//| 8=B53@8@C5< ?0@0<5B@K B@59;8=3-AB>?0 ?@O<> 2 A?8A>: ?0@0<5B@>2 |
//| M:A?5@B0 |
//+------------------------------------------------------------------+
#ifdef SHOW_TRAILING_CLASSIC_PARAMS
input double PointsModify=0.00100;
input double StepModify=0.00005;
#endif
//+------------------------------------------------------------------+
//| ;0AA8G5A:89 B@59;8=3-AB>? |
//+------------------------------------------------------------------+
class CTrailingClassic : public CTrailing
{
private:
double m_diff_extremum; // 0AAB>O=85 2 ?C=:B0E >B 4>AB83=CB>3> M:AB@5<C<0 4> AB>?-;>AA0 ?>78F88
double m_step_modify; // 8=8<0;L=>5 :>;8G5AB2> ?C=:B>2 4;O 87<5=5=8O AB>?-;>AA0
double FindExtremum(CPosition *pos);
public:
CTrailingClassic(void);
void SetDiffExtremum(double points);
double GetDiffExtremum(void);
void SetStepModify(double points_step);
double GetStepModify(void);
virtual bool Modify(void);
virtual CTrailing *Copy(void);
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@. =8F80;878@C5B ?0@0<5B@K ?>-C<>;G0=8N |
//+------------------------------------------------------------------+
CTrailingClassic::CTrailingClassic(void) : m_diff_extremum(0.0),
m_step_modify(0.0)
{
#ifdef SHOW_TRAILING_CLASSIC_PARAMS
m_diff_extremum=PointsModify;
m_step_modify=StepModify;
#endif
}
//+------------------------------------------------------------------+
//| >72@0I05B :>?8N M:75<?;O@0 |
//+------------------------------------------------------------------+
CTrailing *CTrailingClassic::Copy(void)
{
CTrailingClassic *tral=new CTrailingClassic();
tral.SetDiffExtremum(m_diff_extremum);
tral.SetStepModify(m_step_modify);
tral.SetPosition(m_position);
return tral;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B :>;8G5AB2> ?C=:B>2 >B 4>AB83=CB>3> M:AB@5<C<0 |
//+------------------------------------------------------------------+
void CTrailingClassic::SetDiffExtremum(double points)
{
m_diff_extremum=points;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B 25;8G8=C <8=8<0;L=>9 <>48D8:0F88 2 ?C=:B0E |
//+------------------------------------------------------------------+
void CTrailingClassic::SetStepModify(double points_step)
{
m_step_modify=points_step;
}
//+------------------------------------------------------------------+
//| >72@0I05B :>;8G5AB2> ?C=:B>2 >B 4>AB83=CB>3> M:AB@5<C<0 |
//+------------------------------------------------------------------+
double CTrailingClassic::GetDiffExtremum(void)
{
return m_diff_extremum;
}
//+------------------------------------------------------------------+
//| >72@0I05B 25;8G8=C <8=8<0;L=>9 <>48D8:0F88 2 ?C=:B0E |
//+------------------------------------------------------------------+
double CTrailingClassic::GetStepModify(void)
{
return m_step_modify;
}
//+------------------------------------------------------------------+
//| >48D8F8@C5B B@59;8=3-AB>? A>3;0A=> ;>38:5 :;0AA8G5A:>3> |
//| B@59;8=30 |
//+------------------------------------------------------------------+
bool CTrailingClassic::Modify(void)
{
if(CheckPointer(m_position)==POINTER_INVALID)
{
string text="Invalid position for current trailing-stop. Set position with 'SetPosition' method";
CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
Log.AddMessage(msg);
return false;
}
if(m_diff_extremum<=0.0)
{
string text="Set points trailing-stop with 'SetDiffExtremum' method";
CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
Log.AddMessage(msg);
return false;
}
double extremum=FindExtremum(m_position);
if(extremum == 0.0)return false;
double n_sl = 0.0;
if(m_position.Direction()==POSITION_TYPE_BUY)
{
n_sl=extremum-m_diff_extremum;
if(n_sl-m_position.StopLossValue()>m_step_modify) return m_position.StopLossValue(n_sl);
}
else
{
n_sl=extremum+m_diff_extremum;
if(m_position.StopLossValue()-n_sl>m_step_modify) return m_position.StopLossValue(n_sl);
}
return false;
}
//+------------------------------------------------------------------+
//| >72@0I05B 4>AB83=CBK9 M:AB@5<C< F5=K 70 2@5<O C45@060=8O |
//| ?>78F88. ;O 4;8==>9 ?>78F88 1C45B 2>72@0I5=0 <0:A8<0;L=> |
//| 4>AB83=CB0O F5=0. ;O :>@>:B>9 - <8=8<0;L=0O F5=0, :>B>@0O 1K;0 |
//| 4>AB83=CB0. |
//+------------------------------------------------------------------+
double CTrailingClassic::FindExtremum(CPosition *pos)
{
double prices[];
if(pos.Direction()==POSITION_TYPE_BUY)
{
if(CopyHigh(pos.Symbol(),PERIOD_M1,pos.TimeOpen(),TimeCurrent(),prices)>1)
return prices[ArrayMaximum(prices)];
}
else
{
if(CopyLow(pos.Symbol(),PERIOD_M1,pos.TimeOpen(),TimeCurrent(),prices)>1)
return prices[ArrayMinimum(prices)];
}
return 0.0;
}
//+------------------------------------------------------------------+