{"spec_id":"renko-basic","library":"makie","language":"julia","code":"# anyplot.ai\n# renko-basic: Basic Renko Chart\n# Library: makie 0.21.9 | Julia 1.11.9\n# Quality: 90/100 | Created: 2026-09-02\n\nusing CairoMakie\nusing Colors\nusing Random\n\nRandom.seed!(42)\n\n# --- Theme tokens -----------------------------------------------------------\nTHEME    = get(ENV, \"ANYPLOT_THEME\", \"light\")\nPAGE_BG  = THEME == \"light\" ? colorant\"#FAF8F1\" : colorant\"#1A1A17\"\nINK      = THEME == \"light\" ? colorant\"#1A1A17\" : colorant\"#F0EFE8\"\nINK_SOFT = THEME == \"light\" ? colorant\"#4A4A44\" : colorant\"#B8B7B0\"\n\nBULLISH = colorant\"#009E73\"  # Imprint position 1 — semantic exception: gain/up\nBEARISH = colorant\"#AE3030\"  # Imprint position 5 — semantic exception: loss/down\n\n# --- Data: simulated daily closing prices, four alternating trend legs ------\nsegment_drifts = [0.35, -0.30, 0.25, -0.20]  # uptrend, downtrend, uptrend, downtrend\nsegment_length = 60\ndaily_sigma = 1.6\n\ncloses = Float64[140.0]\nfor drift in segment_drifts\n    for _ in 1:segment_length\n        push!(closes, closes[end] + randn() * daily_sigma + drift)\n    end\nend\n\n# --- Renko bricks: a brick is added once price moves by brick_size ----------\nbrick_size = 3.0\n\nbrick_low = Float64[]\nbrick_high = Float64[]\nbrick_up = Bool[]\n\nreference = closes[1]\n\nfor price in closes[2:end]\n    global reference\n    diff = price - reference\n    while diff >= brick_size\n        push!(brick_low, reference)\n        reference += brick_size\n        push!(brick_high, reference)\n        push!(brick_up, true)\n        diff -= brick_size\n    end\n    while diff <= -brick_size\n        push!(brick_high, reference)\n        reference -= brick_size\n        push!(brick_low, reference)\n        push!(brick_up, false)\n        diff += brick_size\n    end\nend\n\nbrick_index = collect(1:length(brick_up))\nbrick_colors = [up ? BULLISH : BEARISH for up in brick_up]\n\n# --- Plot ---------------------------------------------------------------------\nfig = Figure(\n    size            = (1600, 900),\n    fontsize        = 14,\n    backgroundcolor = PAGE_BG,\n)\n\nax = Axis(\n    fig[1, 1];\n    title             = \"renko-basic · julia · makie · anyplot.ai\",\n    titlesize         = 20,\n    titlecolor        = INK,\n    xlabel            = \"Brick Index\",\n    ylabel            = \"Price (\\$)\",\n    xlabelsize        = 14,\n    ylabelsize        = 14,\n    xlabelcolor       = INK,\n    ylabelcolor       = INK,\n    xticklabelsize    = 12,\n    yticklabelsize    = 12,\n    xticklabelcolor   = INK_SOFT,\n    yticklabelcolor   = INK_SOFT,\n    backgroundcolor   = PAGE_BG,\n    topspinevisible   = false,\n    rightspinevisible = false,\n    leftspinecolor    = INK_SOFT,\n    bottomspinecolor  = INK_SOFT,\n    xtickcolor        = INK_SOFT,\n    ytickcolor        = INK_SOFT,\n    xgridvisible      = false,\n    ygridcolor        = RGBAf(INK.r, INK.g, INK.b, 0.15),\n)\n\nbarplot!(\n    ax, brick_index, brick_high;\n    fillto      = brick_low,\n    width       = 0.8,\n    color       = brick_colors,\n    strokewidth = 0,\n)\n\naxislegend(\n    ax,\n    [PolyElement(color = BULLISH), PolyElement(color = BEARISH)],\n    [\"Bullish\", \"Bearish\"];\n    labelcolor = INK_SOFT,\n    framevisible = false,\n    position = :lt,\n)\n\n# --- Save -------------------------------------------------------------------\nsave(\"plot-$(THEME).png\", fig; px_per_unit = 2)\n"}