Chandelier Exit MT5 code into ProRealTime code

Forums ProRealTime English forum ProBuilder support Chandelier Exit MT5 code into ProRealTime code

Viewing 3 posts - 1 through 3 (of 3 total)
  • #109188

    Hi Can you please help translating the below to ProRealTime code. Thanks

    #property indicator_chart_window
    #property indicator_buffers 8
    #property indicator_plots   8
    #property indicator_type1   DRAW_LINE
    #property indicator_color1  clrDeepSkyBlue
    #property indicator_style1  STYLE_DOT
    #property indicator_type2   DRAW_LINE
    #property indicator_style2  STYLE_DOT
    #property indicator_color2  clrPaleVioletRed
    #property indicator_type3   DRAW_LINE
    #property indicator_color3  clrDeepSkyBlue
    #property indicator_type4   DRAW_LINE
    #property indicator_color4  clrPaleVioletRed
    #property indicator_type5   DRAW_ARROW
    #property indicator_color5  clrDeepSkyBlue
    #property indicator_type6   DRAW_ARROW
    #property indicator_color6  clrPaleVioletRed
    #property indicator_type7   DRAW_ARROW
    #property indicator_color7  clrDeepSkyBlue
    #property indicator_type8   DRAW_ARROW
    #property indicator_color8  clrPaleVioletRed

    //— input parameters

    input int     AtrPeriod      =  22// Atr period
    input double  AtrMultiplier1 = 3.0// Atr 1st multiplier
    input double  AtrMultiplier2 = 4.5// Atr 2nd multiplier
    input int     LookBackPeriod =  22// Look-back period

    double UplBuffer1[],UpdBuffer1[],DnlBuffer1[],DndBuffer1[],UplBuffer2[],UpdBuffer2[],DnlBuffer2[],DndBuffer2[];
    //+——————————————————————+
    //| Custom indicator initialization function                         |
    //+——————————————————————+
    int OnInit()
    {
    //— indicator buffers mapping
    SetIndexBuffer(0,UplBuffer1,INDICATOR_DATA);
    SetIndexBuffer(1,DnlBuffer1,INDICATOR_DATA);
    SetIndexBuffer(2,UplBuffer2,INDICATOR_DATA);
    SetIndexBuffer(3,DnlBuffer2,INDICATOR_DATA);
    SetIndexBuffer(4,UpdBuffer1,INDICATOR_DATA); PlotIndexSetInteger(4,PLOT_ARROW,159);
    SetIndexBuffer(5,DndBuffer1,INDICATOR_DATA); PlotIndexSetInteger(5,PLOT_ARROW,159);
    SetIndexBuffer(6,UpdBuffer2,INDICATOR_DATA); PlotIndexSetInteger(6,PLOT_ARROW,159);
    SetIndexBuffer(7,DndBuffer2,INDICATOR_DATA); PlotIndexSetInteger(7,PLOT_ARROW,159);
    return (INIT_SUCCEEDED);
    }
    //
    //
    //
    void OnDeinit(const int reason)
    {
    }
    //+——————————————————————+
    //| Work array                                                       |
    //+——————————————————————+
    double  work[][6];
    #define _hi1    0
    #define _lo1    1
    #define _hi2    2
    #define _lo2    3
    #define _trend1 4
    #define _trend2 5
    //+——————————————————————+
    //| Custom indicator iteration function                              |
    //+——————————————————————+
    int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    {
    if(Bars(_Symbol,_Period)<rates_total) return(prev_calculated);
    if(ArrayRange(work,0)!=rates_total) ArrayResize(work,rates_total);

    int i=(int)MathMax(prev_calculated-1,1); for(; i<rates_total && !_StopFlag; i++)
    {
    UplBuffer1[i] = UpdBuffer1[i] = DnlBuffer1[i] = DndBuffer1[i] = EMPTY_VALUE;
    UplBuffer2[i] = UpdBuffer2[i] = DnlBuffer2[i] = DndBuffer2[i] = EMPTY_VALUE;

    //
    //——————-
    //

    int  _start = MathMax(i-LookBackPeriod,0);
    double _atr = 0for(int k=1; k<=AtrPeriod && (i-k-1)>=0; k++) _atr += MathMax(high[i-k],close[MathMax(i-k-1,0)])- MathMin(low[i-k],close[MathMax(i-k-1,0)]); _atr/=(double)AtrPeriod;
    double _max = high[ArrayMaximum(high,_start,LookBackPeriod)];
    double _min = low [ArrayMinimum(low ,_start,LookBackPeriod)];

    work[i][_hi1]    = _max-AtrMultiplier1*_atr;
    work[i][_lo1]    = _min+AtrMultiplier1*_atr;
    work[i][_hi2]    = _max-AtrMultiplier2*_atr;
    work[i][_lo2]    = _min+AtrMultiplier2*_atr;
    work[i][_trend1] = (i>0) ? work[i-1][_trend1] : 0;
    work[i][_trend2] = (i>0) ? work[i-1][_trend2] : 0;
    if(i>0)
    {
    if(close[i] > work[i-1][_lo1]) work[i][_trend1]=  1;
    if(close[i] < work[i-1][_hi1]) work[i][_trend1]= –1;
    if(close[i] > work[i-1][_lo2]) work[i][_trend2]=  1;
    if(close[i] < work[i-1][_hi2]) work[i][_trend2]= –1;

    if(AtrMultiplier1>0 && work[i][_trend1] ==  1) { if(work[i][_hi1]<work[i-1][_hi1]) work[i][_hi1]=work[i-1][_hi1]; UplBuffer1[i] = work[i][_hi1]; if(UplBuffer1[i-1]==EMPTY_VALUE) UpdBuffer1[i]=UplBuffer1[i];}
    if(AtrMultiplier1>0 && work[i][_trend1] == –1) { if(work[i][_lo1]>work[i-1][_lo1]) work[i][_lo1]=work[i-1][_lo1]; DnlBuffer1[i] = work[i][_lo1]; if(DnlBuffer1[i-1]==EMPTY_VALUE) DndBuffer1[i]=DnlBuffer1[i];}
    if(AtrMultiplier2>0 && work[i][_trend2] ==  1) { if(work[i][_hi2]<work[i-1][_hi2]) work[i][_hi2]=work[i-1][_hi2]; UplBuffer2[i] = work[i][_hi2]; if(UplBuffer2[i-1]==EMPTY_VALUE) UpdBuffer2[i]=UplBuffer2[i];}
    if(AtrMultiplier2>0 && work[i][_trend2] == –1) { if(work[i][_lo2]>work[i-1][_lo2]) work[i][_lo2]=work[i-1][_lo2]; DnlBuffer2[i] = work[i][_lo2]; if(DnlBuffer2[i-1]==EMPTY_VALUE) DndBuffer2[i]=DnlBuffer2[i];}
    }
    }
    return (i);
    }
    //+——————————————————————+

    #109229

    Please use the form on this page and follow the instructions when asking for a code translation: Ask for a free code conversion

    #192528

    That’s a chandelier exit, PRT version is located here: https://www.prorealcode.com/prorealtime-indicators/another-atr-trailing-stop/

Viewing 3 posts - 1 through 3 (of 3 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login