Firetron’s Candle

3 82 Views 2 Comments 1 month ago
  • Creates and returns a Candle Class instance. Note that every property is a getter function.

    Test Script

    function Test()
      local closePrices = ClosePrices()
      local highPrices  = HighPrices()
      local lowPrices   = LowPrices()
      local openPrices  = OpenPrices()
      local candle      = CC_Candle(openPrices, highPrices, lowPrices, closePrices)
      Log('-----------')
      Log('Next Candle')
      Log('-----------')
      Log('IsGreen: '..Parse(candle.IsGreen(), StringType))
      Log('IsRed: '..Parse(candle.IsRed(), StringType))
      Log('IsDoji: '..Parse(candle.IsDoji(), StringType))
      Log('IsDragonfly: '..Parse(candle.IsDragonfly(), StringType))
      Log('IsGravestone: '..Parse(candle.IsGravestone(), StringType))
      Log('IsLongLegged: '..Parse(candle.IsLongLegged(), StringType))
      Log('Full: '..candle.Full())
      Log('Body: '..candle.Body())
      Log('Wicks: '..candle.Wicks())
      Log('TopWick: '..candle.TopWick())
      Log('BottomWick: '..candle.BottomWick())
      Log('WithoutTopWick: '..candle.WithoutTopWick())
      Log('WithoutBottomWick: '..candle.WithoutBottomWick())
    end
    OptimizedForInterval(360, Test)
    • This topic was modified 1 month ago by Firetron. Reason: Fixing test code block tag
    • This topic was modified 1 month ago by Firetron. Reason: Fixed code block tag
    • This topic was modified 1 month ago by Firetron. Reason: Fixed code block tag
    • This topic was modified 1 month ago by Firetron. Reason: Renamed IsDojiStar to IsLongLegged
    • This topic was modified 1 month ago by Firetron. Reason: Renamed wicks to shadows. Change parameters from NumberType to ListNumberType
    • This topic was modified 1 month ago by Firetron. Reason: Changed Index from ListNumberType to NumberType
    • This topic was modified 3 weeks, 6 days ago by Firetron. Reason: Renamed shadows to wicks
    • This topic was modified 3 weeks, 6 days ago by Firetron. Reason: Updated test script
    HaasScript Code
    --  ============================================================================
    --    Firetron's Candle
    --
    --    Creates and returns a Candle Class instance. Note that every property is a
    --    getter function.
    --
    --    Discord: @FiretronP75
    --  ============================================================================
    
    --  ========================================================
    --    Variables
    --  ========================================================
    
    --  ------------------------------------
    --    Definition
    --  ------------------------------------
    
    local description
    local inputSuggestions
    local output
    
    --  ------------------------------------
    --    Parameter
    --  ------------------------------------
    
    local pClosePrices
    local pHighPrices
    local pIndex
    local pLowPrices
    local pOpenPrices
    
    --  ========================================================
    --    Command Definition
    --  ========================================================
    
    description = 'Creates and returns a Candle Class instance. Note that every property is a getter function.'
    DefineCommand('Candle', description)
    
    --  ========================================================
    --    Parameter Definition
    --  ========================================================
    
    description      = 'Open Prices.'
    inputSuggestions = 'OpenPrices'
    pOpenPrices      = DefineParameter(ListNumberType, 'Open', description, true, {8,7,9}, inputSuggestions)
    
    description      = 'High prices.'
    inputSuggestions = 'HighPrices'
    pHighPrices      = DefineParameter(ListNumberType, 'High', description, true, {10,9,8}, inputSuggestions)
    
    description      = 'Low prices.'
    inputSuggestions = 'LowPrices'
    pLowPrices       = DefineParameter(ListNumberType, 'Low', description, true, {7,8,9}, inputSuggestions)
    
    description      = 'Close prices.'
    inputSuggestions = 'ClosePrices'
    pClosePrices     = DefineParameter(ListNumberType, 'Close', description, true, {9,7,8}, inputSuggestions)
    
    description      = 'Index to use from each price series. (1 for current candle, 2 for previous candle, etc)'
    pIndex           = DefineParameter(NumberType, 'Price Index', description, false, 1)
    
    --  ========================================================
    --    Class Definition
    --  ========================================================
    
    local Candle = function (open, high, low, close)
    
      --  ------------------------------------
      --    State Getters
      --  ------------------------------------
    
      local isGreen
    
      local IsGreen = function ()
    
        if isGreen != nil then return isGreen end
    
        isGreen = close > open
    
        return isGreen
    
      end
    
      --  ----------------
    
      local isRed
    
      local IsRed = function ()
    
        if isRed != nil then return isRed end
    
        isRed = close < open
    
        return isRed
    
      end
    
      --  ----------------
    
      local isDoji
    
      local IsDoji = function ()
    
        if isDoji != nil then return isDoji end
    
        isDoji = close == open
    
        return isDoji
    
      end
    
      --  ----------------
    
      local isDragonfly
    
      local IsDragonfly = function ()
    
        if isDragonfly != nil then return isDragonfly end
    
        isDragonfly = IsDoji() and close == high
    
        return isDragonfly
    
      end
    
      --  ----------------
    
      local isGravestone
    
      local IsGravestone = function ()
    
        if isGravestone != nil then return isGravestone end
    
        isGravestone = IsDoji() and close == low
    
        return isGravestone
    
      end
    
      --  ----------------
    
      local isLongLegged
    
      local IsLongLegged = function ()
    
        if isLongLegged != nil then return isLongLegged end
    
        isLongLegged = IsDoji() and close != high and close != low
    
        return isLongLegged
    
      end
    
      --  ------------------------------------
      --    Measurement Getters
      --  ------------------------------------
    
      local full
    
      local Full = function ()
    
        if full != nil then return full end
    
        full = high - low
    
        return full
    
      end
    
      --  ----------------
    
      local greenBody
    
      local GreenBody = function ()
    
        if greenBody != nil then return greenBody end
    
        greenBody = close - open
    
        return greenBody
    
      end
    
      --  ----------------
    
      local redBody
    
      local RedBody = function ()
    
        if redBody != nil then return redBody end
    
        redBody = open - close
    
        return redBody
    
      end
    
      --  ----------------
    
      local body
    
      local Body = function ()
    
        if body != nil then return body end
    
        if IsRed() then
          body = RedBody()
        else
          body = GreenBody()
        end
    
        return body
    
      end
    
      --  ----------------
    
      local greenTopWick
    
      local GreenTopWick = function ()
    
        if greenTopWick != nil then return greenTopWick end
    
        greenTopWick = high - close
    
        return greenTopWick
    
      end
    
      --  ----------------
    
      local redTopWick
    
      local RedTopWick = function ()
    
        if redTopWick != nil then return redTopWick end
    
        redTopWick = high - open
    
        return redTopWick
    
      end
    
      --  ----------------
    
      local topWick
    
      local TopWick = function ()
    
        if topWick != nil then return topWick end
    
        if IsRed() then
          topWick = RedTopWick()
        else
          topWick = GreenTopWick()
        end
    
        return topWick
    
      end
    
      --  ----------------
    
      local greenBottomWick
    
      local GreenBottomWick = function ()
    
        if greenBottomWick != nil then return greenBottomWick end
    
        greenBottomWick = open - low
    
        return greenBottomWick
    
      end
    
      --  ----------------
    
      local redBottomWick
    
      local RedBottomWick = function ()
    
        if redBottomWick != nil then return redBottomWick end
    
        redBottomWick = close - low
    
        return redBottomWick
    
      end
    
      --  ----------------
    
      local bottomWick
    
      local BottomWick = function ()
    
        if bottomWick != nil then return bottomWick end
    
        if IsRed() then
          bottomWick = RedBottomWick()
        else
          bottomWick = GreenBottomWick()
        end
    
        return bottomWick
    
      end
    
      --  ----------------
    
      local wicks
    
      local Wicks = function ()
    
        if wicks != nil then return wicks end
    
        wicks = Full() - Body()
    
        return wicks
    
      end
    
      --  ----------------
    
      local greenWithoutTopWick
    
      local GreenWithoutTopWick = function ()
    
        if greenWithoutTopWick != nil then return greenWithoutTopWick end
    
        greenWithoutTopWick = close - low
    
        return greenWithoutTopWick
    
      end
    
      --  ----------------
    
      local redWithoutTopWick
    
      local RedWithoutTopWick = function ()
    
        if redWithoutTopWick != nil then return redWithoutTopWick end
    
        redWithoutTopWick = open - low
    
        return redWithoutTopWick
    
      end
    
      --  ----------------
    
      local withoutTopWick
    
      local WithoutTopWick = function ()
    
        if withoutTopWick != nil then return withoutTopWick end
    
        if IsRed() then
          withoutTopWick = RedWithoutTopWick()
        else
          withoutTopWick = GreenWithoutTopWick()
        end
    
        return withoutTopWick
    
      end
    
      --  ----------------
    
      local greenWithoutBottomWick
    
      local GreenWithoutBottomWick = function ()
    
        if greenWithoutBottomWick != nil then return greenWithoutBottomWick end
    
        greenWithoutBottomWick = high - open
    
        return greenWithoutBottomWick
    
      end
    
      --  ----------------
    
      local redWithoutBottomWick
    
      local RedWithoutBottomWick = function ()
    
        if redWithoutBottomWick != nil then return redWithoutBottomWick end
    
        redWithoutBottomWick = high - close
    
        return redWithoutBottomWick
    
      end
    
      --  ----------------
    
      local withoutBottomWick
    
      local WithoutBottomWick = function ()
    
        if withoutBottomWick != nil then return withoutBottomWick end
    
        if IsRed() then
          withoutBottomWick = RedWithoutBottomWick()
        else
          withoutBottomWick = GreenWithoutBottomWick()
        end
    
        return withoutBottomWick
    
      end
    
      --  ------------------------------------
      --    Instance
      --  ------------------------------------
    
      return {
        IsGreen           = IsGreen,
        IsRed             = IsRed,
        IsDoji            = IsDoji,
        IsDragonfly       = IsDragonfly,
        IsGravestone      = IsGravestone,
        IsLongLegged      = IsLongLegged,
        Full              = Full,
        Body              = Body,
        Wicks             = Wicks,
        TopWick           = TopWick,
        BottomWick        = BottomWick,
        WithoutTopWick    = WithoutTopWick,
        WithoutBottomWick = WithoutBottomWick,
      }
    
    end
    
    --  ========================================================
    --    Execution
    --  ========================================================
    
    local close = ArrayGet(pClosePrices, pIndex)
    local high  = ArrayGet(pHighPrices,  pIndex)
    local low   = ArrayGet(pLowPrices,   pIndex)
    local open  = ArrayGet(pOpenPrices,  pIndex)
    
    output = Candle(open, high, low, close)
    
    --  ========================================================
    --    Output Definitions
    --  ========================================================
    
    description = 'ListDynamic where each element is a function.'
    DefineOutput(ListDynamicType, output, description)
    
    description = 'Function that returns true if the candle is green.'
    DefineOutputIndex( 1, DynamicType, 'IsGreen', description)
    
    description = 'Function that returns true if the candle is red.'
    DefineOutputIndex( 2, DynamicType, 'IsRed', description)
    
    description = 'Function that returns true if the candle is a doji.'
    DefineOutputIndex( 3, DynamicType, 'IsDoji', description)
    
    description = 'Function that returns true if the candle is a dragonfly doji.'
    DefineOutputIndex( 4, DynamicType, 'IsDragonfly', description)
    
    description = 'Function that returns true if the candle is a gravestone doji.'
    DefineOutputIndex( 5, DynamicType, 'IsGravestone', description)
    
    description = 'Function that returns true if the candle is a long-legged doji.'
    DefineOutputIndex( 6, DynamicType, 'IsLongLegged', description)
    
    description = 'Function that returns the full length of candle from wick to wick.'
    DefineOutputIndex( 7, DynamicType, 'Full', description)
    
    description = 'Function that returns the length of the candle body.'
    DefineOutputIndex( 8, DynamicType, 'Body', description)
    
    description = 'Function that returns the length of the candle without the body.'
    DefineOutputIndex( 9, DynamicType, 'Wicks', description)
    
    description = 'Function that returns the length of the candle top wick.'
    DefineOutputIndex(10, DynamicType, 'TopWick', description)
    
    description = 'Function that returns the length of the candle bottom wick.'
    DefineOutputIndex(11, DynamicType, 'BottomWick', description)
    
    description = 'Function that returns the length of the candle without the top wick.'
    DefineOutputIndex(12, DynamicType, 'WithoutTopWick', description)
    
    description = 'Function that returns the length of the candle without the bottom wick.'
    DefineOutputIndex(13, DynamicType, 'WithoutBottomWick', description)
    • #1615
      Kobalt
      Basic
      Up
      1
      Down

      KABOOM! great!

    • #1619
      pshai
      Admin
      Up
      1
      Down

      Nice work! This is great for breaking down candles.

Login or Register to Comment

Unlock your crypto trading potential

Create a free account and enjoy everything we have to offer.

Join for Free