[pshaiCmd] EasySuperTrend
stableDescription
Easy-version of the SuperTrend indicator.
Command produces signals based on the SuperTrend line.
HaasScript
DefineCommand('EasySuperTrend', 'EasySuperTrend indicator by pshai.')
local chartIndex = DefineParameter(NumberType, 'chartIndex', 'The index on which to chart', true, 0, 'Number')
local name = DefineParameter(StringType, 'name', 'Unique name of the indicator.', false, '', 'Text')
local interval = DefineParameter(NumberType, 'interval', 'Used interval for price data. Default is 0 and the main interval will be used.', false, 0, 'Number,InputInterval')
DefineIntervalOptimization(interval)
-- Input fields for the indicator.
InputGroupHeader('EasySuperTrend '..name..' Settings')
-- Parameters
local atrPeriod = Input('ATR Period Length', 22)
local atrMult = Input('ATR Multiplier', 3)
local wicks = Input('Use wicks', false)
-- Data
local h = HighPrices(interval)
local l = LowPrices(interval)
local c = ClosePrices(interval)
local hl = HLPrices(interval)
local atr = ATR(h, l, c, atrPeriod) * atrMult
-- Stuff
local dir = Load('dir', 1)
local upperId = Load('uid', NewGuid())
local lowerId = Load('lid', NewGuid())
local result = SignalNone
local run = function(offset)
if offset == nil then
offset = 1
end
-- Update short side
if dir == -1 then
local upper = ArrayGet(hl, offset) + ArrayGet(atr, offset)
local upperPrev = Load('upper', upper) -- load previous
local finalUpper = Min(upper, upperPrev) -- take min
-- if close cuts through upper, we switch to other side
if (c >= finalUpper) or (wicks and h >= finalUpper) then
dir = 1
Save('lower', ArrayGet(hl, offset) - ArrayGet(atr, offset)) -- "reset" lower line
end
Save('upper', finalUpper)
result = SignalSell -- set result
-- Plot
if offset <= 1 then
lowerId = NewGuid() -- reset lower id
Plot(chartIndex, name..' Short Stop', finalUpper, {c=Red, id=upperId})
end
-- update long side
elseif dir == 1 then
local lower = ArrayGet(hl, offset) - ArrayGet(atr, offset)
local lowerPrev = Load('lower', lower) -- load previous
local finalLower = Max(lower, lowerPrev) -- take max
-- if close cuts through lower, we switch to other side
if c <= finalLower or (wicks and l <= finalLower) then
dir = -1
Save('upper', ArrayGet(hl, offset) + ArrayGet(atr, offset)) -- "reset" upper line
end
Save('lower', finalLower)
result = SignalBuy -- set result
-- Plot
if offset <= 1 then
upperId = NewGuid() -- reset upper id
Plot(chartIndex, name..' Long Stop', finalLower, {c=Green, id=lowerId})
end
end
end
-- Warmup
if Load('warmup') == nil then
LogWarning('Warming up SuperTrend...')
for i=100, 1, -1 do
run(i)
end
LogWarning('Result after warmup: '..result)
Save('warmup', false)
else
run() -- only update current step
end
Save('dir', dir)
Save('uid', upperId)
Save('lid', lowerId)
DefineOutput(EnumType, result, 'SuperTrend output values')
0 Comments
Sign in to leave a comment.
No comments yet. Be the first!