[pshaiCmd] SuperTrend Trailing Stop-Loss

stable
By pshai in Safeties Published October 2020 👁 2,385 views 💬 1 comments

Description

SuperTrend-based trailing stop-loss safety command. What else... ;) Usage:
if CC_STTSL(50, 1.75) then
    DoExitPosition('STTSL Triggered Exit')
end
(In the screenshot's bottom chart, you see CCI with its SuperTrend_Ext line)
HaasScript
DefineCommand('STTSL', 'SuperTrend Trailing Stop-Loss')
 
local atr_len = DefineParameter(NumberType, 'atr_len', 'ATR Period length', true, 20)
local atr_mult = DefineParameter(NumberType, 'atr_mult', 'ATR Multiplier', true, 2)
local interval = DefineParameter(NumberType, 'interval', 'Interval for data', false, 0, 'InputInterval, Number')
local position_id = DefineParameter(StringType, 'position_id', 'Position identifier', false, '', 'PositionContainer')
local market_id = DefineParameter(StringType, 'market_id', 'Market identifier', false, PriceMarket(), 'PriceMarket, InputAccountMarket, InputMarket, CreateMarket')
 
local position = PositionContainer(position_id)
local direction = GetPositionDirection()
local prev_id = Load('pid', position.positionId)
local result = false
 
if position.positionId != prev_id then
    Save('upper', -1) -- "reset" upper line
    Save('lower', -1) -- "reset" lower line
end
 
if direction != NoPosition then
    -- Data
    local h = HighPrices(interval, true, market_id)
    local l = LowPrices(interval, true, market_id)
    local c = ClosePrices(interval, true, market_id)
    local hl = (h+l) / 2
    local atr = ATR(h, l, c, atr_len) * atr_mult
 
    -- Update short side
    if direction == PositionShort then
        local upper = ArrayGet(hl, 1) + ArrayGet(atr, 1)
        local upperPrev = Load('upper', upper) -- load previous
        if upperPrev < 0 then upperPrev = upper end
        local finalUpper = Min(upper, upperPrev) -- take min
 
        Plot(0, 'Short Stop', finalUpper, {c = Green, id = position.positionId})
 
        -- if close cuts through upper, trigger signal
        if (c >= finalUpper) then
            result = true
        end
 
        Save('upper', finalUpper)
 
    -- update long side
    elseif direction == PositionLong then
        local lower = ArrayGet(hl, 1) - ArrayGet(atr, 1)
        local lowerPrev = Load('lower', lower) -- load previous
        if lowerPrev < 0 then lowerPrev = lower end
        local finalLower = Max(lower, lowerPrev) -- take max
 
        Plot(0, 'Long Stop', finalLower, {c = Red, id = position.positionId})
 
        -- if close cuts through lower, trigger signal
        if (c <= finalLower) then
            result = true
        end
 
        Save('lower', finalLower)
    end
end
 
Save('pid', position.positionId)
 
DefineOutput(BooleanType, result, 'Returns true if stop was triggered')

1 Comment

Sign in to leave a comment.

F
Florentind over 5 years ago

it gives error