I want to transfer my code to Python and use it more effectively. I have succeeded in most parts, but I need to translate the part that starts with the zoneDecider
variable into Python. How can I do it?
Python Code
df=data
zone_length = 10
zone_multiplier = 3.0
df['hl2'] = (df['h'] + df['l']) / 2
df.ta.atr(high=df['h'], low=df['l'], close=df['c'], length=zone_length,append=True)
df['downZone'] = df['hl2'] + (zone_multiplier * df['ATRr_10'])
df['upZone'] = df['hl2'] - (zone_multiplier * df['ATRr_10'])
Pinescript Code
downZone = hl2 + (3.0 * ta.atr(10))
upZone = hl2 - (3.0 * ta.atr(10) )
downZoneNew = nz(downZone[1], downZone)
downZone := close[1] < downZoneNew ? math.min(downZone, downZoneNew) : downZone
upZoneNew = nz(upZone[1], upZone)
upZone := close[1] > upZoneNew ? math.max(upZone, upZoneNew) : upZone
zoneDecider = 1
zoneDecider := nz(zoneDecider[1], zoneDecider)
zoneDecider := zoneDecider == -1 and close > downZoneNew ? 1 : zoneDecider == 1 and close < upZoneNew ? -1 : zoneDecider
redZone = zoneDecider == -1 and zoneDecider[1] == 1
greenZone = zoneDecider == 1 and zoneDecider[1] == -1
plotshape(redZone ? downZone : na, location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), title='SAT', text='SAT')
plotshape(greenZone ? upZone : na, location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), title='AL', text='AL')
Buy and sell points depend on time horizon and interval (1H, 1D...). You can use the code below, I put comments in the code.
# Calculate ATR using pandas_ta
data['atr'] = ta.atr(data['h'], data['l'], data['c'], length=10)
# Calculate upZone and downZone
data['downZone'] = data['c'].rolling(window=2).mean() + (3.0 * data['atr'])
data['upZone'] = data['c'].rolling(window=2).mean() - (3.0 * data['atr'])
# Adjusting downZone and upZone according to conditions
for i in range(1, len(data)):
data.loc[data.index[i], 'downZone'] = data['c'][i-1] < data['downZone'][i] and min(data['downZone'][i], data['downZone'][i-1]) or data['downZone'][i]
data.loc[data.index[i], 'upZone'] = data['c'][i-1] > data['upZone'][i] and max(data['upZone'][i], data['upZone'][i-1]) or data['upZone'][i]
# Correcting the buy and sell signals logic
data['buy_signal'] = (data['c'].shift(1) < data['downZone'].shift(1)) & (data['c'] > data['downZone'])
data['sell_signal'] = (data['c'].shift(1) > data['upZone'].shift(1)) & (data['c'] < data['upZone'])