Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1dc91c9
chore(deps): update dotnet monorepo (#77)
renovate[bot] Mar 12, 2026
f8dd7ef
chore(deps): update dotnet monorepo (#78)
renovate[bot] Mar 13, 2026
55a6efb
chore(deps): update dependency mudblazor to 9.2.0 (#79)
renovate[bot] Mar 18, 2026
87572ee
docs: add COMMERCIAL.md with enterprise pricing tiers and licensing s…
Mar 26, 2026
22a194d
chore(deps): update dependency defaultdocumentation to 1.2.5 (#87)
renovate[bot] Jun 13, 2026
241d20b
chore(deps): update actions/checkout action to v6.0.3 (#86)
renovate[bot] Jun 13, 2026
2f92a22
chore(deps): update dependency microsoft.testing.extensions.codecover…
renovate[bot] Jun 14, 2026
41197b7
chore(deps): update dependency mudblazor to 9.5.0 (#89)
renovate[bot] Jun 14, 2026
79d4016
chore(deps): update vstest monorepo to 18.6.0 (#90)
renovate[bot] Jun 14, 2026
e1150d5
chore(deps): update dependency dotnet.reproduciblebuilds to 2.0.5 (#92)
renovate[bot] Jun 19, 2026
9552be0
chore(deps): update vstest monorepo (#93)
renovate[bot] Jun 23, 2026
74b90e3
chore(deps): update dependency mudblazor to 9.6.0 (#94)
renovate[bot] Jun 27, 2026
d51d51f
chore(deps): update dependency microsoft.testing.extensions.codecover…
renovate[bot] Jul 8, 2026
dce12a6
chore(deps): update dependency mudblazor to 9.7.0 (#96)
renovate[bot] Jul 9, 2026
b616317
chore(deps): update dependency microsoft.net.test.sdk to 18.8.1 (#97)
renovate[bot] Jul 14, 2026
6b8e4be
chore(deps): update actions/checkout action to v6.1.0 (#99)
renovate[bot] Jul 21, 2026
42d0363
chore: add branded README banner
phmatray Jul 23, 2026
1ca267e
docs: add Tech Stack section derived from project manifests
phmatray Jul 23, 2026
a5b2745
docs: add Usage section
phmatray Jul 23, 2026
bc3731b
chore: add house-style .editorconfig
phmatray Jul 24, 2026
632c3d2
chore(renovate): extend the shared ci preset
phmatray Jul 24, 2026
d898101
ci: trigger on pull requests to the actual default branch (#101)
phmatray Jul 25, 2026
d2aa910
Merge branch 'dev' into main
phmatray Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 195 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
# EditorConfig — portfolio house style (.NET) · https://editorconfig.org
# Curated from the conventions shared across the reference repos (Koine,
# DotnetChain, MasterCommander): LF, UTF-8, 4-space indent, file-scoped
# namespaces, Allman braces, sorted usings, _camelCase private fields.
# Severities are capped at `warning` — this guides the IDE and `dotnet format`,
# it never fails a build on its own.
root = true

# ---------------------------------------------------------------------------
# All files
# ---------------------------------------------------------------------------
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4

# Data / project / markup files use 2-space indent
[*.{json,jsonc,yml,yaml,xml,csproj,fsproj,props,targets,slnx,config,razor}]
indent_size = 2

[*.{ts,tsx,js,jsx,css,scss,html}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false # trailing two spaces are meaningful line breaks

[Makefile]
indent_style = tab

# ---------------------------------------------------------------------------
# C# conventions
# ---------------------------------------------------------------------------
[*.cs]
indent_size = 4
max_line_length = 140

# --- Language / usings ---
csharp_using_directive_placement = outside_namespace:warning
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false
csharp_style_namespace_declarations = file_scoped:warning

# --- this. qualification (never qualify with this.) ---
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning

# --- var / type preferences ---
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:suggestion

# --- expression-bodied members ---
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_constructors = false:suggestion
csharp_style_expression_bodied_operators = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_accessors = true:suggestion
csharp_style_expression_bodied_lambdas = true:suggestion

# --- modern C# idioms ---
csharp_prefer_braces = true:warning # always brace if/else/for/while, even single-statement bodies
csharp_style_prefer_switch_expression = true:suggestion
csharp_style_prefer_pattern_matching = true:suggestion
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
csharp_style_pattern_matching_over_as_with_null_check = true:warning
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_null_propagation = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_readonly_field = true:warning

# --- accessibility & modifiers ---
dotnet_style_require_accessibility_modifiers = for_non_interface_members:warning
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async:warning
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning

# --- new-line / brace formatting (Allman) ---
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true

# --- indentation / spacing / wrapping ---
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_around_binary_operators = before_and_after
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false

# --- unnecessary-code preferences ---
dotnet_code_quality_unused_parameters = non_public:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent

# ---------------------------------------------------------------------------
# Naming conventions
# ---------------------------------------------------------------------------
# Types & namespaces: PascalCase
dotnet_naming_rule.types_pascal.severity = warning
dotnet_naming_rule.types_pascal.symbols = types_and_namespaces
dotnet_naming_rule.types_pascal.style = pascal_case
dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace,class,struct,interface,enum,delegate
dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = *

# Interfaces: IPascalCase
dotnet_naming_rule.interfaces_i_prefix.severity = warning
dotnet_naming_rule.interfaces_i_prefix.symbols = interfaces
dotnet_naming_rule.interfaces_i_prefix.style = i_pascal_case
dotnet_naming_symbols.interfaces.applicable_kinds = interface
dotnet_naming_style.i_pascal_case.required_prefix = I
dotnet_naming_style.i_pascal_case.capitalization = pascal_case

# Type parameters: TPascalCase
dotnet_naming_rule.type_params_t_prefix.severity = warning
dotnet_naming_rule.type_params_t_prefix.symbols = type_parameters
dotnet_naming_rule.type_params_t_prefix.style = t_pascal_case
dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter
dotnet_naming_style.t_pascal_case.required_prefix = T
dotnet_naming_style.t_pascal_case.capitalization = pascal_case

# Public members: PascalCase
dotnet_naming_rule.public_members_pascal.severity = warning
dotnet_naming_rule.public_members_pascal.symbols = public_members
dotnet_naming_rule.public_members_pascal.style = pascal_case
dotnet_naming_symbols.public_members.applicable_kinds = property,method,field,event
dotnet_naming_symbols.public_members.applicable_accessibilities = public,internal,protected,protected_internal

# Constants: PascalCase
dotnet_naming_rule.constants_pascal.severity = warning
dotnet_naming_rule.constants_pascal.symbols = constants
dotnet_naming_rule.constants_pascal.style = pascal_case
dotnet_naming_symbols.constants.applicable_kinds = field
dotnet_naming_symbols.constants.required_modifiers = const

# Private/internal instance fields: _camelCase
dotnet_naming_rule.private_fields_underscore.severity = warning
dotnet_naming_rule.private_fields_underscore.symbols = private_fields
dotnet_naming_rule.private_fields_underscore.style = underscore_camel_case
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private,private_protected
dotnet_naming_style.underscore_camel_case.required_prefix = _
dotnet_naming_style.underscore_camel_case.capitalization = camel_case

# Static readonly private fields may be PascalCase — keep lenient
dotnet_naming_rule.static_private_fields_pascal.severity = silent
dotnet_naming_rule.static_private_fields_pascal.symbols = static_private_fields
dotnet_naming_rule.static_private_fields_pascal.style = pascal_case
dotnet_naming_symbols.static_private_fields.applicable_kinds = field
dotnet_naming_symbols.static_private_fields.applicable_accessibilities = private
dotnet_naming_symbols.static_private_fields.required_modifiers = static,readonly

# Locals & parameters: camelCase
dotnet_naming_rule.locals_camel.severity = suggestion
dotnet_naming_rule.locals_camel.symbols = locals_and_params
dotnet_naming_rule.locals_camel.style = camel_case
dotnet_naming_symbols.locals_and_params.applicable_kinds = parameter,local

# Shared style definitions
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.camel_case.capitalization = camel_case

# ---------------------------------------------------------------------------
# Generated code — expected to respect the rules, but analysis is skipped
# ---------------------------------------------------------------------------
[**/{Generated,generated}/**.cs]
generated_code = true

# ---------------------------------------------------------------------------
# Tests — relax rules that fight common test idioms
# ---------------------------------------------------------------------------
[**/*{Tests,Test,Specs}/**.cs]
dotnet_diagnostic.IDE0058.severity = none # expression value never used (Assert/builder calls)
Binary file added .github/banner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 2 additions & 3 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
workflow_dispatch:

permissions:
Expand All @@ -23,7 +22,7 @@ jobs:
dotnet-version: ['10.0.x']

steps:
- uses: actions/checkout@v6.0.2
- uses: actions/checkout@v6.1.0
with:
fetch-depth: 0 # Full history for MinVer

Expand Down Expand Up @@ -55,7 +54,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6.1.0
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down
109 changes: 109 additions & 0 deletions COMMERCIAL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# 💼 TaLibStandard — Commercial & Enterprise

TaLibStandard is **open source** (GPL-3.0) for individual and research use.
For commercial applications, we offer flexible licensing and support options.

---

## 🎯 Who Is This For?

| Use Case | License |
|---|---|
| Personal projects, research, academic use | ✅ GPL-3.0 (free) |
| Startup / bootstrapped product | ✅ GPL-3.0 (free, GPL terms apply) |
| Commercial SaaS or proprietary software | 💼 Commercial license required |
| Trading firm / hedge fund / prop shop | 🏢 Enterprise license |
| Cloud API or hosted service | ☁️ Enterprise / OEM license |

> **GPL-3.0 means:** If you distribute a product that includes TaLibStandard, your product must also be open source under GPL-3.0. If you need to keep your code proprietary, a commercial license removes this requirement.

---

## 📦 Licensing Tiers

### 🥉 Developer License — €299 / year
> For independent developers and small teams (≤ 3 developers)

- Commercial use in proprietary applications
- Email support (48h response)
- Access to all future versions in the license year
- Named-developer license (non-transferable)

---

### 🥈 Professional License — €999 / year
> For companies and teams of up to 10 developers

- Everything in Developer
- Priority email support (24h response)
- Integration guidance session (1h/year)
- Up to 10 developer seats
- Use in multiple commercial projects

---

### 🥇 Enterprise License — from €3,999 / year
> For hedge funds, prop trading firms, fintech companies, and larger teams

- Everything in Professional
- Unlimited developer seats
- Dedicated support channel (Slack / Teams)
- SLA: critical bugs fixed within 5 business days
- Architecture review session (2h/year)
- Custom indicator development (available as add-on)
- OEM redistribution rights available

---

### ☁️ Cloud API (coming soon)
> Hosted TaLibStandard as a service — no .NET required

- REST + gRPC endpoints for all 200+ indicators
- Pay-per-call pricing model
- SDKs for Python, JavaScript, Rust (planned)
- Ideal for: non-.NET stacks, serverless, backtesting pipelines

---

## 🤝 Custom Development

Need an indicator that doesn't exist yet? Custom backtesting integration? Real-time SignalR feed?

We offer **paid consulting** for:
- Custom indicator development
- Integration with trading platforms (TradingView, MT4/MT5, Interactive Brokers)
- Performance optimization for high-frequency workloads
- Quant workshop training (remote or on-site)

---

## 📩 How to Purchase or Inquire

1. **Open an issue** with the label `[commercial]` in this repository, or
2. **Contact us directly:** [atypical.consulting](https://atypical.garry-ai.cloud)

We typically respond within 1 business day.

---

## 🔐 FAQ

**Q: Can I evaluate TaLibStandard in a commercial project before purchasing?**
A: Yes. You can use the GPL-3.0 version for a 30-day evaluation. After 30 days, a commercial license is required for production use in proprietary systems.

**Q: Does the commercial license cover NuGet packages?**
A: Yes — `Atypical.TechnicalAnalysis.Functions` and `Atypical.TechnicalAnalysis.Candles` are both covered.

**Q: What happens if I upgrade my team size?**
A: Contact us. We'll prorate the upgrade to your current license period.

**Q: Is source code access included?**
A: Yes — the source is on GitHub. The commercial license grants you the right to use it in proprietary software, not a separate private build.

**Q: Do you offer volume discounts for multi-year contracts?**
A: Yes. Contact us for multi-year or multi-product quotes.

---

_Atypical Consulting SRL — BE 0744.517.956 — Belgium_
_Built with care for the algorithmic trading community._
24 changes: 12 additions & 12 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,30 @@
</PropertyGroup>
<ItemGroup>
<!-- Code Analyzers -->
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.103" />
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.201" />
<!-- Build Tools -->
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="2.0.2" />
<PackageVersion Include="Microsoft.DotNet.HotReload.WebAssembly.Browser" Version="10.0.103" />
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="2.0.5" />
<PackageVersion Include="Microsoft.DotNet.HotReload.WebAssembly.Browser" Version="10.0.201" />
<PackageVersion Include="MinVer" Version="7.0.0" />
<!-- Documentation -->
<PackageVersion Include="DefaultDocumentation" Version="1.2.4" />
<PackageVersion Include="DefaultDocumentation" Version="1.2.5" />
<!-- Testing -->
<PackageVersion Include="AutoFixture" Version="4.18.1" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageVersion Include="Microsoft.Testing.Extensions.CodeCoverage" Version="18.5.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
<PackageVersion Include="Microsoft.Testing.Extensions.CodeCoverage" Version="18.9.0" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.v3.runner.console" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<!-- Demo Dependencies -->
<PackageVersion Include="YahooFinanceApi" Version="2.3.3" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.3" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.5" />
<!-- Blazor Demo Dependencies -->
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.3" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.3" />
<PackageVersion Include="MudBlazor" Version="9.1.0" />
<PackageVersion Include="System.Text.Json" Version="10.0.3" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.5" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.5" />
<PackageVersion Include="MudBlazor" Version="9.7.0" />
<PackageVersion Include="System.Text.Json" Version="10.0.5" />
<PackageVersion Include="PublishSPAforGitHubPages.Build" Version="3.0.3" />
</ItemGroup>
</Project>
Loading
Loading