{ "cells": [ { "cell_type": "code", "execution_count": 46, "metadata": { "dotnet_interactive": { "language": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
Installed Packages
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#r \"nuget: QuanTAlib\"\n", "#r \"nuget: Plotly.NET;\"\n", "#r \"nuget: Plotly.NET.Interactive;\"\n", "\n", "using QuanTAlib;\n", "using Plotly.NET;\n", "using Plotly.NET.LayoutObjects;" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "string symbol=\"SPY\"; // we'll focus on SPY symbol\n", "int warmup = 50; // we'll allow 50 bars to pass by with no trading - for warm-up\n", "Yahoo_Feed bars = new(symbol,350); //collect bars of symbol from Yahoo feed\n", "TSeries data = bars.Close; //we need just one average value - (Open+High+Low+CLose)/4\n", "\n", "//make a chart\n", "var d = Chart2D.Chart.Candlestick(bars.Open.v.Skip(warmup).ToList(), bars.High.v.Skip(warmup).ToList(),\n", "bars.Low.v.Skip(warmup).ToList(), bars.Close.v.Skip(warmup).ToList(), bars.Open.t.Skip(warmup).ToList(), symbol)\n", " .WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false)).WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle(symbol);\n", "d" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "dotnet_interactive": { "language": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "JMA_Series fastMA = new(data,12); //typically MACD uses EMA(12), but let's try with superior JMA(12)\n", "JMA_Series slowMA = new(data,26); //likewise, let's use JMA(26) instead of EMA(26)\n", "\n", "//make a chart\n", "var cfast = Chart2D.Chart.Line(fastMA.t.Skip(warmup).ToList(), fastMA.v.Skip(warmup).ToList(), false, \"Fast MA\").WithLineStyle(Width: 2, Color: Color.fromString(\"blue\"));\n", "var cslow = Chart2D.Chart.Line(slowMA.t.Skip(warmup).ToList(), slowMA.v.Skip(warmup).ToList(), false, \"Slow MA\").WithLineStyle(Width: 2, Color: Color.fromString(\"red\"));\n", "var chart = Chart.Combine(new []{cfast,cslow}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"slow MA and fast MA of {symbol} OHLC4\");\n", "chart" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "SUB_Series MACD_line = new(fastMA, slowMA); //MACD line is just a SUBtraction fastMA-slowMA\n", "JMA_Series signal_line = new(MACD_line, 9); //signal line is an EMA(9) of MACD; we use superior JMA(9) instead\n", "\n", "//make a chart\n", "var cfast = Chart2D.Chart.Line(MACD_line.t.Skip(warmup).ToList(), MACD_line.v.Skip(warmup).ToList(), false, \"MACD\").WithLineStyle(Width: 2, Color: Color.fromString(\"orange\"));\n", "var cslow = Chart2D.Chart.Line(signal_line.t.Skip(warmup).ToList(), signal_line.v.Skip(warmup).ToList(), false, \"signal\").WithLineStyle(Width: 2, Color: Color.fromString(\"green\"));\n", "var chart = Chart.Combine(new []{cfast,cslow}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"MACD line and signal line of fastMA-slowMA\");\n", "chart" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "SUB_Series histogram = new(MACD_line, signal_line); //MACD histogram is an oscillator of MACD-signal\n", "\n", "//make a chart\n", "var cfast = Chart2D.Chart.Column(values: histogram.v.Skip(warmup).ToList(), Keys: histogram.t.Skip(warmup).ToList())\n", ".WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false)).WithXAxisRangeSlider(RangeSlider.init(Visible:false))\n", ".WithTitle(\"MACD histogram of MACD-signal\");\n", "cfast" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "COMPARE_Series over = new(histogram,0); //generate over/under series when histogram is above/below zero\n", "CROSS_Series trades = new(histogram,0); //generate a signal series where histogram crosses zero (from below and from above)\n", "\n", "//make a chart\n", "var cover = Chart2D.Chart.Line(over.t.Skip(warmup).ToList(),over.v.Skip(warmup).ToList(),false,\"state\").WithLineStyle(Width: 1, Color: Color.fromString(\"blue\"));\n", "var cbars = Chart2D.Chart.Area(trades.t.Skip(warmup).ToList(), trades.v.Skip(warmup).ToList(),false );\n", "var chart = Chart.Combine(new []{cover,cbars}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle(\"in-market signal and trading orders based on MACD histogram\");\n", "chart" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "EQUITY_Series folio = new(trades, data, Long:true, Short:false, Warmup:warmup); //generate equity curve from trades and\n", "\n", "//make a chart\n", "var cbars = Chart2D.Chart.Area(folio.t.Skip(warmup).ToList(), folio.v.Skip(warmup).ToList(),false ).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"Equity curve (long trades only) for MACD on {symbol}\");\n", "cbars" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
107.93999999999998
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "// some what-if examples\n", "string symbol=\"IBM\";\n", "int warmup = 50;\n", "Yahoo_Feed bars = new(symbol,350);\n", "TSeries data = bars.Close;\n", "HEMA_Series fastMA = new(data,12);\n", "JMA_Series slowMA = new(data,23,-100);\n", "SUB_Series MACD_line = new(fastMA, slowMA);\n", "JMA_Series signal_line = new(MACD_line, 9);\n", "SUB_Series histogram = new(MACD_line, signal_line);\n", "CROSS_Series trades = new(histogram,0);\n", "EQUITY_Series folio = new(trades, data, Long:true, Short:false, Warmup:warmup);\n", "folio[^1].v" ] } ], "metadata": { "kernelspec": { "display_name": ".NET (C#)", "language": "C#", "name": ".net-csharp" }, "language_info": { "name": "polyglot-notebook" }, "polyglot_notebook": { "kernelInfo": { "defaultKernelName": "csharp", "items": [ { "aliases": [ "C#", "c#" ], "languageName": "C#", "name": "csharp" }, { "aliases": [ "frontend" ], "name": "vscode" } ] } } }, "nbformat": 4, "nbformat_minor": 2 }