Я пытаюсь реализовать индикатор трейлинг-стопа ATR в MQL5. Компилятор не выдает никаких ошибок, но на графике ничего не отображается, и значение индикатора не меняется.
Стоп-лосс = ATR x множитель
// ATR railing stop
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 1
// plot ATR stop
#property indicator_type1 DRAW_LINE
#property indicator_color1 Blue
#property indicator_style1 STYLE_SOLID
#property indicator_label1 "ATR stop"
// input parameters for ATR stop
input int ATR_period = 14; // ATR length / period
input int ATR_stop_multiplier = 2; // ATR stop multiplier
// indicator buffers
double ATRstopBuffer[];
double ATRBuffer[];
double StopLossBuffer[];
// initializacion function
int OnInit()
{
SetIndexBuffer(0, ATRstopBuffer, INDICATOR_DATA);
SetIndexBuffer(1, ATRBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(2, StopLossBuffer, INDICATOR_CALCULATIONS);
hATR = iATR(_Symbol,_Period, ATR_period);
return(INIT_SUCCEEDED);
}
// iteration function
int OnCalculate(
const int rates_total,
const int prev_calculated,
const int begin,
const double& price[])
{
if(rates_total < ATR_period) return(0);
if(prev_calculated == 0)
{
ATRstopBuffer[0] = 0.0;
StopLossBuffer[0] = 0.0;
}
int start;
if(prev_calculated == 0) start = 1;
else start = prev_calculated - 1;
for(int i = start; i < rates_total; i++)
{
ATRBuffer[i] = iATR(NULL, 0, ATR_period);
StopLossBuffer[i] = ATRBuffer[i] * ATR_stop_multiplier;
}
if(prev_calculated == 0) start = ATR_period + 1;
for(int i = ATR_period - 1; i < rates_total; i++)
{
// if trend is up plot max(previous stop, current stop)
if(price[i] >= ATRstopBuffer[i - 1] && price[i - 1] >= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = MathMax(ATRstopBuffer[i - 1], (price[i] - StopLossBuffer[i]));
// if trend is down plot min(previous stop, current stop)
if(price[i] <= ATRstopBuffer[i - 1] && price[i - 1] <= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = MathMin(ATRstopBuffer[i - 1], (price[i] + StopLossBuffer[i]));
// if trend change up plot current stop
if(price[i] >= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = price[i] - StopLossBuffer[i];
// if trend change down plot current stop
if(price[i] <= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = price[i] + StopLossBuffer[i];
}
return(rates_total);
}
Пожалуйста, перейдите по этой ссылке чтобы увидеть индикатор на TradingView: https://www.tradingview.com/script/mfBzZMD5-CDC-ATR-Trailing-Stop-V1/
Спасибо!