本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © LuxAlgo
//@version=6
indicator('Power Hour Breakout [LuxAlgo]','LuxAlgo - Power Hour Breakout', overlay = true, max_lines_count = 500, max_boxes_count = 500, max_labels_count = 500)
//---------------------------------------------------------------------------------------------------------------------}
//CONSTANTS & STRINGS & INPUTS
//---------------------------------------------------------------------------------------------------------------------{
GREEN = #089981
RED = #F23645
SILVER_50 = color.new(color.silver,50)
SILVER_80 = color.new(color.silver,80)
DOTTED = 'Dotted'
DASHED = 'Dashed'
SOLID = 'Solid'
EM_SPACE = ' '
EN_SPACE = ' '
FOUR_PER_EM_SPACE = ' '
SIX_PER_EM_SPACE = ' '
extensionSpacing = EM_SPACE+EN_SPACE+SIX_PER_EM_SPACE
BREAKOUT_GROUP = 'BREAKOUTS'
EXTENSION_GROUP = 'EXTENSIONS'
FIBONACCI_GROUP = 'FIBONACCI LEVELS'
STYLE_GROUP = 'STYLE'
displayAllTooltip = 'Select how many Power Hours to display or enable the Display All feature.'
powerHourTooltip = 'Choose a custom Power Hour in New York time.'
breakoutsTooltip = 'Enable or disable breakouts.'
topExtensionTooltip = 'Enable or disable the top extension and choose the percentage of Power Hour to use.'
bottomExtensionTooltip = 'Enable or disable the bottom extension and choose the percentage of Power Hour to use.'
fiboReverseTooltip = 'Reverse Fibonacci levels.'
fibosLabelsTooltip = 'Enable or disable labels and choose text size.'
transparencyTooltip = 'Choose the extension\'s transparency. 0 is solid, and 100 is fully transparent.'
powerHoursLengthInput = input.int( 10, 'Display Last X Power Hours', inline = 'powerhours')
displayAllInput = input.bool( true, 'Display All', inline = 'powerhours', tooltip = displayAllTooltip)
powerHourInput = input.session('1500-1600','Power Hour (NY Time)', tooltip = powerHourTooltip)
breakoutsInput = input.bool( true, 'Show Breakouts', group = BREAKOUT_GROUP, tooltip = breakoutsTooltip)
bullBreakColorInput = input.color( GREEN, 'Bullish Breakout', group = BREAKOUT_GROUP)
bearBreakColorInput = input.color( RED, 'Bearish Breakout', group = BREAKOUT_GROUP)
topExtensionInput = input.bool( true, 'Top Extension %'+extensionSpacing, group = EXTENSION_GROUP, inline = 'top')
topMultiplierInput = input.int( 50, '', group = EXTENSION_GROUP, inline = 'top', tooltip = topExtensionTooltip, minval = 1, step = 5) / 100
bottomExtensionInput = input.bool( true, 'Bottom Extension %', group = EXTENSION_GROUP, inline = 'bottom')
bottomMultiplierInput = input.int( 50, '', group = EXTENSION_GROUP, inline = 'bottom', tooltip = bottomExtensionTooltip, minval = 1, step = 5) / 100
fibonacciInput = input.bool( true, 'Display Fibonnaci', group = FIBONACCI_GROUP)
fiboReverseInput = input.bool( false, 'Reverse', group = FIBONACCI_GROUP, tooltip = fiboReverseTooltip)
fiboLevel5DisplayInput = input.bool( true, '', group = FIBONACCI_GROUP, inline = 'fibo5')
fiboLevel5Input = input.float( 0.786, '', group = FIBONACCI_GROUP, inline = 'fibo5')
fiboLevel5ColorInput = input.color( SILVER_50, '', group = FIBONACCI_GROUP, inline = 'fibo5')
fiboLevel5StyleInput = input.string( DASHED, '', group = FIBONACCI_GROUP, inline = 'fibo5', options = [DOTTED,DASHED,SOLID])
fiboLevel4DisplayInput = input.bool( true, '', group = FIBONACCI_GROUP, inline = 'fibo4')
fiboLevel4Input = input.float( 0.618, '', group = FIBONACCI_GROUP, inline = 'fibo4')
fiboLevel4ColorInput = input.color( SILVER_50, '', group = FIBONACCI_GROUP, inline = 'fibo4')
fiboLevel4StyleInput = input.string( DASHED, '', group = FIBONACCI_GROUP, inline = 'fibo4', options = [DOTTED,DASHED,SOLID])
fiboLevel3DisplayInput = input.bool( true, '', group = FIBONACCI_GROUP, inline = 'fibo3')
fiboLevel3Input = input.float( 0.500, '', group = FIBONACCI_GROUP, inline = 'fibo3')
fiboLevel3ColorInput = input.color( SILVER_50, '', group = FIBONACCI_GROUP, inline = 'fibo3')
fiboLevel3StyleInput = input.string( DASHED, '', group = FIBONACCI_GROUP, inline = 'fibo3', options = [DOTTED,DASHED,SOLID])
fiboLevel2DisplayInput = input.bool( true, '', group = FIBONACCI_GROUP, inline = 'fibo2')
fiboLevel2Input = input.float( 0.382, '', group = FIBONACCI_GROUP, inline = 'fibo2')
fiboLevel2ColorInput = input.color( SILVER_50, '', group = FIBONACCI_GROUP, inline = 'fibo2')
fiboLevel2StyleInput = input.string( DASHED, '', group = FIBONACCI_GROUP, inline = 'fibo2', options = [DOTTED,DASHED,SOLID])
fiboLevel1DisplayInput = input.bool( true, '', group = FIBONACCI_GROUP, inline = 'fibo1')
fiboLevel1Input = input.float( 0.236, '', group = FIBONACCI_GROUP, inline = 'fibo1')
fiboLevel1ColorInput = input.color( SILVER_50, '', group = FIBONACCI_GROUP, inline = 'fibo1')
fiboLevel1StyleInput = input.string( DASHED, '', group = FIBONACCI_GROUP, inline = 'fibo1', options = [DOTTED,DASHED,SOLID])
fibosLabelsInput = input.bool( false, 'Display Labels'+FOUR_PER_EM_SPACE, group = FIBONACCI_GROUP, inline = 'fiboLabels')
fibosLabelSizeInput = input.int( 10, '|'+FOUR_PER_EM_SPACE+' Text Size'+FOUR_PER_EM_SPACE, group = FIBONACCI_GROUP, inline = 'fiboLabels', tooltip = fibosLabelsTooltip)
topColorInput = input.color( GREEN, 'Top Color', group = STYLE_GROUP)
bottomColorInput = input.color( RED, 'Bottom Color', group = STYLE_GROUP)
transparencyInput = input.int( 80, 'Extension Transparency', group = STYLE_GROUP, tooltip = transparencyTooltip, minval = 0, maxval = 100)
sessionStartInput = input.bool( true, 'Session Breaks', group = STYLE_GROUP, inline = 'start')
backgroundColorInput = input.color( SILVER_80, '', group = STYLE_GROUP, inline = 'start')
//---------------------------------------------------------------------------------------------------------------------}
//DATA STRUCTURES & VARIABLES
//---------------------------------------------------------------------------------------------------------------------{
type powerHour
int startTime
int endTime
int endSession
float top
float bottom
box area
array<line> lines
array<line> fibos
array<label> labels
var array<powerHour> powerHours = array.new<powerHour>()
insidePowerHour = not na(time(timeframe.period, powerHourInput, 'America/New_York'))
powerHourStart = insidePowerHour and not insidePowerHour[1]
//---------------------------------------------------------------------------------------------------------------------}
//USER-DEFINED FUNCTIONS
//---------------------------------------------------------------------------------------------------------------------{
gatherData() =>
if powerHourStart
powerHours.push(powerHour.new(time,time,time,high,low,na,array.new<line>(),array.new<line>(),array.new<label>()))
if powerHours.size() > 0
powerHour currentPowerHour = powerHours.last()
currentPowerHour.endSession := time
if insidePowerHour
currentPowerHour.endTime := time
currentPowerHour.top := math.max(currentPowerHour.top,high)
currentPowerHour.bottom := math.min(currentPowerHour.bottom,low)
breakouts() =>
bool bullishBreakout = false
bool bearishBreakout = false
if breakoutsInput and powerHours.size() > 0 and not insidePowerHour
powerHour currentPowerHour = powerHours.last()
bullishBreakout := close[1] < currentPowerHour.top and close > currentPowerHour.top
bearishBreakout := close[1] > currentPowerHour.bottom and close < currentPowerHour.bottom
[bullishBreakout,bearishBreakout]
style(string style) =>
switch style
DOTTED => line.style_dotted
DASHED => line.style_dashed
SOLID => line.style_solid
drawFibonacciLevel(bool drawLevel, powerHour currentPowerHour, float fibonacciLevel, color fibonacciColor, string fibonacciStyle) =>
if drawLevel
float fibonacciRange = math.round_to_mintick(fibonacciLevel * (currentPowerHour.top - currentPowerHour.bottom))
float priceLevel = fiboReverseInput ? currentPowerHour.bottom + fibonacciRange : currentPowerHour.top - fibonacciRange
chart.point lastPoint = chart.point.new(currentPowerHour.endSession,na,priceLevel)
currentPowerHour.fibos.push(line.new(chart.point.new(currentPowerHour.startTime,na,priceLevel),lastPoint,xloc.bar_time, color = fibonacciColor, style = fibonacciStyle, width = 1))
if fibosLabelsInput
currentPowerHour.labels.push(label.new(lastPoint,str.format('{0} ({1})',fibonacciLevel,priceLevel),xloc = xloc.bar_time, yloc = yloc.price, color = color(na), textcolor = fibonacciColor, style = label.style_label_left, size = fibosLabelSizeInput))
drawFibonnaciLevels(powerHour currentPowerHour) =>
for eachLine in currentPowerHour.fibos
eachLine.delete()
for eachLabel in currentPowerHour.labels
eachLabel.delete()
drawFibonacciLevel(fiboLevel1DisplayInput,currentPowerHour,fiboLevel1Input,fiboLevel1ColorInput,style(fiboLevel1StyleInput))
drawFibonacciLevel(fiboLevel2DisplayInput,currentPowerHour,fiboLevel2Input,fiboLevel2ColorInput,style(fiboLevel2StyleInput))
drawFibonacciLevel(fiboLevel3DisplayInput,currentPowerHour,fiboLevel3Input,fiboLevel3ColorInput,style(fiboLevel3StyleInput))
drawFibonacciLevel(fiboLevel4DisplayInput,currentPowerHour,fiboLevel4Input,fiboLevel4ColorInput,style(fiboLevel4StyleInput))
drawFibonacciLevel(fiboLevel5DisplayInput,currentPowerHour,fiboLevel5Input,fiboLevel5ColorInput,style(fiboLevel5StyleInput))
drawPowerHourLevel(powerHour currentPowerHour, float level, bool extension, float multiplier, color c_olor) =>
currentPowerHour.lines.push(line.new(chart.point.new(currentPowerHour.startTime,na,level),chart.point.new(currentPowerHour.endSession,na,level),xloc.bar_time, color = c_olor, width = 1))
if extension
float extensionLevel = math.round_to_mintick(level + multiplier * (currentPowerHour.top - currentPowerHour.bottom))
currentPowerHour.lines.push(line.new(chart.point.new(currentPowerHour.startTime,na,extensionLevel),chart.point.new(currentPowerHour.endSession,na,extensionLevel),xloc.bar_time, color = c_olor, width = 1))
linefill.new(currentPowerHour.lines.get(-1),currentPowerHour.lines.get(-2), color.new(c_olor,transparencyInput))
drawPowerHour(powerHour currentPowerHour) =>
if fibonacciInput
drawFibonnaciLevels(currentPowerHour)
for eachLine in currentPowerHour.lines
eachLine.delete()
drawPowerHourLevel(currentPowerHour,currentPowerHour.top,topExtensionInput,topMultiplierInput,topColorInput)
drawPowerHourLevel(currentPowerHour,currentPowerHour.bottom,bottomExtensionInput,-1*bottomMultiplierInput,bottomColorInput)
currentPowerHour.area.delete()
currentPowerHour.area := box.new(chart.point.new(currentPowerHour.startTime,na,currentPowerHour.top),chart.point.new(currentPowerHour.endTime,na,currentPowerHour.bottom),border_color = color.new(color.silver,90),bgcolor = color.new(color.silver,90), xloc = xloc.bar_time)
drawPowerHours(int powerHoursLength) =>
size = powerHours.size()
if size > 0
int startIndex = size - (displayAllInput ? size : powerHoursLength)
for eachPowerHour in powerHours.slice(startIndex,size)
drawPowerHour(eachPowerHour)
//---------------------------------------------------------------------------------------------------------------------}
//MUTABLE VARIABLES & EXECUTION
//---------------------------------------------------------------------------------------------------------------------{
gatherData()
[bullishBreakout,bearishBreakout] = breakouts()
plotshape(bullishBreakout, 'Bullish Breakout', shape.triangleup, location.belowbar, bullBreakColorInput, size = size.tiny)
plotshape(bearishBreakout, 'Bearish Breakout', shape.triangledown, location.abovebar, bearBreakColorInput, size = size.tiny)
color backgroundColor = sessionStartInput and session.isfirstbar_regular ? backgroundColorInput : na
bgcolor(backgroundColor)
if barstate.islastconfirmedhistory
drawPowerHours(powerHoursLengthInput)
if barstate.islast
drawPowerHour(powerHours.last())
//---------------------------------------------------------------------------------------------------------------------}