Реализация трейлинг-стопа ATR - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь реализовать индикатор трейлинг-стопа 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/

Спасибо!

...