indicator-catalog

📁 daveskender/stock.indicators 📅 Jan 30, 2026
10
总安装量
9
周安装量
#30920
全站排名
安装命令
npx skills add https://github.com/daveskender/stock.indicators --skill indicator-catalog

Agent 安装分布

trae 9
kiro-cli 8
cursor 8
mcpjam 7
codebuddy 7
windsurf 7

Skill 文档

Indicator catalog development

File

src/{category}/{Indicator}/{Indicator}.Catalog.cs

Builder pattern

public static partial class Ema
{
    /// <summary>
    /// EMA Common Base Listing
    /// </summary>
    internal static readonly IndicatorListing CommonListing =
        new CatalogListingBuilder()
            .WithName("Exponential Moving Average")
            .WithId("EMA")
            .WithCategory(Category.MovingAverage)
            .AddParameter<int>("lookbackPeriods", "Lookback Period",
                description: "Number of periods for the EMA calculation",
                isRequired: true, defaultValue: 20, minimum: 2, maximum: 250)
            .AddResult("Ema", "EMA", ResultType.Default, isReusable: true)
            .Build();

    /// <summary>
    /// EMA Series Listing
    /// </summary>
    internal static readonly IndicatorListing SeriesListing =
        new CatalogListingBuilder(CommonListing)
            .WithStyle(Style.Series)
            .WithMethodName("ToEma")
            .Build();

    /// <summary>
    /// EMA Stream Listing
    /// </summary>
    internal static readonly IndicatorListing StreamListing =
        new CatalogListingBuilder(CommonListing)
            .WithStyle(Style.Stream)
            .WithMethodName("ToEmaHub")
            .Build();

    /// <summary>
    /// EMA Buffer Listing
    /// </summary>
    internal static readonly IndicatorListing BufferListing =
        new CatalogListingBuilder(CommonListing)
            .WithStyle(Style.Buffer)
            .WithMethodName("ToEmaList")
            .Build();
}

Method naming

Style Pattern Example
Series To{Name} ToEma
Stream To{Name}Hub ToEmaHub
Buffer To{Name}List ToEmaList

.WithMethodName() must be in style-specific listings, NOT in CommonListing.

Parameter patterns

  • AddParameter<T>() — int, double, bool
  • AddEnumParameter<T>() — enum types
  • AddDateParameter() — DateTime
  • AddSeriesParameter() — IReadOnlyList<T> where T : IReusable
  • minimum and maximum required for all numeric parameters

Result patterns

  • dataName must match property name in Models file exactly
  • isReusable: true only for the property mapping to IReusable.Value
  • ISeries models: all results must have isReusable: false
  • Exactly one isReusable: true per IReusable indicator

Categories

Category Examples
CandlestickPattern Doji, Marubozu
MovingAverage EMA, SMA, HMA, TEMA, WMA, DEMA
Oscillator RSI, Stochastic, MACD, CCI, BOP, CMO, Chop, DPO
PriceChannel Bollinger Bands, Keltner, Donchian, VWAP
PriceCharacteristic ATR, Beta, Standard Deviation, True Range
PricePattern Fractal, Pivot Points
PriceTransform Quote Part, ZigZag
PriceTrend ADX, Aroon, Alligator, AtrStop, SuperTrend, Vortex
StopAndReverse Chandelier, Parabolic SAR, Volatility Stop
VolumeBased OBV, Chaikin Money Flow, Chaikin Oscillator

Registration

src/_common/Catalog/Catalog.Listings.cs, PopulateCatalog() — alphabetical order:

_catalog.Add(Ema.SeriesListing);
_catalog.Add(Ema.StreamListing);
_catalog.Add(Ema.BufferListing);

Prohibited

  • .WithMethodName() in CommonListing
  • Wrong indicator method name
  • isReusable: true for ISeries models
  • Multiple isReusable: true results per indicator

Testing

tests/indicators/{folder}/{Indicator}/{Indicator}.Catalog.Tests.cs:

[TestClass]
public class EmaCatalogTests : TestBase
{
    [TestMethod]
    public void EmaSeriesListing()
    {
        var listing = Ema.SeriesListing;
        listing.Name.Should().Be("Exponential Moving Average");
        listing.Style.Should().Be(Style.Series);
        listing.MethodName.Should().Be("ToEma");
    }
}