Buy Low Sell High Composite. Conversion from pinescript to PRT

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #256709 quote
    Pedro.lopez
    Participant
    New

    Hola, compañer@s. Os agradezco pudierais echarme una mano con la conversión a PRT del indicador en Pinescript del indicador “Buy Low Sell High Composite” creado por zacmcc (https://www.tradingview.com/script/turEX2Ly-Buy-Low-Sell-High-Composite/). He intentado hacer la conversión pero los resultados de mi script en PRT son diferentes al indicador original y no soy capaz de ver donde me he equivocado por mucho que revise el código. A ver si podéis decirme donde me he equivocado.

    Mi script en PRT es el siguiente (veréis que por la organización del script no soy programador/desarrollador así que es muy fácil que me haya equivocado en algún punto),

    ATRLENGTH=9
    RSILENGTH=14
    EMA1LENGTH=5
    EMAL2ENGTH=35
    MACDFAST=12
    MACDSLOW=26
    MACDSIGNAL1=9
    SUMA=14
    SRC=CUSTOMCLOSE
    
    ATRVALUE=AverageTrueRange[ATRLENGTH](SRC)
    PRICERANGE=2*ATRVALUE
    //NORMALIZER FUNCTION-------------------------------------------------------
    //Normalize(value, minValue, maxValue) =>
    //range = maxValue - minValue == 0 ? 0.0001 : maxValue - minValue
    //-1 + (((value - minValue) / range) * 2)
    //--------------------------------------------------------------------------
    //NORMALIZED RSI------------------------------------------------------------
    //--------------------------------------------------------------------------
    RSIVALUE=RSI[14](SRC)
    RSIRANGE=75-25
    NRSIVALUE=-1+(((RSIVALUE-25)/RSIRANGE)*2)
    IF NRSIVALUE<=0 THEN
       RSIR=255
       RSIG=165
       RSIB=0
    ELSE
       RSIR=255
       RSIG=255
       RSIB=0
    ENDIF
    //--------------------------------------------------------------------------
    //NORMALIZED EMA------------------------------------------------------------
    //--------------------------------------------------------------------------
    EMADIFFF=AVERAGE[EMA1LENGTH,1](SRC)-AVERAGE[EMAL2ENGTH,1](SRC)
    NEMADIFF=-1+(((EMADIFFF-(-PRICERANGE))/PRICERANGE)*2)
    //--------------------------------------------------------------------------
    //NORMALIZED NACD-----------------------------------------------------------
    //--------------------------------------------------------------------------
    FASTEMA=AVERAGE[MACDFAST,1](SRC)
    SLOWEMA=AVERAGE[MACDSLOW,1](SRC)
    MACDVALUE=FASTEMA-SLOWEMA
    MACDSIGVALUE=AVERAGE[MACDSIGNAL1,0](MACDVALUE)
    MACDHIVALUE=MACDVALUE-MACDSIGVALUE
    
    NMACDVALUE=   -1+(((MACDVALUE   -(-PRICERANGE))/PRICERANGE)*2)
    NMACDSIGVALUE=-1+(((MACDSIGVALUE-(-PRICERANGE))/PRICERANGE)*2)
    NMACDHIVALUE= -1+(((MACDHIVALUE -(-PRICERANGE))/PRICERANGE)*2)
    
    IF MACDVALUE>=MACDSIGVALUE THEN
       MACDR=0
       MACDG=255
       MACDB=0
    ELSE
       MACDR=255
       MACDG=0
       MACDB=0
    ENDIF
    
    buySignal=NMACDVALUE crosses over NMACDSIGVALUE
    sellSignal=NMACDVALUE crosses under NMACDSIGVALUE
    
    if buysignal then
       drawpoint(barindex[1],NMACDSIGVALUE[1],2)coloured(255,165,0)
       drawpoint(barindex[1],NMACDSIGVALUE[1],3)coloured(255,165,0,100)
    elsif sellSignal then
       drawpoint(barindex[1],NMACDSIGVALUE[1],2)coloured(255,255,0)
       drawpoint(barindex[1],NMACDSIGVALUE[1],3)coloured(255,255,0,100)
    endif
    //--------------------------------------------------------------------------
    //NORMALIZED MFI------------------------------------------------------------
    //--------------------------------------------------------------------------
    hlc3 = (high+low+close)/3
    rawMoneyFlow = hlc3 * volume
    
    positiveFlow = 0.0
    
    if hlc3 > hlc3[1] then
       positiveFlow = positiveFlow + rawMoneyFlow
    else
       positiveFlow = positiveFlow
    endif
    
    negativeFlow = 0.0
    
    if hlc3 < hlc3[1] then
       negativeFlow = negativeFlow + rawmoneyFlow
    else
       negativeFlow = negativeFlow
    endif
    
    moneyFlowRatio = average [suma,0](positiveFlow) /average[suma,0](negativeFlow)
    MFIVALUE = 100 - 100 / (1 + moneyFlowRatio)
    NMFIVALUE=-1+(((MFIVALUE-25)/RSIRANGE)*2)
    //--------------------------------------------------------------------------
    //NORMALIZED COMPOSITE FUNCTION---------------------------------------------
    //--------------------------------------------------------------------------
    COMPOSITEV=NEMADIFF+NRSIVALUE+NMACDHIVALUE+NMFIVALUE-2
    COMPOSITERANGE=4-(-4)
    NCOMPOSITEV=-1+(((COMPOSITEV-(-4))/COMPOSITERANGE)*2)
    
    IF COMPOSITEV<=0 THEN
       CR=255
       CG=0
       CB=0
    ELSE
       CR=0
       CG=255
       CB=0
    ENDIF
    //--------------------------------------------------------------------------
    //PLOT------**********------------------------------------------------------
    //--------------------------------------------------------------------------
    RETURN NCOMPOSITEV AS "COMPOSITE" COLOURED(CR,CG,CB)STYLE(HISTOGRAM), NMACDSIGVALUE AS "MACDSG" COLOURED(MACDR,MACDG,MACDB)STYLE(LINE,2)
    


    La info del indicador para TV es la siguiente:

    • descripción:

    “Combines RSI, EMA difference, and MacD into a single indicator. Buy when it’s very red, sell when it’s very green.”

    • imagen

    ver adjunto

    • script en PineScript:
    //@version=3
    study(title="Buy Low Sell High Composite", shorttitle="BLSH")
    
    // normalize values into the range -1 to +1
    normalize(value, minValue, maxValue) =>
        range = maxValue - minValue == 0 ? 0.0001 : maxValue - minValue
        -1 + (((value - minValue) / range) * 2)
    
    atrValue = atr(9)
    priceRange = 2 * atrValue
    
    // RSI
    rsiValue = rsi(close, 14)
    rsiValueNormalized = normalize(rsiValue, 25, 75)
    rsiColor = rsiValueNormalized <= 0 ? orange : yellow
    
    // Elliot Wave
    emaDiff = ema(close, 5) - ema(close, 35)
    emaDiffNormalized = normalize(emaDiff, -priceRange, priceRange)
    emaColor = emaDiff <= 0 ? red : lime
    
    // MACD
    fastMovingAverage = ema(close, 12)
    slowMovingAverage = ema(close, 26)
    macd = fastMovingAverage - slowMovingAverage
    macdSignal = sma(macd, 9)
    macdHistogram = macd - macdSignal
    macdNormalized = normalize(macd, -priceRange, priceRange)
    macdSignalNormalized = normalize(macdSignal, -priceRange, priceRange)
    macdHistogramNormalized = normalize(macdHistogram, -priceRange, priceRange)
    
    isMACDAbove = macd >= macdSignal
    crossoverColor = isMACDAbove ? lime : red
    crossoverValue = cross(macd, macdSignal) ? macdSignalNormalized : na
    
    // MFI
    positiveFlow = sum(volume * (change(hlc3) <= 0 ? 0 : hlc3), 14)
    negativeFlow = sum(volume * (change(hlc3) >= 0 ? 0 : hlc3), 14)
    mfiValue = rsi(positiveFlow, negativeFlow)
    mfiValueNormalized = normalize(mfiValue, 25, 75)
    
    // Composite
    compositeValue = emaDiffNormalized + rsiValueNormalized + macdHistogramNormalized + mfiValueNormalized
    compositeNormalized = normalize(compositeValue, -4, 4)
    compositeColor = compositeValue <= 0 ? red : lime
    compositeStyle = histogram
    
    // Plots
    plot(compositeNormalized, title="Composite", color=compositeColor, style=area, linewidth=2, transp=60)
    plot(macdSignalNormalized, title="MacD Signal", style=line, linewidth=1, color=crossoverColor)
    plot(crossoverValue, title="Crossover", style=circles, linewidth=3, color=crossoverColor)
    


    Cualquier ayuda/comentario/critica al respecto es bien recibida.


    Muchas gracias,


    Un cordial saludo,


    Pedro.

    #256726 quote
    Iván González
    Moderator
    Master

    Buenas. Aquí tienes el código traducido.

    //----------------------------------------
    //PRC_Buy Low Sell High Composite (BLSH)
    //version = 0
    //23.01.2026
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //----------------------------------------
    // Parameters
    //----------------------------------------
    atrLen = 9
    rsiLen = 14
    mfiLen = 14
    //----------------------------------------
    // 1. Base Calculations
    //----------------------------------------
    atrValue = AverageTrueRange[atrLen](close)
    priceRange = 2 * atrValue
    minRangeDiv = 0.0001 // Safe range to avoid division by zero
    //----------------------------------------
    // 2. RSI Calculation
    //----------------------------------------
    rsiVal = RSI[rsiLen](close)
    rsiRange = 75 - 25
    rsiValueNormalized = -1 + (((rsiVal - 25) / rsiRange) * 2)
    //----------------------------------------
    // 3. Elliott Wave (EMA Difference)
    //----------------------------------------
    emaDiff = ExponentialAverage[5](close) - ExponentialAverage[35](close)
    ewRange = (priceRange - (-priceRange))
    IF ewRange = 0 THEN
       ewRange = minRangeDiv
    ENDIF
    emaDiffNormalized = -1 + (((emaDiff - (-priceRange)) / ewRange) * 2)
    //----------------------------------------
    // 4. MACD Calculation
    //----------------------------------------
    fastMA = ExponentialAverage[12](close)
    slowMA = ExponentialAverage[26](close)
    macdVal = fastMA - slowMA
    imacdSignal = Average[9](macdVal)
    macdHistogram = macdVal - imacdSignal
    // MACD Normalization
    macdRange = priceRange - (-priceRange)
    IF macdRange = 0 THEN
       macdRange = minRangeDiv
    ENDIF
    macdNormalized = -1 + (((macdVal - (-priceRange)) / macdRange) * 2)
    macdSignalNormalized = -1 + (((imacdSignal - (-priceRange)) / macdRange) * 2)
    macdHistogramNormalized = -1 + (((macdHistogram - (-priceRange)) / macdRange) * 2)
    //----------------------------------------
    // 5. MFI Calculation
    //----------------------------------------
    typicalP = TypicalPrice
    posFlow = 0
    negFlow = 0
    
    FOR i = 0 TO mfiLen - 1 DO
       IF typicalP[i] > typicalP[i+1] THEN
          posFlow = posFlow + (volume[i] * typicalP[i])
       ELSIF typicalP[i] < typicalP[i+1] THEN
          negFlow = negFlow + (volume[i] * typicalP[i])
       ENDIF
    NEXT
    
    IF negFlow = 0 THEN
       mfiVal = 100
    ELSE
       mfiVal = 100 - (100 / (1 + (posFlow / negFlow)))
    ENDIF
    
    mfiRange = 75 - 25
    mfiValueNormalized = -1 + (((mfiVal - 25) / mfiRange) * 2)
    //----------------------------------------
    // 6. Composite Logic
    //----------------------------------------
    compositeValue = emaDiffNormalized + rsiValueNormalized + macdHistogramNormalized + mfiValueNormalized
    // Final normalization between -4 and 4
    compRange = 4 - (-4)
    compositeNormalized = -1 + (((compositeValue - (-4)) / compRange) * 2)
    //----------------------------------------
    // 7. Colors and Styles
    //----------------------------------------
    // Composite Color (Lime if > 0, Red if <= 0)
    IF compositeValue > 0 THEN
       compR = 0
       compG = 255
       compB = 0
    ELSE
       compR = 255
       compG = 0
       compB = 0
    ENDIF
    // Crossover Logic for MACD Signal Color
    IF macdVal >= imacdSignal THEN
       crossR = 0
       crossG = 255
       crossB = 0
    ELSE
       crossR = 255
       crossG = 0
       crossB = 0
    ENDIF
    // Crossover Dot
    crossoverValue = Undefined
    IF macdVal CROSSES OVER imacdSignal OR macdVal CROSSES UNDER imacdSignal THEN
       crossoverValue = macdSignalNormalized
       drawpoint(barindex,crossoverValue,2)COLOURED(crossR, crossG, crossB)
    ENDIF
    
    colorbetween(compositeNormalized,0,compR, compG, compB,90)
    //----------------------------------------
    RETURN compositeNormalized COLOURED(compR, compG, compB) AS "Composite", macdSignalNormalized COLOURED(crossR, crossG, crossB) AS "MACD SignalNormalized"
    


    #256730 quote
    Pedro.lopez
    Participant
    New

    Hola, Ivan!!!!

    Muchas gracias por tu conversión!!!! Una vez vista detecte (aparte de las formas, evidentemente) un par de cosas que pase por alto y/o hice mal. Ahora los resultados son mas parecidos al código original.

    Recibe un cordial saludo,

    Pedro.

    Iván González thanked this post
Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.

Buy Low Sell High Composite. Conversion from pinescript to PRT


Soporte plateforma ProRealTime

New Reply
Author
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Pedro.lopez
4 days, 7 hours ago.

Topic Details
Forum: Soporte plateforma ProRealTime
Language: Spanish
Started: 01/22/2026
Status: Active
Attachments: 1 files
Logo Logo
Loading...