Buy Low Sell High Composite. Conversion from pinescript to PRT

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

    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.

    buylowsellhighcomposite.jpg buylowsellhighcomposite.jpg
    #256726 quote
    Iván GonzálezIván González
    Moderator
    Legend

    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.lopezPedro.lopez
    Participant
    Senior

    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.
ProRealAI ProRealAI New

Stuck on this ProBuilder code?

Describe what this topic is trying to build, in plain English, and ProRealAI writes the ProRealTime™ indicator, screener or system for you.

Available in 7 languages
Try ProRealAI

TradingView to ProRealTime Translation Center

New Reply
Author
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Pedro.lopezPedro.lopez
9 months, 3 weeks ago.

Topic Details
Forum: TradingView to ProRealTime Translation Center Forum
Started: 01/22/2026
Status: Active
Attachments: 1 files
ProRealCode ProRealCode
Loading...