UTE/Impulse 2.0.mq5

187 lines
18 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Impulse 2.0.mqh |
//| Copyright 2016, Vasiliy Sokolov, St-Petersburg, Russia |
//| https://www.mql5.com/ru/users/c-4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "https://www.mql5.com/ru/users/c-4"
#include "Strategy\Strategy.mqh"
#include "Strategy\Indicators.mqh"
input int PeriodMA = 12;
input double StopPercent = 0.05;
//+------------------------------------------------------------------+
//| !B@0B538O CImpulse |
//+------------------------------------------------------------------+
class CImpulse : public CStrategy
{
private:
double m_percent; // @>F5=B C@>2=O >B;>65==>3> >@45@0
protected:
virtual void InitBuy(const MarketEvent &event);
virtual void InitSell(const MarketEvent &event);
virtual void SupportBuy(const MarketEvent &event,CPosition *pos);
virtual void SupportSell(const MarketEvent &event,CPosition *pos);
virtual void SupportPendingBuy(const MarketEvent &event,CPendingOrder *order);
virtual void SupportPendingSell(const MarketEvent &event,CPendingOrder* order);
virtual bool OnInit(void);
public:
double GetPercent(void);
void SetPercent(double percent);
CUnIndicator UnMA;
};
//+------------------------------------------------------------------+
//| =8F80;878@C5< A:>;L7OICN A@54=NN |
//+------------------------------------------------------------------+
bool CImpulse::OnInit(void)
{
UnMA.SetParameter(12);
UnMA.SetParameter(0);
UnMA.SetParameter(MODE_SMA);
UnMA.SetParameter(PRICE_CLOSE);
m_percent = StopPercent;
if(UnMA.Create(Symbol(), Period(), IND_MA) != INVALID_HANDLE)
return true;
return false;
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 >B;>65==KE >@45@>2 BuyStop |
//+------------------------------------------------------------------+
void CImpulse::InitBuy(const MarketEvent &event)
{
if(!IsTrackEvents(event))return; // !>7405< >B;>65==K5 >@45@0 B>;L:> =0 >B:@KB88 =>2>3> 10@0
if(PositionsTotal(POSITION_TYPE_BUY, ExpertSymbol(), ExpertMagic()) > 0) // 5 4>;6=> 1KBL >B:@KB> =8 >4=>9 4;8==>9 ?>78F88
return;
if(OrdersTotal(POSITION_TYPE_BUY, ExpertSymbol(), ExpertMagic()) > 0) // 5 4>;6=> 1KBL =8 >4=>3> >B;>65==>3> >@45@0 =0 ?>:C?:C
return;
double target = WS.Ask() + WS.Ask()*(m_percent/100.0); // 0AAG8BK205< C@>25=L =>2>3> >B;>65==>3> >@45@0
if(target < UnMA[0]) // &5=0 A@010BK20=8O >@45@0 4>;6=0 1KBL 2KH5 A:>;L7OI59 A@54=59
return;
Trade.BuyStop(MM.GetLotFixed(), target, ExpertSymbol(), 0, 0, NULL); // #AB0=02;8205< =>2K9 BuyStop >@45@
}
//+------------------------------------------------------------------+
//| 01>B0 A >B;>65==K<8 >@45@0<8 BuyStop 4;O >B:@KB8O 4;8==>9 |
//| ?>78F88 |
//+------------------------------------------------------------------+
void CImpulse::SupportPendingBuy(const MarketEvent &event,CPendingOrder *order)
{
if(!IsTrackEvents(event))return;
double target = WS.Ask() + WS.Ask()*(m_percent/100.0); // 0AAG8BK205< =>2K9 C@>25=L >B;>65==>3> >@45@0
if(UnMA[0] > target) // A;8 =>2K9 C@>25=L =865 B5:CI59 A@54=59
order.Delete(); // - C40;O5< 53>
else //  ?@>B82=>< A;CG05 <>48D8F8@C5< =0 =>2CN F5=C
order.Modify(target);
}
//+------------------------------------------------------------------+
//| 01>B0 A >B;>65==K<8 >@45@0<8 SellStop 4;O >B:@KB8O :>@>B:>9 |
//| ?>78F88 |
//+------------------------------------------------------------------+
void CImpulse::SupportPendingSell(const MarketEvent &event,CPendingOrder* order)
{
if(!IsTrackEvents(event))return;
double target = WS.Ask() - WS.Ask()*(m_percent/100.0); // 0AAG8BK205< =>2K9 C@>25=L >B;>65==>3> >@45@0
if(UnMA[0] < target) // A;8 =>2K9 C@>25=L 2KH5 B5:CI59 A@54=59
order.Delete(); // - C40;O5< 53>
else //  ?@>B82=>< A;CG05 <>48D8F8@C5< =0 =>2CN F5=C
order.Modify(target);
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 >B;>65==KE >@45@>2 SellStop |
//+------------------------------------------------------------------+
void CImpulse::InitSell(const MarketEvent &event)
{
if(!IsTrackEvents(event))return; // !>7405< >B;>65==K5 >@45@0 B>;L:> =0 >B:@KB88 =>2>3> 10@0
if(PositionsTotal(POSITION_TYPE_SELL, ExpertSymbol(), ExpertMagic()) > 0) // 5 4>;6=> 1KBL >B:@KB> =8 >4=>9 :>@>B:>9 ?>78F88
return;
if(OrdersTotal(POSITION_TYPE_SELL, ExpertSymbol(), ExpertMagic()) > 0) // 5 4>;6=> 1KBL =8 >4=>3> >B;>65==>3> >@45@0 =0 ?@>406C
return;
double target = WS.Bid() - WS.Bid()*(m_percent/100.0); // 0AAG8BK205< C@>25=L =>2>3> >B;>65==>3> >@45@0
if(target > UnMA[0]) // &5=0 A@010BK20=8O >@45@0 4>;6=0 1KBL =865 A:>;L7OI59 A@54=59
return;
Trade.SellStop(MM.GetLotFixed(), target, ExpertSymbol(), 0, 0, NULL); // #AB0=02;8205< =>2K9 BuyStop >@45@
}
//+------------------------------------------------------------------+
//| !>?@>2>645=85 4;8==>9 ?>78F88 ?> A:>;L7OI59 A@54=59 Moving |
//+------------------------------------------------------------------+
void CImpulse::SupportBuy(const MarketEvent &event,CPosition *pos)
{
int bar_open = WS.IndexByTime(pos.TimeOpen());
if(!IsTrackEvents(event))return;
ENUM_ACCOUNT_MARGIN_MODE mode = (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
if(mode != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
double target = WS.Bid() - WS.Bid()*(m_percent/100.0);
if(target < UnMA[0])
pos.StopLossValue(target);
else
pos.StopLossValue(0.0);
}
if(WS.Bid() < UnMA[0])
pos.CloseAtMarket();
}
//+------------------------------------------------------------------+
//| !>?@>2>645=85 :>@>B:>9 ?>78F88 ?> A:>;L7OI59 A@54=59 Moving |
//+------------------------------------------------------------------+
void CImpulse::SupportSell(const MarketEvent &event,CPosition *pos)
{
if(!IsTrackEvents(event))return;
ENUM_ACCOUNT_MARGIN_MODE mode = (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
if(mode != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
double target = WS.Ask() + WS.Ask()*(m_percent/100.0);
if(target > UnMA[0])
pos.StopLossValue(target);
else
pos.StopLossValue(0.0);
}
if(WS.Ask() > UnMA[0])
pos.CloseAtMarket();
}
//+------------------------------------------------------------------+
//| >72@0I05B ?@>F5=B ?@>1>9=>3> C@>2=O |
//+------------------------------------------------------------------+
double CImpulse::GetPercent(void)
{
return m_percent;
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B ?@>F5=B ?@>1>9=>3> C@>2=O |
//+------------------------------------------------------------------+
void CImpulse::SetPercent(double percent)
{
m_percent = percent;
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
CImpulse* impulse = new CImpulse();
impulse.ExpertMagic(140578);
impulse.ExpertName("Impulse 2.0");
impulse.Timeframe(Period());
impulse.ExpertSymbol(Symbol());
Manager.AddStrategy(impulse);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
Manager.OnTick();
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
Manager.OnChartEvent(id, lparam, dparam, sparam);
ChartRedraw(0);
}