{"spec_id":"indicator-macd","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nindicator-macd: MACD Technical Indicator Chart\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 80/100 | Updated: 2026-05-16\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport pygal\nfrom pygal.style import Style\n\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\nnp.random.seed(42)\n\nn_days = 150\ndates = pd.date_range(\"2024-01-01\", periods=n_days, freq=\"D\")\nprice = 100 + np.cumsum(np.random.randn(n_days) * 2 + 0.05)\n\nprice_series = pd.Series(price)\nema_12 = price_series.ewm(span=12, adjust=False).mean().values\nema_26 = price_series.ewm(span=26, adjust=False).mean().values\n\nmacd_line = ema_12 - ema_26\n\nmacd_series = pd.Series(macd_line)\nsignal_line = macd_series.ewm(span=9, adjust=False).mean().values\n\nhistogram = macd_line - signal_line\n\nstart_idx = 50\ndates = dates[start_idx:]\nmacd_line = macd_line[start_idx:]\nsignal_line = signal_line[start_idx:]\nhistogram = histogram[start_idx:]\n\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\n    colors=(\"#009E73\", \"#C475FD\", \"#2CA02C\", \"#D62728\", INK_MUTED),\n    title_font_size=28,\n    label_font_size=22,\n    major_label_font_size=18,\n    legend_font_size=16,\n    value_font_size=14,\n    stroke_width=3,\n)\n\nchart = pygal.Line(\n    width=4800,\n    height=2700,\n    style=custom_style,\n    title=\"indicator-macd · pygal · anyplot.ai\",\n    x_title=\"Date\",\n    y_title=\"MACD Value\",\n    show_x_guides=False,\n    show_y_guides=True,\n    x_label_rotation=45,\n    legend_at_bottom=True,\n    legend_box_size=36,\n    margin=60,\n    show_dots=False,\n    fill=False,\n    zero=0,\n)\n\ndate_labels = [d.strftime(\"%b %d\") if i % 20 == 0 else \"\" for i, d in enumerate(dates)]\nchart.x_labels = date_labels\n\nhist_positive = [h if h >= 0 else 0 for h in histogram]\nhist_negative = [h if h < 0 else 0 for h in histogram]\n\nchart.add(\"Histogram (+)\", hist_positive, fill=True, stroke_style={\"width\": 0})\nchart.add(\"Histogram (−)\", hist_negative, fill=True, stroke_style={\"width\": 0})\n\nchart.add(\"MACD (12,26)\", list(macd_line), stroke_style={\"width\": 3})\nchart.add(\"Signal (9)\", list(signal_line), stroke_style={\"width\": 3})\n\nzero_line = [0] * len(macd_line)\nchart.add(\"Zero\", zero_line, stroke_style={\"width\": 2, \"dasharray\": \"15, 8\"})\n\nchart.render_to_png(f\"plot-{THEME}.png\")\n\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(chart.render())\n"}