pythonpine-scriptindicator

how pinescript code expression "?:" "if else" to python conversion


Sorry for my bad english. I am trying to set Pinescript code to Python. But I'm stuck on line 15.

part of the original code

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// author © KivancOzbilgic
// developer © KivancOzbilgic
//@version=5
indicator('AlphaTrend', shorttitle='AT', overlay=true, format=format.price, precision=2, timeframe='')
coeff = input.float(1, 'Multiplier', step=0.1)
AP = input(14, 'Common Period')
ATR = ta.sma(ta.tr, AP)
src = input(close)
showsignalsk = input(title='Show Signals?', defval=true)
novolumedata = input(title='Change calculation (no volume data)?', defval=false)
upT = low - ATR * coeff
downT = high + ATR * coeff
AlphaTrend = 0.0

# This i'm stuck on line
AlphaTrend := (novolumedata ? ta.rsi(src, AP) >= 50 : ta.mfi(hlc3, AP) >= 50) ? upT < nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : downT

How do i convert? How your did it would you tell me?

I tried to code

AlphaTrend = 0.0
if no_volume_data is True and mfi(high,low,close,volume) >= 50 and upT < nz(AlphaTrend[1]) and nz(AlphaTrend[1])
    #......................

Solution

  • Lets break it down.

    AlphaTrend := (novolumedata ? ta.rsi(src, AP) >= 50 : ta.mfi(hlc3, AP) >= 50) ? upT < nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : downT
    

    Is easier to parse as:

    cond1 := novolumedata ? ta.rsi(src, AP) >= 50 : ta.mfi(hlc3, AP) >= 50
    cond2 := upT < nz(AlphaTrend[1])
    cond3 := downT > nz(AlphaTrend[1])
    val1 := nz(AlphaTrend[1])
    val2 := upT
    val3 := nz(AlphaTrend[1])
    val4 := downT
    
    AlphaTrend := cond1 ? cond2 ? val1 : val2 : cond3 ? val3 : val4
    

    Putting braces to make it more obvious:

    AlphaTrend := cond1 ? (cond2 ? val1 : val2) : (cond3 ? val3 : val4)
    

    Writing this in python would look like:

    AlphaTrend = (val1 if cond2 else val2) if cond1 else (val3 if cond3 else val4)
    

    Or as a much more readable format:

    if cond1:
        if cond2:
            AlphaTrend = val1
        else:
            AlphaTrend = val2
    else:
        if cond3:
            AlphaTrend = val3
        else:
            AlphaTrend = val4
    

    Plugging the variables back in:

    if ta.rsi(src, AP) >= 50 if novolumedata else ta.mfi(hlc3, AP) >= 50:
        if upT < nz(AlphaTrend[1]):
            AlphaTrend = nz(AlphaTrend[1])
        else:
            AlphaTrend = upT
    else:
        if downT > nz(AlphaTrend[1]):
            AlphaTrend = nz(AlphaTrend[1])
        else:
            AlphaTrend = downT