Ilan_mql5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ilan_mql5_trail.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Программа представляет собой торговый советник для платформы MetaTrader 5, обрабатывающий событие OnTick и выполняющий торговые операции через API OrderSend. Она управляет позициями на одном инструменте, открывая и закрывая сделки в зависимости от изменения цены и настроенных параметров.
Советник поддерживает торговлю с увеличением лотов при наращивании числа позиций, а также функцию Trailing Stop для перемещения StopLoss при благоприятном движении цены. При открытии новых позиций автоматически устанавливается уровень TakeProfit.
Дополнительно реализована возможность аварийного закрытия позиции при достижении лимита по времени нахождения в сделке. Все торговые операции выполняются через стандартный механизм OrderSend с учётом проскальзывания и магического номера.
Настройки программы
| Настройка | Описание |
|---|---|
| TakeProfit ? ??????? (TakeProfit) | Тейк-профит — Уровень TakeProfit в пунктах для каждой новой сделки. |
| ?????? ???? ???????? ????? (PipStep) | Шаг в пунктах — Шаг в пунктах, при достижении которого открывается дополнительная сделка в противоположном направлении. |
| ????????? ????? ???? (Lots) | Размер лота — Начальный размер лота для первой сделки. |
| ?????????? ?????? ????? ??????? ? ?????? ???? (LotDecimal) | Число знаков лота — Количество знаков после запятой в размере лота для отображения и расчётов. |
| ?????????? ?????????? ?????? ???? (LotExponent) | Экспонент лота — Числовой коэффициент, определяющий степень увеличения размера лота при каждой новой позиции. |
| ?????????? ????? ????????? (MagicNumber) | Магический номер — Магический номер, идентифицирующий сделки, управляемые данным советником. |
| ???????????? ?????????? ???????? ????? (MaxTrades) | Максимум сделок — Максимальное количество одновременных сделок в рамках одной позиции. |
| ??????????????? (Slip) | Проскальзывание — Допустимое отклонение цены при выполнении торговых операций. |
| ???????????? TrailingStop (UseTrailingStop) | Использовать трейлинг-стоп — Переключатель, включающий или отключающий функцию автоматического перемещения StopLoss. |
| ??????? ? ???????, ??????????? ??? ?????? ????? (TrailStart) | Начало трейлинга — Прибыть в пунктах, при достижении которой активируется перемещение StopLoss. |
| StopLoss ? ???????, ???????????? ??? ????? (TrailStop) | Трейлинг-стоп — Расстояние в пунктах от текущей цены до StopLoss при работе трейлинг-стопа. |
Поиск по коду файла
#property version "1.00"
input double TakeProfit = 10; // TakeProfit ? ???????
input double PipStep = 30; // ?????? ???? ???????? ?????
input double Lots = 0.10; // ????????? ????? ????
input int LotDecimal = 1; // ?????????? ?????? ????? ??????? ? ?????? ????
input double LotExponent = 1.70; // ?????????? ?????????? ?????? ????
input int MagicNumber = 70707; // ?????????? ????? ?????????
input int MaxTrades = 8; // ???????????? ?????????? ???????? ?????
input int Slip = 3; // ???????????????
input bool UseTrailingStop = false; // ???????????? TrailingStop
input int TrailStart = 10; // ??????? ? ???????, ??????????? ??? ?????? ?????
input int TrailStop = 10; // StopLoss ? ???????, ???????????? ??? ?????
/*input*/ bool UseEquityStop = false; // ???????????? ??????????? ?? ??????
/*input*/ double TotalEquityRisk = 50.0; // ???????????? ?????? ? ????????? ?? ????????
/*input*/ bool UseTimeOut = false; // ???????????? ??????????? ?? ????? ????? ???????
/*input*/ double MaxTradeOpenHours = 48; // ???????????? ????? ????? ??????? ? ?????
double Spread;
string ExpertName = "Ilan_mql5";
datetime Expiration;
double LotSize;
int i = 0, Total;
bool TradeNow = false, LongTrade = false, ShortTrade = false;
int Ticket = 0;
bool NewOrdersPlaced = false;
double LastBuyPrice, LastSellPrice;
double iTakeProfit, iPipStep;
int iTrailStart, iTrailStop;
long PositionID = 0; // ????????????? ???????? ???????
bool Position = false; // true - ???? ???????? ???????, false - ???
double OpenPrice; // ???? ???????? ???????
double OldOpenPrice = 0; // ????????? ???? ???????? ???????
MqlTick LastPrices; // ????????? ??? ????????? ????????? ??????? ??????
MqlTradeRequest Request; // ????????? ??? ???????? ?????? ???????? OrderSend()
MqlTradeResult Result; // ????????? ? ??????????? ???????? ???????? ??????
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
return;
}
void OnTick()
{
// код доступен только после оплаты
}
if (UseTrailingStop)
TrailPosition(iTrailStart, iTrailStop);
if (UseTimeOut && TimeCurrent() >= Expiration)
{
Print("????? ????? ??????? ???????, ?????????????? ???????? ???????");
ClosePosition(); // ????????? ???????
}
long TickVolume[1]; // ?????? ??? ???????? ?????? ?????????? ????
if (CopyTickVolume(_Symbol, _Period, 0, 1, TickVolume) != 1)
{
Print("?? ??????? ???????? ?????????? ????? ?? ??????? ????");
return;
}
if (TickVolume[0] > 1) return;
if (UseEquityStop)
{
double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
double AccountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
if (AccountEquity <= AccountBalance * (1 - TotalEquityRisk / 100))
{
Print("???????? ", TotalEquityRisk, "% ????????, ?????????????? ???????? ???????");
ClosePosition();
}
}
if (!PositionSelect(_Symbol)) // ??? ????? ???????
{
Position = false;
}
else // ???? ???? ???????
{
Position = true;
PositionID = PositionGetInteger(POSITION_IDENTIFIER); // ????????????? ???????
}
if (Position) // ???? ???? ???????? ???????
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // ??????? Buy
{
LongTrade = true;
ShortTrade = false;
}
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // ??????? Sell
{
LongTrade = false;
ShortTrade = true;
}
}
if (Position) Total = CountTrades(PositionID);
else Total = 0;
if (Position && (Total > 0 && Total <= MaxTrades))
{
LastBuyPrice = FindLastBuyPrice(PositionID);
LastSellPrice = FindLastSellPrice(PositionID);
if (SymbolInfoTick(_Symbol, LastPrices)) // ??????? ? LastPrices ????????? ????
{
if (LongTrade && LastBuyPrice - LastPrices.ask >= iPipStep * _Point) // ???? ???? ????
TradeNow = true;
if (ShortTrade && LastPrices.bid - LastSellPrice >= iPipStep * _Point) // ???? ???? ?????
TradeNow = true;
}
} // if (Total > 0 && Total <= MaxTrades)
if (!Position)
{
ShortTrade = false;
LongTrade = false;
TradeNow = true;
}
if (Position && TradeNow)
{
LotSize = NormalizeDouble(Lots * MathPow(LotExponent, Total), LotDecimal);
Request.action = TRADE_ACTION_DEAL; // ??????????? ?????????? ??????
Request.symbol = _Symbol; // ???????? ??????????
Request.volume = LotSize; // ????? ????
Request.sl = 0; // StopLoss
Request.tp = 0; // TakeProfit
Request.deviation = Slip; // ???????????????
Request.type_filling = ORDER_FILLING_AON; // ??? ?????? ?? ??????????
Request.magic = MagicNumber; // ?????????? ?????
if (!SymbolInfoTick(_Symbol, LastPrices))
{
Print("?? ??????? ???????? ????????? ??????? ??????");
return;
}
if (ShortTrade) // Sell - ?????
{
Request.price = ND(LastPrices.bid); // ???? ???????
Request.type = ORDER_TYPE_SELL; // ??? ??????
if (!OrderSend(Request, Result))
{
Print("?? ??????? ??????? ????? Sell, ??? ?????? ", Result.retcode);
return;
}
TradeNow = false;
NewOrdersPlaced = true; // ????? ????? ??????
}
else if (LongTrade) // Buy - ?????
{
Request.price = ND(LastPrices.ask); // ???? ???????
Request.type = ORDER_TYPE_BUY; // ??? ??????
if (!OrderSend(Request, Result))
{
Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
return;
}
TradeNow = false;
NewOrdersPlaced = true; // ????? ????? ??????
}
} // if (TradeNow)
if (!Position && TradeNow) // ???? ??? ???????? ???????
{
MqlRates Rates[1];
if (CopyRates(_Symbol, _Period, 1, 1, Rates) != 1)
{
Print("?? ??????? ???????? ??????? ?????? ??? ?????????? ?????");
return;
}
if (!ShortTrade && !LongTrade)
{
LotSize = NormalizeDouble(Lots * MathPow(LotExponent, Total), LotDecimal);
Request.action = TRADE_ACTION_DEAL; // ??????????? ?????????? ??????
Request.symbol = _Symbol; // ???????? ??????????
Request.volume = LotSize; // ????? ????
Request.sl = 0; // StopLoss
Request.tp = 0; // TakeProfit
Request.deviation = Slip; // ???????????????
Request.type_filling = ORDER_FILLING_AON; // ??? ?????? ?? ??????????
Request.magic = MagicNumber; // ?????????? ?????
if (!SymbolInfoTick(_Symbol, LastPrices))
{
Print("?? ??????? ???????? ????????? ??????? ??????");
return;
}
if (Rates[0].open > Rates[0].close) // ???? ????????? ????? ?????? - ???????
{
Request.price = ND(LastPrices.bid); // ???? ???????
Request.type = ORDER_TYPE_SELL; // ??? ??????
if (!OrderSend(Request, Result))
{
Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
return;
}
NewOrdersPlaced = true; // ????? ????? ??????
}
else // ???? ????????? ????? ????? - ????????
{
Request.price = ND(LastPrices.ask); // ???? ???????
Request.type = ORDER_TYPE_BUY; // ??? ??????
if (!OrderSend(Request, Result))
{
Print("?? ??????? ??????? ?????, ??? ?????? ", Result.retcode);
return;
}
NewOrdersPlaced = true; // ????? ????? ??????
}
} // if (!ShortTrade && !LongTrade)
if (NewOrdersPlaced)
Expiration = (datetime)(TimeCurrent() + PeriodSeconds(PERIOD_H1) * MaxTradeOpenHours);
TradeNow = false;
} // if (!Position && TradeNow)
if (NewOrdersPlaced)
{
if (!PositionSelect(_Symbol)) return; // ??? ????? ???????
double CurrStopLoss = PositionGetDouble(POSITION_SL); // StopLoss ???????
OpenPrice = PositiПоказано первые 50% кода (символов: 12799)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.