TrailMe
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «trailme.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
TrailMe — это торговый советник для MetaTrader 4, предназначенный для управления стоп-лоссами открытых позиций. Советник автоматически перемещает защитные уровни в зависимости от текущей прибыли, используя выбранный метод трейлинга. Он не открывает новые сделки, а только корректирует параметры уже существующих ордеров.
Программа поддерживает несколько режимов трейлинга: стандартный по пипсам, на основе средней дневной волатильности (ADR) с настраиваемым делителем, а также пошаговое перемещение стопа через заданные интервалы прибыли. Доступна функция переноса стоп-лосса на безубыток после достижения определённого уровня прибыли.
При запуске советник проверяет открытые позиции на текущем символе, при необходимости устанавливает начальные уровни стоп-лосса и тейк-профита для ручных сделок, где они ещё не заданы, и отображает на графике информацию о дневном диапазоне, текущих параметрах управления рисками и состоянии позиций.
Настройки программы
| Настройка | Описание |
|---|---|
| SL_TP_Trail_Options | Параметры SL/TP и трейлинга — Текстовый разделитель для группировки параметров начальных уровней и трейлинга |
Поиск по коду файла
extern string SL_TP_Trail_Options="--------------------------";
extern int StopLoss.Pips=30; // Initial s/l. Used by procedure CheckInitialSLTP if manual trade has no initial S/L.
extern int TakeProfit.Pips=60; // Initial take profit - also used by CheckInitialSLTP if manual trade has no T/P
extern int Trail.Pips=0; // trail.pips. Unused if Use.Adr.for.sl.pips=true or if value=0
extern bool Trail.Starts.After.BreakEven=false; // if true trailing will start after a profit of "Move.To.BreakEven.at.pips" is made
extern int Move.To.BreakEven.at.pips=0; // trades in profit will move to entry price + Move.To.BreakEven.Lock.pips as soon as trade is at entry price + Move.To.BreakEven.at.pips
extern int Move.To.BreakEven.Lock.pips=1;
extern int Move.Trail.Every.xx.Pips=0; // If > 0 then ALL other s/l are dropped and trail will only move by Trail.Pips amount for every "Move.Trail.Every.Pips" in profit
extern bool Use.ADR.for.SL.pips=false; // if true s/l and trail according to average daily range and tsl.divisor
extern double tsl.divisor=0.40;
int b.ticket, s.ticket,slip, TodaysRange;
string DR, DR1, comment=" TrailMe",ScreenComment="TrailMe";
double avg.rng, rng, sum.rng, x;
bool TradingEnabled, LongTradeEnabled, ShortTradeEnabled, ShortTradeShouldClose, LongTradeShouldClose;
double TPPrice;
int init()
{
// код доступен только после оплаты
}
int deinit()
{ return(0);
}
int start()
{
// код доступен только после оплаты
}
void PosCounter()
{ b.ticket=0;s.ticket=0;
for (int cnt=0;cnt<=OrdersTotal();cnt++)
{ OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol()==Symbol())
{ if (OrderType()==OP_SELL)
{ s.ticket=OrderTicket();
}
if (OrderType()==OP_BUY)
{ b.ticket=OrderTicket();
}
}
}
}
void Trail.With.ADR(int AfterBE)
{ double bsl, b.tsl, ssl, s.tsl;
PosCounter();
if (AfterBE==0) // Trail Starts immediately
{ if(b.ticket>0)
{ bsl=NormalizeDouble(x,Digits);
b.tsl=0;
OrderSelect(b.ticket,SELECT_BY_TICKET);
if (OrderStopLoss()<OrderOpenPrice() && OrderOpenPrice()-OrderStopLoss()<x)
{ bsl=OrderOpenPrice()-OrderStopLoss();
}
if (OrderStopLoss()<OrderOpenPrice() && OrderOpenPrice()-OrderStopLoss()>=x)
{ bsl=NormalizeDouble(x,Digits);
}
if (Bid>(OrderOpenPrice()+bsl) && OrderStopLoss()<(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl))))
{ b.tsl=NormalizeDouble(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl)),Digits);
Print("b.tsl ",b.tsl);
if (OrderStopLoss()<b.tsl)
{ OrderModify(b.ticket,OrderOpenPrice(),b.tsl,OrderTakeProfit(),OrderExpiration(),MediumSpringGreen);
}
}
}
if(s.ticket>0)
{ ssl=NormalizeDouble(x,Digits);
s.tsl=0;
OrderSelect(s.ticket,SELECT_BY_TICKET);
if (OrderStopLoss()>OrderOpenPrice() && OrderStopLoss()-OrderOpenPrice()<x)
{ ssl=OrderStopLoss()-OrderOpenPrice();
}
if (OrderStopLoss()>OrderOpenPrice() && OrderStopLoss()-OrderOpenPrice()>=x)
{ ssl=NormalizeDouble(x,Digits);
}
if (Ask<(OrderOpenPrice()-ssl) && OrderStopLoss()>(OrderOpenPrice()-(OrderOpenPrice()-ssl)-Ask))
{ s.tsl=NormalizeDouble(OrderOpenPrice()-((OrderOpenPrice()-ssl)-Ask),Digits);
Print("s.tsl ",s.tsl);
if(OrderStopLoss()>s.tsl)
{ OrderModify(s.ticket,OrderOpenPrice(),s.tsl,OrderTakeProfit(),OrderExpiration(),MediumVioletRed);
}
}
}
}
else // If Trail.Starts.After.BreakEven
{ if (b.ticket>0)
{ bsl=NormalizeDouble(x,Digits);
b.tsl=0;
OrderSelect(b.ticket,SELECT_BY_TICKET);
if (Bid>=(OrderOpenPrice()+(Move.To.BreakEven.at.pips*Point)))
{ //if stoploss is less than minimum wave range, set bsl to current SL
if (OrderStopLoss()<OrderOpenPrice() && OrderOpenPrice()-OrderStopLoss()<x)
{ bsl=OrderOpenPrice()-OrderStopLoss();
}
if (OrderStopLoss()<OrderOpenPrice() && OrderOpenPrice()-OrderStopLoss()>=x)
{ bsl=NormalizeDouble(x,Digits);
}
if (Bid>(OrderOpenPrice()+bsl) && OrderStopLoss()<(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl))))
{ b.tsl=NormalizeDouble(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl)),Digits);
Print("b.tsl ",b.tsl);
if (OrderStopLoss()<b.tsl)
{ OrderModify(b.ticket,OrderOpenPrice(),b.tsl,OrderTakeProfit(),OrderExpiration(),MediumSpringGreen);
}
}
}
}
if (s.ticket>0)
{ ssl=NormalizeDouble(x,Digits);
s.tsl=0;
OrderSelect(s.ticket,SELECT_BY_TICKET);
if (Ask<=(OrderOpenPrice()-(Move.To.BreakEven.at.pips*Point)))
{ //if stoploss is less than minimum wave range, set ssl to current SL
if(OrderStopLoss()>OrderOpenPrice() && OrderStopLoss()-OrderOpenPrice()<x)
{ ssl=OrderStopLoss()-OrderOpenPrice();
}
if(OrderStopLoss()>OrderOpenPrice() && OrderStopLoss()-OrderOpenPrice()>=x)
{ ssl=NormalizeDouble(x,Digits);
}
if(Ask<(OrderOpenPrice()-ssl) && OrderStopLoss()>(OrderOpenPrice()-(OrderOpenPrice()-ssl)-Ask))
{ s.tsl=NormalizeDouble(OrderOpenPrice()-((OrderOpenPrice()-ssl)-Ask),Digits);
Print("s.tsl ",s.tsl);
if(OrderStopLoss()>s.tsl)
{ OrderModify(s.ticket,OrderOpenPrice(),s.tsl,OrderTakeProfit(),OrderExpiration(),MediumVioletRed);
}
}
}
}
}
}
void Trail.With.Standard.Trailing(int AfterBE)
{ double bsl, b.tsl, ssl, s.tsl;
PosCounter();
if (AfterBE==0)
{ if (b.ticket>0)
{ bsl=Trail.Pips*Point;
OrderSelect(b.ticket,SELECT_BY_TICKET);
if(Bid>(OrderOpenPrice()+bsl) && OrderStopLoss()<(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl))))
{ b.tsl=NormalizeDouble(OrderOpenPrice()+(Bid-(OrderOpenPrice()+bsl)),Digits);
Print("b.tsl ",b.tsl);
if (OrderStopLoss()<b.tsl)
{ OrderModify(b.ticket,OrderOpenPrice(),b.tsl,OrderTakeProfit(),OrderExpiration(),MediumSpringGreen);
}
}
}
if(s.ticket>0)
{ ssl=Trail.Pips*Point;
OrderSelect(s.ticket,SELECT_BY_TICKET);
if (Ask<(OrderOpenPrice()-ssl) && OrderStopLoss()>(OrderOpenPrice()-(OrderOpenPrice()-ssl)-Ask))
Показано первые 50% кода (символов: 11365)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.