{"slug":"open-source-tradingview-optimizer","qid":"ma_grid","label":"ma_grid","post_title":"open-source-tradingview-optimizer","post_url":"/blog/open-source-tradingview-optimizer#q-ma_grid","columns":["cell","sharpe"],"rows":[{"cell":"5 / 200","sharpe":0.93},{"cell":"5 / 150","sharpe":0.88},{"cell":"10 / 200","sharpe":0.84},{"cell":"10 / 100","sharpe":0.83},{"cell":"15 / 200","sharpe":0.82},{"cell":"25 / 200","sharpe":0.78},{"cell":"15 / 100","sharpe":0.78},{"cell":"20 / 200","sharpe":0.74},{"cell":"10 / 150","sharpe":0.74},{"cell":"15 / 150","sharpe":0.73},{"cell":"30 / 200","sharpe":0.71},{"cell":"5 / 100","sharpe":0.7},{"cell":"10 / 50","sharpe":0.7},{"cell":"5 / 50","sharpe":0.68},{"cell":"20 / 150","sharpe":0.66},{"cell":"30 / 150","sharpe":0.66},{"cell":"30 / 50","sharpe":0.65},{"cell":"25 / 150","sharpe":0.64},{"cell":"20 / 100","sharpe":0.63},{"cell":"15 / 50","sharpe":0.61},{"cell":"20 / 50","sharpe":0.61},{"cell":"30 / 100","sharpe":0.6},{"cell":"25 / 50","sharpe":0.57},{"cell":"25 / 100","sharpe":0.46}],"shape":"ranking","sql":"WITH\n    series AS\n    (\n        SELECT arraySort(r -> r.1, groupArray((date, toFloat64(close)))) AS rows_sorted\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n          AND date >= '2016-01-04'\n          AND date <= '2025-06-30'\n    ),\n    grid AS\n    (\n        SELECT\n            arrayMap(r -> r.2, rows_sorted) AS px,\n            g.1                             AS fast,\n            g.2                             AS slow\n        FROM series\n        ARRAY JOIN\n        [\n            (5, 50), (5, 100), (5, 150), (5, 200),\n            (10, 50), (10, 100), (10, 150), (10, 200),\n            (15, 50), (15, 100), (15, 150), (15, 200),\n            (20, 50), (20, 100), (20, 150), (20, 200),\n            (25, 50), (25, 100), (25, 150), (25, 200),\n            (30, 50), (30, 100), (30, 150), (30, 200)\n        ] AS g\n    ),\n    cells AS\n    (\n        SELECT\n            fast,\n            slow,\n            arrayMap(\n                i -> if(arrayAvg(arraySlice(px, i - fast + 1, fast)) > arrayAvg(arraySlice(px, i - slow + 1, slow)),\n                        px[i + 1] / px[i] - 1,\n                        0.0),\n                range(200, length(px))\n            ) AS rets\n        FROM grid\n    )\nSELECT\n    concat(toString(fast), ' / ', toString(slow)) AS cell,\n    round(arrayAvg(rets)\n          / sqrt(arrayAvg(arrayMap(r -> r * r, rets)) - pow(arrayAvg(rets), 2))\n          * sqrt(252), 2)                         AS sharpe\nFROM cells\nORDER BY sharpe DESC","computed_at":"2026-09-22T14:53:22.467831+00:00","elapsed":0.005780831}