Please – Translation of Order Blocks from TV
Forums › ProRealTime English forum › ProBuilder support › Please – Translation of Order Blocks from TV
- This topic has 21 replies, 5 voices, and was last updated 2 years ago by foxxcrypto.
-
-
08/22/2022 at 1:10 AM #199375
Hello,
Can anyone please help translating the code below from TradingView? I don’t need the alerts. I just need the order blocks boxes to be drawn.
Thanks in advance.
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ClayeWeight// Sonarlabs – Order Block Finder
//
//
// ENJOY THE FREE SCRIPT//@version=5
indicator(title=’Sonarlab – Order Blocks’, shorttitle=’Sonarlab – OB’, overlay=true, max_boxes_count=20)
_v = input.string(“1.0.2″, title=”Version”, options=[“1.0.2″], group=”Sonarlab.io”, tooltip=”This is a free script based on our premium Smart Money Concepts (SMC) indicator. Get a free trial of our SMC indicator by visiting our website.\nhttps://www.sonarlab.io”)
sens = input.int(28, minval=1, title=’Sensitivity’, group=’Order Block’, tooltip=’Lower the sensitivity to show more order blocks. A higher sensitivity will show less order blocks.’)
sens /= 100// OB
OBMitigationType = input.string(“Close”, title=”OB Mitigation Type”, options=[“Close”, “Wick”], group=”Order Block”, tooltip=”Choose how Order Blocks are mitigated”)
OBBullMitigation = OBMitigationType==”Close” ? close[1] : low
OBBearMitigation = OBMitigationType==”Close” ? close[1] : high//OB Colors
col_bullish = input.color(#5db49e, title=”Bullish OB Border”, inline=”a”, group=”Order Block”)
col_bullish_ob = input.color(color.new(#64C4AC, 85), title=”Background”, inline=”a”, group=”Order Block”)col_bearish = input.color(#4760bb, title=”Bearish OB Border”, inline=”b”, group=”Order Block”)
col_bearish_ob = input.color(color.new(#506CD3, 85), title=”Background”, inline=”b”, group=”Order Block”)// Alerts
buy_alert = input.bool(title=’Buy Signal’, defval=true, group=’Alerts’, tooltip=’An alert will be sent when price goes below the top of a bullish order block.’)
sell_alert = input.bool(title=’Sell Signal’, defval=true, group=’Alerts’, tooltip=’An alert will be sent when price goes above the bottom of a bearish order block.’)// Delacring Variables
bool ob_created = false
bool ob_created_bull = false
var int cross_index = na// Declaring Box Arrays
var box drawlongBox = na
var longBoxes = array.new_box()
var box drawShortBox = na
var shortBoxes = array.new_box()// Custom Rate of Change (ROC) calculation. This is to calculate high momentum moves in the market.
pc = (open – open[4]) / open[4] * 100// If the ROC crossover our Sensitivty input – Then create an Order Block
// Sensitivty is negative as this is a Bearish OB
if ta.crossunder(pc, -sens)
ob_created := true
cross_index := bar_index
cross_index// If the ROC crossover our Sensitivty input – Then create an Order Block
if ta.crossover(pc, sens)
ob_created_bull := true
cross_index := bar_index
cross_index// ——————————-
// Bearish OB Creation
// ——————————-
// Check if we should create a OB, Also check if we haven’t created an OB in the last 5 candles.
if ob_created and cross_index – cross_index[1] > 5
float last_green = 0
float highest = 0
// Loop through the most recent candles and find the first GREEN (Bullish) candle. We will place our OB here.
for i = 4 to 15 by 1
if close[i] > open[i]
last_green := i
break
// Draw our OB on that candle – then push the box into our box arrays.
drawShortBox := box.new(left=bar_index[last_green], top=high[last_green], bottom=low[last_green], right=bar_index[last_green], bgcolor=col_bearish_ob, border_color=col_bearish, extend=extend.right)
array.push(shortBoxes, drawShortBox)// ——————————-
// Bullish OB Creation
// ——————————-
// Check if we should create a OB, Also check if we haven’t created an OB in the last 5 candles.
if ob_created_bull and cross_index – cross_index[1] > 5
float last_red = 0
float highest = 0
// Loop through the most recent candles and find the first RED (Bearish) candle. We will place our OB here.
for i = 4 to 15 by 1
if close[i] < open[i]
last_red := i
break
// Draw our OB on that candle – then push the box into our box arrays.
drawlongBox := box.new(left=bar_index[last_red], top=high[last_red], bottom=low[last_red], right=bar_index[last_red], bgcolor=col_bullish_ob, border_color=col_bullish, extend=extend.right)
array.push(longBoxes, drawlongBox)// —————– Bearish Order Block ——————-
// Clean up OB boxes and place alerts
if array.size(shortBoxes) > 0
for i = array.size(shortBoxes) – 1 to 0 by 1
sbox = array.get(shortBoxes, i)
top = box.get_top(sbox)
bot = box.get_bottom(sbox)
// If the two last closes are above the high of the bearish OB – Remove the OB
if OBBearMitigation > top
array.remove(shortBoxes, i)
box.delete(sbox)
// Alerts
if high > bot and sell_alert
alert(‘Price inside Bearish OB’, alert.freq_once_per_bar)// —————– Bullish Clean Up ——————-
// Clean up OB boxes and place alerts
if array.size(longBoxes) > 0
for i = array.size(longBoxes) – 1 to 0 by 1
sbox = array.get(longBoxes, i)
bot = box.get_bottom(sbox)
top = box.get_top(sbox)
// If the two last closes are below the low of the bullish OB – Remove the OB
if OBBullMitigation < bot
array.remove(longBoxes, i)
box.delete(sbox)
// Alerts
if low < top and buy_alert
alert(‘Price inside Bullish OB’, alert.freq_once_per_bar)08/22/2022 at 1:16 AM #19937608/22/2022 at 10:31 PM #19943708/22/2022 at 11:12 PM #199440I can’t translate the code but maybe this is a beginning:
It looks like a SAR with a custom ROC calculation:
pc = (open – open[4]) / open[4] * 100
The trigger lines are set with “Sensitivty” (sens = 28/100)
At a positive crossing (Crosses Over) “Bullish OB” are drawn:
If pc crosses over sens then
As a starting point, the last red candle is sought
For i = 4 to 15
If Close[i] < Open[i] then
LastRed = i
Break
At a negative crossing (Crosses Under) “Bearish OB” are drawn:
If pc crosses under -sens then
with the last green candle as the starting point.
For i = 4 to 15
If Close[i] > Open[i] then
LastGreen = i
Break
08/23/2022 at 12:55 AM #19944208/23/2022 at 1:35 AM #199443I tried my best, but I’m still far away… Nicolas, Roberto, pleeeease!
1234567891011121314151617181920212223242526272829303132333435363738394041obbull=0obbear=0Sensi = 30pc = (open - open[4]) / open[4] * 10000if pc crosses over Sensi thenobbull = 1bullcrossindex = barindexendifif pc crosses under -Sensi thenobbear = 1bearcrossindex = barindexendifif obbull=1 and bullcrossindex - bullcrossindex[1] > 5 thenfloatlastgreen = 0floathighest = 0For i = 4 to 15If Close[i] > Open[i] thenLastGreen = iendif//BreaknextDRAWRECTANGLE(barindex[i], close, bullcrossindex, open)coloured("blue")endifif obbear=1 and bearcrossindex - bearcrossindex[1] > 5 thenfloatlastred = 0floathighest = 0For i = 4 to 15If Close[i] < Open[i] thenLastRed = iendif//BreaknextDRAWRECTANGLE(barindex[LastRed], open, bearcrossindex, close)coloured("red")endifreturn08/23/2022 at 10:33 AM #199453Sorry, I don’t have a good knowledge of then Pinescript programming language.
1 user thanked author for this post.
08/24/2022 at 9:24 AM #199506Dear All,
Below my updated attempt to convert the code above, but it doesn’t seem to work properly. Any help would be much appreciated.
Order Blocks123456789101112131415161718192021222324252627282930313233343536373839404142434445obbull=0obbear=0bullcrossindex=0bearcrossindex=0Lookback = 4Sensi = 30pc = (open - open[Lookback]) / open[Lookback] * 10000if pc crosses over Sensi thenobbull = 1bullcrossindex = barindexendifif pc crosses under -Sensi thenobbear = 1bearcrossindex = barindexendifif obbull=1 and bullcrossindex - bullcrossindex[1] > 5 thenfloatlastred = 0floathighest = 0For i = 4 to 15If Close[i] < Open[i] thenLastRed = iendif//BreaknextDRAWRECTANGLE(bullcrossindex, high, bullcrossindex+40, low)coloured("red")endifif obbear=1 and bearcrossindex - bearcrossindex[1] > 5 thenfloatlastgreen = 0floathighest = 0For i = 4 to 15If Close[i] > Open[i] thenLastGreen = iendif//BreaknextDRAWRECTANGLE(bearcrossindex, high, bearcrossindex+40, low)coloured("green")endifreturn08/24/2022 at 10:40 AM #19950808/29/2022 at 2:46 PM #19981108/30/2022 at 10:40 AM #19987409/07/2022 at 1:08 PM #200306Nicolas,
I understand PRT doesn’t handle yet two dimension Arrays.
Can’t substiute “array.push(longBoxes, drawlongBox)” with
$array1 = longBoxes
$array2 = drawlongBox
and then create a conditional drawing of the box:
if array1 = condition1 and $array2 = condition2 then
drawrectangle(…)
endif
like you have done on the first example on Arrays about Support and Resistance.
Merci beaucoup
09/08/2022 at 2:55 AM #200329I tried my best, spent hours reading TradingView coding manual, but couldn’t reach a satisfactory result.
Can someone who knows Arrays in PRT (not necessary need to know TradingView) please help me to figure out if all Arrays are OK and why it doesn’t remove old order blocks? The original TradingView code is above.
A BIG THANK YOU!
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130obbull=0obbear=0OBBullMitigation=1OBBearMitigation=1boxdrawlongBox = 0boxdrawShortBox = 0Long=0Short = 0$longboxes[i]=0$shortboxes[i]=0$drawlongbox[i]=0$drawshortbox[i]=0// Variable DefinitionSensi = 30Lookback = 4Loop = 15pc = (open - open[Lookback]) / open[Lookback] * 10000if pc crosses over Sensi thenobbull = 1bullcrossindex = barindexendifif pc crosses under -Sensi thenobbear = 1bearcrossindex = barindexendifif OBBullMitigation = 1 thenOBBullMitiValue = close[1]endifif OBBearMitigation = 1 thenOBBearMitiValue = close[1]endif// -------------------------------// Bullish OB Creation// -------------------------------if obbull=1 and (bullcrossindex - bullcrossindex[1]) > 5 thenlastred = 0ihighest = 0For i = 4 to Loop doIf Close[i] < Open[i] thenLastRed = iendifBreaknext//openobbull= open[LastRed]highobbull = high[LastRed]lowobbull = low[LastRed]//closeobbull = close[LastRed]$longboxes[i]=1$drawlongbox[i]=1endif// -------------------------------// Bearish OB Creation// -------------------------------if obbear=1 and (bearcrossindex - bearcrossindex[1]) > 5 thenlastgreen = 0ihighest = 0For i = 4 to Loop doIf Close[i] > Open[i] thenLastGreen = iendifBreaknext//openobbear= open[LastGreen]highobbear = high[LastGreen]lowobbear = low[LastGreen]//closeobbear = close[LastGreen]$shortboxes[i]=1$drawshortbox[i]=1endif// ----------------- Bearish Order Block -------------------// Clean up OB boxes and place alerts// -------------------------------if $shortboxes[i] > 0 thenfor i = $shortboxes[i] -1 to 0 dosbox = $shortboxes[i]ibot = lowobbearitop = highobbearnextif OBBearMitiValue > itop then$shortboxes[i]=0$drawshortbox[i]=0elsif OBBearMitiValue < itop thenDRAWRECTANGLE(bearcrossindex[LastGreen], highobbear, bearcrossindex+150, lowobbear)coloured(80,108,211)//style(line,2)//COLORBETWEEN(lowobbear,highobbear,"RED")endifif high > ibot thenShort=-1endifendif// ----------------- Bullish Clean Up -------------------// Clean up OB boxes and place alerts// -------------------------------if $longboxes[i] > 0 thenfor i = $longboxes[i] -1 to 0 dosbox = $longboxes[i]ibot = lowobbullitop = highobbullnextif OBBullMitiValue < ibot then$longboxes[i]=0$drawlongbox[i]=0elsif OBBullMitiValue > ibot thenDRAWRECTANGLE(bullcrossindex[LastRed], highobbull, bullcrossindex+150, lowobbull)coloured(196,102,100)//COLORBETWEEN(lowobbull,highobbull,"blue")endifif low < itop thenLong=1endifendifreturn09/08/2022 at 7:41 AM #200334You can’t remove previous objects on the chart if they are painted along the read of history. The best thing to do is to paint them all from the last candlestick within a loop through your arrays.
1 user thanked author for this post.
09/08/2022 at 8:49 AM #200336Ok digging into the code and I understand where is the trouble, all that zones must be erased if the price has breached them.
Just made the version for the bearish zones, you can learn from it to create the other side 🙂
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071defparam drawonlastbaronly=true//sens = 28// -----------------sens = sens/100OBBearMitigation = close// Custom Rate of Change (ROC) calculation. This is to calculate high momentum moves in the market.pc = (open - open[4]) / open[4] * 100// If the ROC crossover our Sensitivty input - Then create an Order Block// Sensitivty is negative as this is a Bearish OBif pc crosses under -sens then //ta.crossunder(pc, -sens)obcreated = 1crossindex = barindexendif// If the ROC crossover our Sensitivty input - Then create an Order Blockif pc crosses over sens then //ta.crossover(pc, sens)obcreatedbull = 1crossindex = barindexendif// -------------------------------// Bearish OB Creation// -------------------------------// Check if we should create a OB, Also check if we haven't created an OB in the last 5 candles.if obcreated and crossindex - crossindex[1] > 5 thenlastgreen = 0hhighest = 0// Loop through the most recent candles and find the first GREEN (Bullish) candle. We will place our OB here.for i = 4 to 15if close[i] > open[i] thenlastgreen = i//populate the arrays of order block to draw them later$left[plot]= barindex[lastgreen]$top[plot]=high[lastgreen]$bottom[plot]=low[lastgreen]$right[plot]=barindex[lastgreen]plot=plot+1 //increase the array column for next databreakendifnextendif// Clean up OB boxesif plot>0 thenfor j = 0 to plot-1// If the two last closes are above the high of the bearish OB - Remove the OBif $left[j]>0 then //check if the zone still existitop = $top[j]breakout = summation[max(1,barindex-$left[j])](OBBearMitigation>itop)>=2if breakout then$left[j]=0endifendifnextendif//plot the boxesif islastbarupdate and plot>0 thenfor j = 0 to plot-1if $left[j]>0 thendrawrectangle($left[j],$top[j],barindex,$bottom[j]) coloured("grey",50) bordercolor("grey",50)endifnextendifreturn -
AuthorPosts