//+------------------------------------------------------------------+
//| Input parameters |
//+------------------------------------------------------------------+
input int ZigZagDepth = 20; // Глубина зигзага
input double FiboLevel1 = 0.382; // Уровень Фибоначчи 38.2%
input double FiboLevel2 = 0.618; // Уровень Фибоначчи 61.8%
input int MA_Period = 50; // Период скользящей средней
input double LotSize = 0.1; // Размер лота
input int StopLossPips = 50; // Стоп-лосс в пипсах
input int TakeProfitPips = 100; // Тейк-профит в пипсах
input double RiskPercentage = 2.0; // Процент риска от депозита
//+------------------------------------------------------------------+
//| Global variables |
//+------------------------------------------------------------------+
double ZigZagHigh, ZigZagLow;
double FiboLevelHigh, FiboLevelLow;
int WaveDirection = 0; // Направление волны (1 - восходящая, -1 - нисходящая)
int ThirdWave = 0; // Флаг начала третьей волны
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Инициализация переменных
ZigZagHigh = High[0];
ZigZagLow = Low[0];
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Действия при удалении советника
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Определение направления волны
if(Close[0] > Close[1])
WaveDirection = 1; // Восходящая волна
else if(Close[0] < Close[1])
WaveDirection = -1; // Нисходящая волна
// Определение начала третьей волны
if(WaveDirection == 1 && High[0] > High[MA_Period])
ThirdWave = 1;
else if(WaveDirection == -1 && Low[0] < Low[MA_Period])
ThirdWave = 1;
// Определение зигзага
if(WaveDirection == 1 && High[0] > ZigZagHigh)
{
ZigZagHigh = High[0];
FiboLevelHigh = ZigZagHigh * (1 + FiboLevel1);
FiboLevelLow = ZigZagHigh * (1 - FiboLevel1);
}
else if(WaveDirection == -1 && Low[0] < ZigZagLow)
{
ZigZagLow = Low[0];
FiboLevelHigh = ZigZagLow * (1 + FiboLevel1);
FiboLevelLow = ZigZagLow * (1 - FiboLevel1);
}
// Условия для входа в сделку
if(ThirdWave == 1 && WaveDirection == 1 && High[0] > FiboLevelHigh)
{
// Открытие длинной позиции
double stopLoss = Bid - StopLossPips*_Point;
double takeProfit = Bid + TakeProfitPips*_Point;
double lot = CalculateLot(RiskPercentage, StopLossPips);
int ticket = OrderSend(Symbol(), OP_BUY, lot, Ask, 3, stopLoss, takeProfit, "Buy Order", 0, 0, Green);
}
else if(ThirdWave == 1 && WaveDirection == -1 && Low[0] < FiboLevelLow)
{
// Открытие короткой позиции
double stopLoss = Ask + StopLossPips*_Point;
double takeProfit = Ask - TakeProfitPips*_Point;
double lot = CalculateLot(RiskPercentage, StopLossPips);
int ticket = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, stopLoss, takeProfit, "Sell Order", 0, 0, Red);
}
}
//+------------------------------------------------------------------+
//| Функция расчета лота на основе процента риска |
//+------------------------------------------------------------------+
double CalculateLot(double riskPercentage, int stopLossPips)
{
double accountBalance = AccountEquity();
double riskAmount = accountBalance * riskPercentage / 100;
double stopLossValue = stopLossPips * _Point;
double lot = riskAmount / stopLossValue;
return(lot);
}