- Код: выделить все
bool f_TrailingStairs(int par_Ticket, int par_TrailStop, int par_TrailStep, int par_BreakEven)
{
double dbl_Price, dbl_NewSL;
double dbl_ProfitMin = 0;
double dbl_TrailStop = par_TrailStop * Point;
double dbl_TrailStep = par_TrailStep * Point;
//---- Если длинная позиция (OP_BUY)
if(OrderType() == OP_BUY)
{
dbl_Price = Bid;
//---- безубыток для покупки
if(par_BreakEven > 0)
{
if((dbl_Price - OrderOpenPrice()) > Point * par_BreakEven)
{
//---- Модификация стопов в безубыток выполняется один раз
if((OrderStopLoss() - OrderOpenPrice()) < 0)
{
dbl_NewSL = OrderOpenPrice() + dbl_ProfitMin;
return(true);
}
}
}
if(par_TrailStop > 0)
{
if(dbl_Price - OrderOpenPrice() > dbl_TrailStop)
{
if(OrderStopLoss() < dbl_Price - (dbl_TrailStop + dbl_TrailStep))
{
dbl_NewSL = dbl_Price - dbl_TrailStop;
return (true);
}
}
}
}
//---- Если короткая позиция (OP_SELL)
if(OrderType() == OP_SELL)
{
dbl_Price = Ask;
double ld_Spread = Point * MarketInfo(Symbol(), MODE_SPREAD);
dbl_TrailStop += ld_Spread;
//---- безубыток для продажи
if(par_BreakEven > 0)
{
if((OrderOpenPrice() - dbl_Price) > Point * par_BreakEven + ld_Spread)
{
//---- Модификация стопов в безубыток выполняется один раз
if((OrderOpenPrice() - OrderStopLoss()) < 0)
{
dbl_NewSL = OrderOpenPrice() - dbl_ProfitMin;
return (true);
}
}
}
if(par_TrailStop > 0)
{
if(OrderOpenPrice() - dbl_Price > dbl_TrailStop)
{
if(OrderStopLoss() > dbl_Price + (dbl_TrailStop + dbl_TrailStep) || OrderStopLoss() == 0)
{
dbl_NewSL = dbl_Price + dbl_TrailStop;
return(true);
}
}
}
}
return(false);
}
В качестве параметров в функцию передается:
- Тикет ордера;
- Уровень, на котором срабатывает безубыток;
- Шаг трейлинга (минимальное приращение);
- Скользящий тейк-профит, ноль чтобы отключить его.
Пример инициализации переменных и вызова функции:
- Код: выделить все
void OnTick()
{
bool bolTral = false;
// передаем в качестве параметров:
int Ticket = 3576161;
int BreakEven = 30; // Уровень, на котором срабатывает БезУбыток до размера в ProfitMIN
int TrailStep = 5; // Шаг трейлинга (минимальное приращение)
int TrailStop = 50; // Скользящий тейк-профит, ноль чтобы отключить его
bolTral = f_TrailingStairs(Ticket, TrailStop, TrailStep, BreakEven);
}