SIMD Refactor: Merge simd-dev into dev (#55)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: aider (openrouter/anthropic/claude-sonnet-4) <aider@aider.chat> Co-authored-by: Warp <agent@warp.dev>
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(dotnet test:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nRemove coverlet.msbuild to fix BadImageFormatException warnings\n\nSwitch from coverlet.msbuild to coverlet.collector approach to eliminate\nPDB-related warnings on .NET 10. Add runsettings file for optional coverage.\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git push:*)",
|
||||
"Bash(dotnet build:*)",
|
||||
"Bash(where:*)",
|
||||
"Bash(findstr:*)",
|
||||
"Bash(qodana scan:*)",
|
||||
"Bash(dir:*)",
|
||||
"Bash(docker info:*)",
|
||||
"Bash(npx markdownlint-cli:*)",
|
||||
"Bash(dotnet restore:*)",
|
||||
"WebSearch",
|
||||
"WebFetch(domain:www.jetbrains.com)",
|
||||
"Bash(powershell -Command:*)",
|
||||
"Bash(powershell -NoProfile -File -:*)",
|
||||
"Bash(powershell -NoProfile -ExecutionPolicy Bypass -File C:githubquantalibfix-whitespace.ps1)",
|
||||
"Bash(powershell -NoProfile -ExecutionPolicy Bypass -File \"C:\\\\github\\\\quantalib\\\\fix-whitespace.ps1\")",
|
||||
"Bash(dotnet clean:*)"
|
||||
]
|
||||
},
|
||||
"mcpServers": {
|
||||
"MCP Docs": {
|
||||
"type": "sse",
|
||||
"url": "https://gitmcp.io/docs"
|
||||
},
|
||||
"tavily": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "tavily-mcp@latest"],
|
||||
"env": {
|
||||
"TAVILY_API_KEY": "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"
|
||||
}
|
||||
},
|
||||
"Ref": {
|
||||
"command": "npx",
|
||||
"args": ["ref-tools-mcp@latest"],
|
||||
"env": {
|
||||
"REF_API_KEY": "ref-c60dc6e79ca35aaccf30"
|
||||
}
|
||||
},
|
||||
"sequential-thinking": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"]
|
||||
},
|
||||
"wolfram-mcp": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "wolfram-mcp@latest"],
|
||||
"env": {
|
||||
"WOLFRAM_APP_ID": "83E9X2U98T"
|
||||
}
|
||||
},
|
||||
"qdrant": {
|
||||
"command": "uvx",
|
||||
"args": ["mcp-server-qdrant"],
|
||||
"env": {
|
||||
"QDRANT_URL": "http://192.168.1.85:6333",
|
||||
"COLLECTION_NAME": "agent_memory",
|
||||
"EMBEDDING_MODEL": "sentence-transformers/all-MiniLM-L6-v2"
|
||||
}
|
||||
},
|
||||
"codacy": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@codacy/codacy-mcp"],
|
||||
"env": {
|
||||
"CODACY_ACCOUNT_TOKEN": "HJgLyN2VclacmCEVxhkT"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,408 @@
|
||||
# QuanTAlib Master Protocol (AI Agents)
|
||||
WARN: repo laws/physics. Read relevant sections bf code. Noncompliance→reject.
|
||||
|
||||
DCT{
|
||||
1:Hot paths allocation-free (no heap alloc); GC pressure enemy;
|
||||
2:Streaming updates O(1) when math allows;
|
||||
3:Dual API: stateful Update + stateless static Calculate;
|
||||
4:Bar correction via isNew rollback (same timestamp rewrite);
|
||||
5:Robustness: handle NaN/Infinity via last-valid-value substitution; never propagate invalids;
|
||||
6:SoA: store primitives in concrete List<T> fields + expose spans via CollectionsMarshal.AsSpan;
|
||||
7:SIMD in Calculate where possible; scalar fallback else;
|
||||
8:Docs: technical correctness + measurable evidence + skeptical-architect tone; markdownlint strict.
|
||||
}
|
||||
|
||||
QUICKSTART: DO:{Create Indicator}#p1; DO:{Create Adapters for Quantower + other platforms}#p1; DO:{Write comprehensive Tests + validations}#p1; DO:{Write Stylistically + Structurally correct Docs}#p2; DO:{Performance Tuning}#p1.
|
||||
|
||||
CRIT_PATTERNS:
|
||||
- State: use `private record struct State`
|
||||
- Stack-only: prefer `readonly ref struct` when something should absolutely never leave the stack
|
||||
- Imports: prefer `using static` for math-heavy/pure helper classes to reduce ceremony and keep expressions readable
|
||||
- Types: prefer nullable annotations for optional refs; prefer `record`/`record struct` for value-like models/state
|
||||
- Code clarity: prioritize self-documenting names/structure; use comments for “why”, not “what”
|
||||
- Encapsulation: prefer `file` types for internal-only helpers
|
||||
- Closures: prefer `static` local functions to avoid accidental captures
|
||||
- Discards: use explicit discard (`_ = expr;`) when intentionally ignoring a return value
|
||||
- Lifetimes: use `scoped ref` parameters for internal APIs to constrain lifetimes
|
||||
- Events: `source.Pub += Handle;`
|
||||
- Args: `ArgumentException` + `nameof(param)`
|
||||
- FMA: `Math.FusedMultiplyAdd(a, b, c)` for `a*b+c`
|
||||
- Storage: `List<T>` fields for SoA (suppress MA0016 narrowly around those fields)
|
||||
- Time: always `DateTime.UtcNow` (never `DateTime.Now`)
|
||||
- Tests: use `GBM` for data; never `System.Random`
|
||||
|
||||
1) IDENTITY & MISSION
|
||||
- QuanTAlib: high-perf, ^1 C# lib for quantitative technical analysis.
|
||||
- Model: IF PineScript exists in same indicator dir → use as foundation.
|
||||
- Target: Quantower + custom C# trading engines.
|
||||
- Philosophy: Speed + Correctness + Memory Efficiency.
|
||||
|
||||
2) ARCHITECTURE & PHYSICS
|
||||
2.1 Memory model (^6)
|
||||
- No objects-in-lists; primitives-in-arrays.
|
||||
- TSeries internal: `List<long> _t` (timestamps), `List<double> _v` (values).
|
||||
- Access: expose `ReadOnlySpan<double>` for SIMD.
|
||||
- Analyzer note: MA0016 suggests abstractions; suppress only around core List<T> fields by design.
|
||||
|
||||
2.2 Core types
|
||||
- `TValue` struct (16 bytes): `DateTime Time`, `double Value`.
|
||||
- `TBar` struct (48 bytes): `DateTime Time`, `double Open, High, Low, Close, Volume`.
|
||||
- `TSeries` primary time-series DS; `ITValuePublisher` reactive flow.
|
||||
|
||||
2.3 Design principles
|
||||
- Source material: PineScript at [U1].
|
||||
- ^1: use `Span<T>`, `stackalloc`, pinned mem where needed.
|
||||
- ^2: running sums/products or RingBuffer; avoid history re-iter.
|
||||
- ^3: Update + Calculate.
|
||||
- ^4: isNew rollback required.
|
||||
- ^5: NaN/Infinity safe.
|
||||
- Reactive: implement `ITValuePublisher`.
|
||||
- Time handling: `DateTime.UtcNow`.
|
||||
|
||||
2.4 Performance rules (hard constraints)
|
||||
- Update MUST satisfy ^1 and ^2.
|
||||
- SIMD: Calculate should use `System.Runtime.Intrinsics` (AVX2) or `System.Numerics.Vector<T>`; use `Vector.ConditionalSelect` for branchless edge handling (eg div0). If recursion blocks SIMD → prefer `stackalloc` buffers.
|
||||
- Hot methods: `[MethodImpl(MethodImplOptions.AggressiveInlining)]`.
|
||||
- Tight loops: `[SkipLocalsInit]`.
|
||||
|
||||
2.5 FMA patterns (use in hot paths)
|
||||
- EMA smoothing: `x + alpha * (y - x)` → `Math.FusedMultiplyAdd(x, decay, alpha * y)` where `decay = 1 - alpha`
|
||||
- Weighted sum: `a*w1 + b*w2` → `Math.FusedMultiplyAdd(a, w1, b * w2)`
|
||||
- Linear combo: `3.0*a - b` → `Math.FusedMultiplyAdd(3.0, a, -b)`
|
||||
- Cross product: `(a*b) + (c*d)` → `Math.FusedMultiplyAdd(a, b, c * d)`
|
||||
- IIR: `coef*input + feedback*state` → `Math.FusedMultiplyAdd(coef, input, feedback * state)`
|
||||
Use FMA for EMA-style smoothing, IIR (Butterworth/Chebyshev/SSF), HTIT/MAMA-style homodyne, any `a*b+c`.
|
||||
Avoid FMA for simple ops, when intermediate rounding required, or in SIMD paths (use `Fma.MultiplyAdd` / `Avx512F.FusedMultiplyAdd` / `AdvSimd.Arm64.FusedMultiplyAdd`).
|
||||
Precompute decay constants:
|
||||
`private readonly double _alpha; private readonly double _decay; // = 1 - _alpha`
|
||||
Hot path: `result = Math.FusedMultiplyAdd(prevState, _decay, _alpha * newInput);`
|
||||
|
||||
3) IMPLEMENTATION STANDARDS (every indicator)
|
||||
3.1 File layout
|
||||
DIR: `lib/[category]/[name]/` (eg `lib/trends/sma/`)
|
||||
REQ files:
|
||||
- `[Name].cs` (main impl, `public sealed class`)
|
||||
- `[Name].Tests.cs` (xUnit)
|
||||
- `[Name].Validation.Tests.cs` (vs TA-Lib/Skender/Tulip/Ooples)
|
||||
- `[Name].md` (docs + formulas)
|
||||
- `[Name].Quantower.cs` (adapter)
|
||||
- `[Name].Quantower.Tests.cs` (adapter tests)
|
||||
|
||||
3.2 Class definition
|
||||
- Namespace `QuanTAlib`; `[SkipLocalsInit]`; `public sealed class`; implements `ITValuePublisher`.
|
||||
|
||||
3.3 State mgmt
|
||||
- Scalar state: `private record struct State` grouping all scalar vars.
|
||||
- Maintain `_state` (current) + `_p_state` (prev valid).
|
||||
- Buffers: `RingBuffer` for sliding windows.
|
||||
- Resync: periodic full recalculation (eg every 1000 ticks) to limit floating drift in running sums.
|
||||
|
||||
3.4 Constructor rules
|
||||
- Validate params: throw `ArgumentException` + `nameof()`.
|
||||
- Set Name: eg `$\"Sma({period})\"`.
|
||||
- Support chaining ctor: `public [Name](ITValuePublisher source, ...)`.
|
||||
- Event subscribe: `source.Pub += Handle;` (no defensive null checks when source is non-nullable).
|
||||
|
||||
3.5 Update(TValue) contract
|
||||
SIG: `public TValue Update(TValue input, bool isNew = true)` w/ `[MethodImpl(MethodImplOptions.AggressiveInlining)]`
|
||||
FLOW:
|
||||
- IF isNew→ `_p_state=_state` then advance counters; ELSE rollback `_state=_p_state`.
|
||||
- Validate input: if `!double.IsFinite` → substitute last-valid (stored in State).
|
||||
- Compute (apply FMA where relevant).
|
||||
- Publish: update `Last`, invoke `Pub`, return `Last`.
|
||||
|
||||
3.6 Update(TSeries)
|
||||
SIG: `public TSeries Update(TSeries source)` adjacent to Update(TValue)
|
||||
- Create output series
|
||||
- Call static `Calculate(ReadOnlySpan<double>, Span<double>, ...)`
|
||||
- Restore internal state by replaying last Period bars (or full series if recursive).
|
||||
|
||||
3.7 Static Calculate(TSeries)
|
||||
- Create indicator instance
|
||||
- Iterate source series
|
||||
- Return output TSeries
|
||||
|
||||
3.8 Static Calculate(Span) (perf-critical)
|
||||
SIG: `public static void Calculate(ReadOnlySpan<double> source, Span<double> output, ...)`
|
||||
RULES:
|
||||
- Validate args w/ `ArgumentException` incl `nameof(output)` etc (MA0015-friendly).
|
||||
- SIMD path optional-but-recommended for simple/non-recursive; check `Avx2.IsSupported`.
|
||||
- Use `stackalloc` for small buffers (threshold ~256) + internal state buffers when SIMD not applicable.
|
||||
- Scalar fallback must handle NaN safely.
|
||||
|
||||
4) DOCUMENTATION STANDARDS (^8)
|
||||
Mission: persuade skeptical architects via correctness + architecture evidence + benevolent curmudgeon wit; ruthless w/ math, kind to humans.
|
||||
Audience: practitioners who value implementation + trade-offs.
|
||||
Voice: GRINGE blend (Bryson warmth; Roach curiosity; Sedaris self-own; O'Rourke cynicism).
|
||||
Argumentation: steel-man opponents, rebut w/ data; Evidence chain: Why→How→Proof→So what; Feel-Felt-Found ok.
|
||||
Language: direct cadence; precise nums; avoid "we"; deliberate sentence-length variation; "code as evidence".
|
||||
Humor: allowed for complexity/context; NOT in perf/security/math correctness claims.
|
||||
Anti-slop:
|
||||
- Forbidden words SET{Delve|leverage|pivotal|tapestry|landscape|furthermore|\"is all about\"|\"unlock the power\"|transformative|foster|seamless|ecosystem}
|
||||
- Avoid em-dashes; avoid formulaic perfectly balanced pro/con tropes.
|
||||
Markdown: strict CommonMark + markdownlint; watch MD022/MD031, MD030, MD032; include perf env specs (AVX2, Turbo status, sample sizes).
|
||||
|
||||
4.1 DOC_TMPL (required sections)
|
||||
Reference: `lib/trends_IIR/jma/Jma.md` as canonical exemplar.
|
||||
|
||||
```markdown
|
||||
# [ABBREV]: [Full Name]
|
||||
|
||||
> "[Memorable quote that captures the indicator's essence or challenges common assumptions]"
|
||||
|
||||
[Opening paragraph: What it is + key differentiator. State what makes THIS implementation unique vs common approximations. Include measurable claims (e.g., "within floating-point tolerance", "3-4% divergence during 3-sigma events").]
|
||||
|
||||
## Historical Context
|
||||
|
||||
[Origin story: Who created it, when, why. Address the knowledge gap: what was publicly known vs actual implementation details. Acknowledge prior approximations and explain how/why this implementation differs. 2-4 paragraphs.]
|
||||
|
||||
## Architecture & Physics
|
||||
|
||||
[System overview: Describe the indicator as interconnected components. Use numbered subsections for each major component.]
|
||||
|
||||
### 1. [Component Name]
|
||||
|
||||
[Describe component purpose + behavior. Include conditional logic with mathematical notation:]
|
||||
|
||||
$$
|
||||
X_t = \begin{cases}
|
||||
P_t & \text{if condition A} \\
|
||||
f(X_{t-1}, P_t) & \text{otherwise}
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
[Explain WHY this design choice matters. Note alternative naming conventions if applicable.]
|
||||
|
||||
### 2. [Component Name]
|
||||
|
||||
[Continue pattern for each component. Include epsilon guards, buffer sizes, smoothing mechanisms.]
|
||||
|
||||
### N. [Final Component / Core Filter]
|
||||
|
||||
[For IIR/FIR filters, include transfer function in z-domain if applicable:]
|
||||
|
||||
$$
|
||||
H(z) = \frac{...}{...}
|
||||
$$
|
||||
|
||||
[Explain state-space form and coupled recursions.]
|
||||
|
||||
## Mathematical Foundation
|
||||
|
||||
[Detailed derivations for each calculation step. Use subsections for logical groupings.]
|
||||
|
||||
### [Calculation Name] (e.g., Dynamic Exponent Calculation)
|
||||
|
||||
$$
|
||||
r_t = \frac{|\Delta_t|}{\hat{V}_t}
|
||||
$$
|
||||
|
||||
$$
|
||||
d_t = \text{clamp}(r_t^{P_{exp}}, 1, \text{logParam})
|
||||
$$
|
||||
|
||||
where:
|
||||
- $P_{exp} = ...$
|
||||
- $\text{logParam} = ...$
|
||||
|
||||
[Continue for each derived quantity: coefficients, decay rates, recursions.]
|
||||
|
||||
### [Recursion Name] (e.g., IIR Recursion)
|
||||
|
||||
[State equations in sequence:]
|
||||
|
||||
$$
|
||||
C_{0,t} = (1 - \alpha_t) \cdot P_t + \alpha_t \cdot C_{0,t-1}
|
||||
$$
|
||||
|
||||
[Include parameter mappings (e.g., phase [-100,100] → [0.5,2.5]).]
|
||||
|
||||
## Performance Profile
|
||||
|
||||
### Operation Count (Streaming Mode, Scalar)
|
||||
|
||||
[Itemize computational cost per bar:]
|
||||
|
||||
| Operation | Count | Cost (cycles) | Subtotal |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| ADD/SUB | N | 1 | N |
|
||||
| MUL | N | 3 | 3N |
|
||||
| DIV | N | 15 | 15N |
|
||||
| CMP/ABS | N | 1 | N |
|
||||
| SQRT | N | 15 | 15N |
|
||||
| EXP/POW | N | 50-80 | ... |
|
||||
| SORT (if applicable) | 1 | ~O(n log n) | ... |
|
||||
| **Total** | **sum** | — | **~X cycles** |
|
||||
|
||||
[Identify dominant cost contributor with percentage.]
|
||||
|
||||
### Batch Mode (512 values, SIMD/FMA)
|
||||
|
||||
[Explain SIMD applicability. For recursive indicators, acknowledge limitations:]
|
||||
|
||||
| Operation | Scalar Ops | SIMD Ops (AVX2) | Speedup |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| [Vectorizable op] | N | N/8 | 8× |
|
||||
| FMA operations | N | N/3 | 3× |
|
||||
|
||||
**Per-bar savings with SIMD/FMA:**
|
||||
|
||||
| Optimization | Cycles Saved | New Total |
|
||||
| :--- | :---: | :---: |
|
||||
| [Optimization 1] | ~X | Y |
|
||||
| **Total SIMD/FMA savings** | **~X cycles** | **~Y cycles** |
|
||||
|
||||
**Batch efficiency (512 bars):**
|
||||
|
||||
| Mode | Cycles/bar | Total (512 bars) | Overhead |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| Scalar streaming | X | 512X | — |
|
||||
| SIMD/FMA streaming | Y | 512Y | — |
|
||||
| **Improvement** | **Z%** | **N saved** | — |
|
||||
|
||||
[Explain why improvement is modest/significant based on algorithm characteristics.]
|
||||
|
||||
### Quality Metrics
|
||||
|
||||
| Metric | Score | Notes |
|
||||
| :--- | :---: | :--- |
|
||||
| **Accuracy** | N/10 | [Brief justification] |
|
||||
| **Timeliness** | N/10 | [Brief justification] |
|
||||
| **Overshoot** | N/10 | [Brief justification] |
|
||||
| **Smoothness** | N/10 | [Brief justification] |
|
||||
| **[Custom metric if applicable]** | N/10 | [Brief justification] |
|
||||
|
||||
## Validation
|
||||
|
||||
[State validation context: proprietary, open-source availability, reference sources.]
|
||||
|
||||
| Library | Status | Notes |
|
||||
| :--- | :---: | :--- |
|
||||
| **TA-Lib** | ✅/N/A | [Implementation status or match notes] |
|
||||
| **Skender** | ✅/N/A | [Implementation status or match notes] |
|
||||
| **Tulip** | ✅/N/A | [Implementation status or match notes] |
|
||||
| **Ooples** | ✅/N/A | [Implementation status or match notes] |
|
||||
| **[Other reference]** | ✅ | [Match notes] |
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
1. **[Pitfall Category]**: [Specific issue + quantified impact. Include formulas for warmup periods, memory footprints, etc.]
|
||||
|
||||
2. **[Pitfall Category]**: [Parameter confusion, default behaviors, migration gotchas.]
|
||||
|
||||
3. **[Pitfall Category]**: [Computational cost awareness with concrete numbers.]
|
||||
|
||||
4. **[Pitfall Category]**: [Memory footprint with per-instance and scaled estimates.]
|
||||
|
||||
5. **[Pitfall Category]**: [Edge case limitations.]
|
||||
|
||||
6. **[Pitfall Category]**: [API usage (isNew, Reset, etc.).]
|
||||
|
||||
## References
|
||||
|
||||
- [Author]. ([Year]). "[Title]." *[Source]*.
|
||||
- [Author]. ([Year]). "[Title]." *[Source]*.
|
||||
```
|
||||
|
||||
4.2 Section requirements checklist
|
||||
- [ ] Title: `# ABBREV: Full Name` + memorable quote
|
||||
- [ ] Intro: 1 paragraph, key differentiator, measurable claims
|
||||
- [ ] Historical Context: origin, knowledge gap, prior art, this impl's difference
|
||||
- [ ] Architecture & Physics: numbered subsections per component, conditional math, z-domain transfer functions
|
||||
- [ ] Mathematical Foundation: all derivations with LaTeX, parameter mappings
|
||||
- [ ] Performance Profile: operation count table, SIMD analysis, quality metrics (1-10 scale)
|
||||
- [ ] Validation: library comparison table with status + notes
|
||||
- [ ] Common Pitfalls: 5-7 numbered items with quantified impacts
|
||||
- [ ] References: academic/forum sources
|
||||
|
||||
4.3 Doc linking reqs when adding indicator
|
||||
Update: `lib/[category]/_index.md`, `lib/_index.md`, `docs/_sidebar.md`, `docs/integration.md`, `docs/indicators.md`, `docs/validation.md`.
|
||||
|
||||
5) TESTING PROTOCOL
|
||||
REQ test files: `[Name].Tests.cs`, `[Name].Validation.Tests.cs`, `[Name].Quantower.Tests.cs`.
|
||||
5.2 Unit tests (xUnit)
|
||||
- Data: MUST use `GBM` helper. Never `System.Random`.
|
||||
- Required coverage buckets:
|
||||
A) ctor validation (throws `ArgumentException` w/ ParamName)
|
||||
B) basic calc (Update returns TValue; Last/IsHot/Name accessible; known-value check)
|
||||
C) state + bar correction (critical): isNew true advances; isNew false rewrites; iterative corrections restore; Reset clears state + last-valid tracking
|
||||
D) warmup/convergence: IsHot flips when buffer full; WarmupPeriod period-dependent
|
||||
E) robustness (critical): NaN + Infinity use last-valid; batch NaN safe
|
||||
F) consistency (critical): BatchCalc == streaming == span == eventing (All 4 modes match)
|
||||
G) span API tests: validates lengths w/ ParamName; matches TSeries; handles NaN; avoid stack overflow large data
|
||||
H) chainability: `Pub` fires; event-based chaining works
|
||||
5.3 Validation tests
|
||||
- Compare vs Skender.Stock.Indicators, TA-Lib (TALib.NETCore), Tulip (Tulip.NETCore), OoplesFinance.
|
||||
- For each external lib: validate Batch + Streaming + Span where supported.
|
||||
- Tolerances: `ValidationHelper.SkenderTolerance`=1e-9; `TalibTolerance`=1e-9; `TulipTolerance`=1e-9; `OoplesTolerance`=1e-6.
|
||||
5.4 Quantower adapter tests (req):
|
||||
Constructor defaults; MinHistoryDepths; Initialize creates internal indicator; ProcessUpdate historical/new; different OHLC source types.
|
||||
5.5 Checklists
|
||||
- Mandatory unit tests include ctor validation, isNew behavior, iterative correction restore, Reset, IsHot warmup, NaN/Infinity handling, mode consistency, span validation.
|
||||
- At least one full validation suite (Skender batch/stream/span) + Quantower minimal set.
|
||||
|
||||
6) QUANTOWER ADAPTER
|
||||
6.1 File locations
|
||||
- **Preferred:** Place `[Name].Quantower.cs` + `[Name].Quantower.Tests.cs` in `lib/[category]/[name]/` alongside the indicator.
|
||||
- **Alternative:** Place in `quantower/[Category]/` subdirectory (legacy pattern).
|
||||
- Both locations are auto-included in `quantower/Quantower.Tests.csproj`.
|
||||
|
||||
6.2 Test project inclusion (automatic)
|
||||
The `quantower/Quantower.Tests.csproj` includes:
|
||||
- `<Compile Include="..\lib\**\*.Quantower.cs" />` - all adapters from lib
|
||||
- `<Compile Include="..\lib\**\*.Quantower.Tests.cs" />` - all adapter tests from lib
|
||||
- `<Compile Include="[Category]\*.cs" />` - adapters from quantower folder per category
|
||||
- `<Compile Include="**\*.Tests.cs" />` - all tests from quantower folder
|
||||
|
||||
6.3 Implementation requirements
|
||||
- Inherit from Quantower's `Indicator` base class.
|
||||
- Use `IndicatorExtensions` helpers for OHLC source mapping.
|
||||
- Implement `MinHistoryDepths` for warmup period.
|
||||
- Handle both historical and streaming updates in `ProcessUpdate`.
|
||||
- Use mocks from `quantower/Mocks/` for unit tests.
|
||||
|
||||
6.4 Adding new adapter checklist
|
||||
1. Create `[Name].Quantower.cs` (in lib or quantower folder)
|
||||
2. Create `[Name].Quantower.Tests.cs` (same folder as adapter)
|
||||
3. Verify tests compile: `dotnet build quantower/Quantower.Tests.csproj`
|
||||
4. Run tests: `dotnet test quantower/Quantower.Tests.csproj --filter "[Name]"`
|
||||
5. Add to category-specific csproj if adapter in quantower folder (eg `quantower/Trends.csproj`)
|
||||
|
||||
7) WORKFLOW & TOOLS
|
||||
Tools:
|
||||
- seq-think-mcp: decomposition/planning
|
||||
- tavily-mcp: fresh API/lib info, .NET updates, perf patterns
|
||||
- ref-tools-mcp: .NET docs, API specs, SIMD intrinsics
|
||||
- wolfram-mcp: math validation
|
||||
- git-mcp: codebase search + conventions
|
||||
- qdrant-mcp: persist decisions/benchmarks/patterns (no secrets)
|
||||
Priority: ref-tools → tavily for .NET specifics; seq-think for complex; qdrant for context.
|
||||
Dev cycle (compact):
|
||||
1 Recall(qdrant)→2 Analyze(profile)→3 Investigate(git+debug)→4 Research(ref-tools+tavily)→5 Plan(seq-think, STS)→6 Implement(C# 13, SIMD/Span/stackalloc, minimal comments, no regions, no XML in impl)→7 Debug(BenchmarkDotNet, codegen verify)→8 Test(edge cases)→9 Validate(correct+perf, store bench)→10 Memorize(qdrant JSON record).
|
||||
Git policy:
|
||||
- No auto-commit; explicit user command only.
|
||||
- Pre-commit: tests pass; verify no hotpath alloc; verify SIMD codegen.
|
||||
Commit msg:
|
||||
`<type>: <imperative verb> <what> [scope]` + why + perf delta + refs + benchmarks.
|
||||
Types SET{feat|perf|fix|refactor|test|docs}.
|
||||
Comms: concise tech; bullets for lists; code blocks for examples; perf nums include baseline+optimized+%.
|
||||
|
||||
8) CONTEXT MGMT (qdrant)
|
||||
Store: arch decisions, benchmarks, proven patterns, deprecated approaches.
|
||||
Record format: `{decision, benchmark, pattern, src, date, tags}`.
|
||||
Query strategy: Before/During/After work.
|
||||
Event flow (commit d7dbd70):
|
||||
For `ITValuePublisher` indicators: subscribe in ctor w/ `source.Pub += Handle;` (don’t store source solely for subscription). Use struct-based event args (`TBarEventArgs`, `TValueEventArgs`). If MA0046 flags non-EventArgs signature, suppress locally w/ targeted pragma + perf rationale.
|
||||
|
||||
9) REFERENCE (pitfalls + prohibitions + done criteria)
|
||||
Common pitfalls: LINQ in hot paths; `new` inside Update; ignore NaN; inconsistent 4 API modes; missing ParamName in `ArgumentException`; missing Quantower adapter/tests; forgetting `docs/validation.md`; using `System.Random` in tests.
|
||||
Forbidden actions:
|
||||
- DO NOT LINQ in Update/Calculate
|
||||
- DO NOT `new` inside Update
|
||||
- DO NOT change `Directory.Build.props` w/o explicit instruction
|
||||
- DO NOT remove `[SkipLocalsInit]` / `[MethodImpl]`
|
||||
- DO NOT ignore NaN/Infinity
|
||||
- DO NOT skip `[Name].Quantower.cs` + `[Name].Quantower.Tests.cs`
|
||||
- DO NOT skip updating `docs/validation.md`
|
||||
Done checklist (condensed):
|
||||
Source verified (PineScript or equiv); C# 13 optimized; O(1) where possible; SIMD where possible; FMA in hot paths where applicable; all 6 files exist; Update handles isNew + NaN; Update alloc-free; Calculate(Span) implemented + ParamName validation; unit+validation+adapter tests pass; docs complete + markdownlint; all required indices updated; CodeRabbit issues resolved; benchmarks run + stored in qdrant.
|
||||
@@ -0,0 +1,156 @@
|
||||
# QuanTAlib Agent Playbook (v2026-01-11)
|
||||
|
||||
> This file is the onboarding packet for any autonomous agent touching QuanTAlib. Read it end-to-end before issuing a single command.
|
||||
|
||||
## 0. Scope & Signals
|
||||
- Targets the entire repo (library, docs, Quantower adapters, tooling).
|
||||
- Applies to GitHub Actions, MCP agents, and local shells.
|
||||
- No Cursor or Copilot rule files exist right now; follow this document plus `.clinerules/AGENTS.md` for deeper philosophy.
|
||||
- Root namespace: `QuanTAlib`. Target frameworks: net8.0 + net10.0 preview features.
|
||||
|
||||
## 1. Toolchain Baseline
|
||||
- SDK: `.globalconfig` pins none; install .NET 8/10 SDKs.
|
||||
- Solution: `QuanTAlib.sln` aggregates `lib` + `quantower` projects.
|
||||
- Implicit usings disabled for library projects (`DisableImplicitNamespaceImports=true`), so import explicitly.
|
||||
- Nullable + analyzers enforced in `Directory.Build.props`; warnings become errors on Release.
|
||||
- Unsafe code, SIMD, intrinsics, stackalloc, `[SkipLocalsInit]`, `[AggressiveInlining]` allowed and encouraged.
|
||||
|
||||
## 2. Build & Restore Commands (run from repo root)
|
||||
1. Restore everything:
|
||||
```powershell
|
||||
dotnet restore QuanTAlib.sln
|
||||
```
|
||||
2. Build library quickly (Debug, net10.0):
|
||||
```powershell
|
||||
dotnet build lib/quantalib.csproj --configuration Debug --framework net10.0 --no-restore
|
||||
```
|
||||
3. Build full solution (Release):
|
||||
```powershell
|
||||
dotnet build QuanTAlib.sln --configuration Release --no-restore
|
||||
```
|
||||
4. Build Quantower adapters bundle (Release, example subset):
|
||||
```powershell
|
||||
dotnet build quantower/Momentum.csproj --configuration Release --no-restore
|
||||
dotnet build quantower/Trends.csproj --configuration Release --no-restore
|
||||
dotnet build quantower/Volume.csproj --configuration Release --no-restore
|
||||
```
|
||||
5. Generate SARIF + coverage + NDepend badges (long runner, Windows PowerShell 7+):
|
||||
```powershell
|
||||
pwsh ndepend/ndepend.ps1
|
||||
```
|
||||
|
||||
## 3. Test Commands
|
||||
- **All QuanTAlib unit + validation tests (Debug):**
|
||||
```powershell
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --configuration Debug --no-build
|
||||
```
|
||||
- **Quantower adapter tests (Debug):**
|
||||
```powershell
|
||||
dotnet test quantower/Quantower.Tests.csproj --configuration Debug --no-build
|
||||
```
|
||||
- **Full coverage run with Coverlet + runsettings (matches CI):**
|
||||
```powershell
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --configuration Debug --no-build \
|
||||
--collect:"XPlat Code Coverage" --settings coverlet.runsettings \
|
||||
--results-directory ./TestResults
|
||||
dotnet test quantower/Quantower.Tests.csproj --configuration Debug --no-build \
|
||||
--collect:"XPlat Code Coverage" --settings coverlet.runsettings \
|
||||
--results-directory ./TestResults
|
||||
```
|
||||
- **Single test / filtered suite:** Replace the predicate with any substring of `FullyQualifiedName`.
|
||||
```powershell
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --no-build --configuration Debug \
|
||||
--filter "FullyQualifiedName~EmaValidation"
|
||||
```
|
||||
- **Quick span-path smoke (example)**
|
||||
```powershell
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --configuration Release --no-build --filter "Category=Span"
|
||||
```
|
||||
- **CI parity (Ubuntu)** uses `dotnet test --no-build --configuration Debug --collect:"XPlat Code Coverage;Format=opencover,cobertura,lcov" --results-directory ./TestResults --logger "trx;LogFileName=test_results.trx"`. Replicate locally when debugging pipeline-only regressions.
|
||||
|
||||
## 4. Lint / Quality Gates
|
||||
- `dotnet build` (any configuration) enforces Roslyn, Sonar, Meziantou, Roslynator, SourceLink analyzers; fix warnings locally.
|
||||
- `pwsh ndepend/ndepend.ps1` cleans, rebuilds, runs coverage, executes NDepend analysis, and emits badges + `.sarif/quantalib.sarif`.
|
||||
- Qodana & SonarCloud pipelines read from SARIF plus coverage; keep `.sarif` directory clean.
|
||||
- `ndepend/ndepend.ps1` expects env var `NDEPEND_LICENSE`; script still runs but warns if missing.
|
||||
- `qodana.yaml` is present; locally you may execute `docker run -v ${PWD}:/data/project jetbrains/qodana-dotnet ...` (optional, not required for every change).
|
||||
|
||||
## 5. Repository Structure Highlights
|
||||
- `lib/` – core indicators, tests, validation, docs per indicator folder.
|
||||
- `quantower/` – platform adapters, per-category csproj plus shared tests.
|
||||
- `docs/` – architecture, indicator catalog, integration notes, validation matrices.
|
||||
- `perf/` – BenchmarkDotNet harnesses; results must go to `temp/benchmarks` during dev, never committed.
|
||||
- `temp/` – gitignored scratch (scripts, datasets, logs). Create subdirs like `temp/scripts/run_bench_YYYYMMDD_hhmmss.ps1`.
|
||||
- `.clinerules/AGENTS.md` – canonical philosophy file. Treat this AGENTS.md as quickstart + commands; consult `.clinerules` for deep rules.
|
||||
|
||||
## 6. Coding Style & Formatting (superset of .editorconfig)
|
||||
1. **Whitespace & files**
|
||||
- LF endings, UTF-8, trim trailing whitespace, final newline required.
|
||||
- Indent with 4 spaces; no tabs.
|
||||
2. **Var usage** (`.editorconfig` enforced)
|
||||
- Prefer explicit types for primitive math values (int, double, string) to document formulas.
|
||||
- Allow `var` only when RHS makes the type obvious (e.g., `new RingBuffer(capacity)` or Linq-free aggregator returns).
|
||||
3. **Imports**
|
||||
- No implicit namespaces: add explicit `using` statements (file-scoped) for every dependency.
|
||||
- Sort system namespaces first, then QuanTAlib/local.
|
||||
4. **Types & naming**
|
||||
- `public` members: PascalCase; private fields: `_camelCase`; constants: `SCREAMING_CASE` only for static readonly calibration.
|
||||
- Accept well-known abbreviations (Sma, Ema, Rsi, Atr, Dmx, Jma, Vidya) per library convention.
|
||||
- Use `record struct` for aggregated state, `readonly struct` for data carriers (`TValue`, `TBar`).
|
||||
5. **Attributes & perf toggles**
|
||||
- `[SkipLocalsInit]` atop performance-critical classes/methods.
|
||||
- `[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]` for hot path helpers (`GetFiniteValue`, `Update`, `Calculate`).
|
||||
6. **Memory & SIMD canon (DCT from .clinerules)**
|
||||
- Zero heap allocations inside `Update` and span-based `Calculate`; prefer `stackalloc` <=256 bytes, `ArrayPool` when bigger.
|
||||
- Maintain Structure-of-Arrays (SoA) layout: `List<long> _t`, `List<double> _v`, exposures via `CollectionsMarshal.AsSpan`.
|
||||
- Use `System.Runtime.Intrinsics` (AVX2/AVX-512) or `System.Numerics.Vector<T>` for batch loops; pair with scalar fallback for recursive cases.
|
||||
- Apply `Math.FusedMultiplyAdd` for every `a*b + c` in smoothing / IIR patterns.
|
||||
7. **State & streaming rules**
|
||||
- Always implement `_state` / `_p_state` record structs for rollback when `isNew=false` (bar correction).
|
||||
- Maintain `Last`, `IsHot`, `WarmupPeriod`, and `Name` consistently.
|
||||
- Validate every constructor argument and throw `ArgumentException(nameof(param))` (MA0001-friendly).
|
||||
8. **Error handling**
|
||||
- Never swallow exceptions. Guard invalid parameters early; prefer `ArgumentOutOfRangeException` for bounds.
|
||||
- Replace non-finite input with last valid value; never propagate NaN/Infinity to downstream spans or events.
|
||||
9. **Events & reactive**
|
||||
- Subscribe directly (`source.Pub += Handle;`) without extra null guards if parameter non-nullable.
|
||||
- Custom delegates (`TValuePublishedHandler`) are acceptable; MA0046 suppressed repo-wide.
|
||||
10. **Date/time & culture**
|
||||
- Always use `DateTime.UtcNow`. No `DateTime.Now`, `DateTimeOffset.Now`, or culture-specific string formatting in hot paths.
|
||||
11. **Docs**
|
||||
- Markdown lint strict (MD022/30/31/32). Use skeptical, data-driven voice as described in `.clinerules/AGENTS.md` Section 4.
|
||||
- Every new indicator requires doc + validation entries in all indexes.
|
||||
|
||||
## 7. Testing Doctrine
|
||||
- Test files live alongside sources (`[Name].Tests.cs`, `[Name].Validation.Tests.cs`, `[Name].Quantower.Tests.cs`).
|
||||
- Data generation uses GBM helpers in `lib/feeds/gbm`; do NOT instantiate `System.Random` directly inside tests.
|
||||
- Validation tests must compare against TA-Lib, Skender, Tulip, or Ooples with tight tolerances (see `ValidationHelper`).
|
||||
- Always assert streaming vs batch vs span parity (last 100 bars).
|
||||
- Include `isNew=false` correction tests, NaN/Infinity handling, `Reset`, `IsHot` transitions.
|
||||
|
||||
## 8. Workflow Expectations
|
||||
1. Query qdrant memory before designing new algorithm; store decisions/benchmarks after validation.
|
||||
2. Use `temp/` for generated artifacts, never commit.
|
||||
3. When performance changes are made, capture BenchmarkDotNet tables (before/after) and summarize in PR/commit descriptions.
|
||||
4. Do not push commits unless explicitly asked; run `git status`/`git diff` before staging.
|
||||
5. Pull requests must mention which external validation suites ran (TA-Lib, Skender, etc.).
|
||||
|
||||
## 9. Common Pitfalls (avoid immediately)
|
||||
- LINQ, `new` allocations, boxing, or string concatenation inside hot loops.
|
||||
- Forgetting `docs/validation.md` rows when adding indicators.
|
||||
- Failing to update Quantower adapters/tests when changing indicator APIs.
|
||||
- Leaving Coverlet residue outside `TestResults/`.
|
||||
- Using `DateTime.Now` or culture-specific formatting.
|
||||
- Omitting `nameof(...)` in exceptions, breaking analyzer expectations.
|
||||
|
||||
## 10. Ready Checklist Before PR
|
||||
- [ ] `dotnet build QuanTAlib.sln --configuration Release --no-restore` passes.
|
||||
- [ ] `dotnet test lib/QuanTAlib.Tests.csproj --configuration Debug --no-build` passes.
|
||||
- [ ] `dotnet test quantower/Quantower.Tests.csproj --configuration Debug --no-build` passes.
|
||||
- [ ] Validation suite compares against at least one external library per indicator change.
|
||||
- [ ] Docs + indexes updated, markdownlint clean.
|
||||
- [ ] Benchmarks (if perf-sensitive change) captured under `temp/benchmarks` and summarized.
|
||||
- [ ] `.sarif` regenerated if analyzer rules change.
|
||||
- [ ] qdrant updated with new decisions/benchmarks.
|
||||
|
||||
Stay fast, stay precise, keep the garbage collector asleep.
|
||||
@@ -0,0 +1,37 @@
|
||||
# Skill: Full Build
|
||||
|
||||
**Triggers**: `build`, `full build`, `dotnet build`, `restore build test`, `build and test`, `run tests`
|
||||
|
||||
## Quick Reference
|
||||
|
||||
Execute these commands in sequence from repo root:
|
||||
|
||||
```powershell
|
||||
# 1. Restore
|
||||
dotnet restore QuanTAlib.sln --verbosity minimal
|
||||
|
||||
# 2. Clean
|
||||
dotnet clean QuanTAlib.sln --configuration Debug --verbosity minimal
|
||||
|
||||
# 3. Build
|
||||
dotnet build QuanTAlib.sln --configuration Debug --no-restore
|
||||
|
||||
# 4. Test Library
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --configuration Debug --no-build --verbosity normal
|
||||
|
||||
# 5. Test Quantower
|
||||
dotnet test quantower/Quantower.Tests.csproj --configuration Debug --no-build --verbosity normal
|
||||
```
|
||||
|
||||
## On Errors/Warnings
|
||||
|
||||
1. **Build errors**: Read the error message, identify file:line, fix using `replace_in_file`
|
||||
2. **Test failures**: Read test output, examine the failing test, fix implementation or test
|
||||
3. **Warnings**: Fix straightforward ones (missing `nameof()`, unused imports, etc.)
|
||||
|
||||
## Alternative: PowerShell Script
|
||||
|
||||
```powershell
|
||||
.\temp\scripts\full-build.ps1
|
||||
.\temp\scripts\full-build.ps1 -Configuration Release
|
||||
.\temp\scripts\full-build.ps1 -SkipTests
|
||||
@@ -0,0 +1,63 @@
|
||||
# Workflow: Full .NET Build Cycle
|
||||
|
||||
> **Trigger phrases**: "build", "restore build test", "clean build", "dotnet cycle", "build everything"
|
||||
|
||||
## Description
|
||||
Performs a complete .NET build cycle: restore → clean → build → test → report/fix warnings and errors.
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Restore Dependencies
|
||||
```powershell
|
||||
dotnet restore QuanTAlib.sln --verbosity minimal
|
||||
```
|
||||
**Expected**: All packages restored successfully.
|
||||
|
||||
### 2. Clean Solution
|
||||
```powershell
|
||||
dotnet clean QuanTAlib.sln --configuration Debug --verbosity minimal
|
||||
```
|
||||
**Expected**: Clean completed without errors.
|
||||
|
||||
### 3. Build Solution
|
||||
```powershell
|
||||
dotnet build QuanTAlib.sln --configuration Debug --no-restore
|
||||
```
|
||||
**Expected**: Build succeeded with 0 errors. Note any warnings for fixing.
|
||||
|
||||
### 4. Build Solution
|
||||
```powershell
|
||||
dotnet build QuanTAlib.sln --configuration Debug --no-restore
|
||||
```
|
||||
**Expected**: Build succeeded with 0 errors. Release has stricter warnings-as-errors.
|
||||
|
||||
### 5. Run Library Tests
|
||||
```powershell
|
||||
dotnet test lib/QuanTAlib.Tests.csproj --configuration Debug --no-build --verbosity normal
|
||||
```
|
||||
**Expected**: All tests pass.
|
||||
|
||||
### 6. Run Quantower Adapter Tests
|
||||
```powershell
|
||||
dotnet test quantower/Quantower.Tests.csproj --configuration Debug --no-build --verbosity normal
|
||||
```
|
||||
**Expected**: All tests pass.
|
||||
|
||||
### 7. Report & Fix Issues
|
||||
After each step, if warnings or errors occur:
|
||||
1. **Parse the output** to identify:
|
||||
- Error codes (CS####, IDE####, MA####, etc.)
|
||||
- File paths and line numbers
|
||||
- Warning/error messages
|
||||
2. **Categorize issues**:
|
||||
- Build errors → Must fix before proceeding
|
||||
- Test failures → Investigate and fix
|
||||
- Warnings → Investigate and Fix if clear, suggest if complex
|
||||
3. **Apply fixes** using `replace_in_file` for targeted changes
|
||||
4. **Re-run the failed step** to verify the fix
|
||||
|
||||
## Test Failure Investigation
|
||||
1. Read the test file to understand the assertion
|
||||
2. Read the implementation being tested
|
||||
3. Determine if issue is in test or implementation
|
||||
4. Fix the root cause, not symptoms
|
||||
@@ -0,0 +1,274 @@
|
||||
workflows:
|
||||
- name: "Indicator Review"
|
||||
description: "Comprehensive review of an indicator implementation against QuanTAlib standards"
|
||||
steps:
|
||||
- step: "1. File Structure Verification"
|
||||
tasks:
|
||||
- "Verify all 6 required files exist: [Name].cs, [Name].md, [Name].Tests.cs, [Name].Validation.Tests.cs, [Name].Quantower.cs, [Name].Quantower.Tests.cs"
|
||||
- "Check for [Name].Pine and alert if it is missing"
|
||||
- "List all files in the indicator directory"
|
||||
|
||||
- step: "2. AGENTS.md Compliance Review"
|
||||
tasks:
|
||||
- "Architecture & Memory Model:"
|
||||
- "Verify Structure of Arrays (SoA) pattern usage"
|
||||
- "Check for RingBuffer or appropriate data structure"
|
||||
- "Confirm zero allocation in hot paths (Update method)"
|
||||
- "Verify O(1) complexity for streaming updates (or document why not possible)"
|
||||
- "State Management:"
|
||||
- "Check for 'private record struct State' pattern"
|
||||
- "Verify _state and _p_state for rollback capability"
|
||||
- "Confirm state restoration in isNew=false path"
|
||||
- "Performance Attributes:"
|
||||
- "Class has [SkipLocalsInit] attribute"
|
||||
- "Update method has [MethodImpl(MethodImplOptions.AggressiveInlining)]"
|
||||
- "Batch methods use [MethodImpl(MethodImplOptions.AggressiveOptimization)] where appropriate"
|
||||
- "SIMD Optimization:"
|
||||
- "Check for AVX2/AVX-512/NEON implementations in Batch methods"
|
||||
- "Verify ContainsNonFinite() check before SIMD path"
|
||||
- "Confirm scalar fallback path exists"
|
||||
- "FMA Usage (if applicable):"
|
||||
- "Check for Math.FusedMultiplyAdd() in EMA/exponential smoothing patterns"
|
||||
- "Verify decay constants are pre-computed"
|
||||
- "API Design:"
|
||||
- "Update(TValue, bool isNew = true) method exists"
|
||||
- "Update(TSeries) batch method exists"
|
||||
- "Static Batch(TSeries) method exists"
|
||||
- "Static Batch(ReadOnlySpan, Span) method exists"
|
||||
- "Optional: Calculate(TSeries) returns (TSeries, Indicator) tuple"
|
||||
- "Optional: Prime(ReadOnlySpan) method for state initialization"
|
||||
- "Robustness:"
|
||||
- "NaN/Infinity handling via GetValidValue or last-valid-value pattern"
|
||||
- "Constructor validates all parameters (throws ArgumentException)"
|
||||
- "Reset() method clears all state"
|
||||
- "Reactive Pattern:"
|
||||
- "Implements ITValuePublisher interface"
|
||||
- "Has Pub event for chaining"
|
||||
- "Constructor accepts ITValuePublisher source parameter"
|
||||
- "Uses direct subscription pattern (source.Pub += handler)"
|
||||
|
||||
- step: "3. testprotocol.md Compliance Review"
|
||||
tasks:
|
||||
- "Unit Tests ([Name].Tests.cs):"
|
||||
- "Constructor validation tests (invalid parameters throw ArgumentException with paramName)"
|
||||
- "Basic functionality tests (Calc_ReturnsValue, FirstValue_ReturnsExpected)"
|
||||
- "State management tests (IsNew true/false, IterativeCorrections_RestoreToOriginalState)"
|
||||
- "Reset tests (Reset_ClearsState, Reset_ClearsLastValidValue)"
|
||||
- "Warmup tests (IsHot_BecomesTrueWhenBufferFull, WarmupPeriod_IsSetCorrectly)"
|
||||
- "NaN/Infinity handling tests (all return finite values)"
|
||||
- "Consistency test: AllModes_ProduceSameResult (Batch, Span, Streaming, Eventing)"
|
||||
- "Span API tests (validates input, matches TSeries, handles NaN)"
|
||||
- "Edge cases: Period=1, empty input, flat line"
|
||||
- "Prime tests (if Prime method exists)"
|
||||
- "Calculate tests (if Calculate method exists)"
|
||||
- "Chainability tests"
|
||||
- "Validation Tests ([Name].Validation.Tests.cs):"
|
||||
- "Skender validation: Batch, Streaming, Span (3 tests minimum)"
|
||||
- "TA-Lib validation: Batch, Streaming, Span (3 tests minimum)"
|
||||
- "Tulip validation: Batch, Streaming, Span (3 tests minimum)"
|
||||
- "Ooples validation: Batch (1 test minimum)"
|
||||
- "Total: 10 validation tests against 4 external libraries"
|
||||
- "Uses ValidationHelper.VerifyData with correct tolerance constants"
|
||||
- "Uses ValidationTestData class for test data generation"
|
||||
- "Quantower Tests ([Name].Quantower.Tests.cs):"
|
||||
- "Constructor_SetsDefaults"
|
||||
- "MinHistoryDepths validation"
|
||||
- "ShortName_IncludesParameters"
|
||||
- "Initialize_CreatesInternalIndicator"
|
||||
- "ProcessUpdate tests (HistoricalBar, NewBar, NewTick)"
|
||||
- "DifferentSourceTypes_Work"
|
||||
- "Parameter modification tests"
|
||||
- "Test Data Generation:"
|
||||
- "All tests use GBM (Geometric Brownian Motion) for realistic data"
|
||||
- "No direct use of System.Random in tests"
|
||||
|
||||
- step: "4. Performance Optimization Verification"
|
||||
tasks:
|
||||
- "Hot Path Analysis:"
|
||||
- "Update method: zero allocations, no 'new', no LINQ"
|
||||
- "Batch scalar path: uses stackalloc or ArrayPool<T>"
|
||||
- "SIMD paths use proper intrinsics (System.Runtime.Intrinsics)"
|
||||
- "Complexity Verification:"
|
||||
- "Document actual complexity (O(1), O(n), O(n²))"
|
||||
- "If not O(1), explain why (e.g., recursive algorithm)"
|
||||
- "Memory Efficiency:"
|
||||
- "RingBuffer for sliding windows"
|
||||
- "No unnecessary List<T> or List<double> in hot paths"
|
||||
- "Proper capacity pre-allocation where needed"
|
||||
- "Resync Mechanism (if applicable):"
|
||||
- "Running sums have periodic recalculation to prevent drift"
|
||||
- "ResyncInterval constant defined (typically 1000)"
|
||||
|
||||
- step: "5. API Consistency Check"
|
||||
tasks:
|
||||
- "Run or verify AllModes_ProduceSameResult test exists and passes"
|
||||
- "Confirm all 4 API modes produce identical results:"
|
||||
- "1. Batch: Indicator.Batch(TSeries, params)"
|
||||
- "2. Span: Indicator.Batch(ReadOnlySpan, Span, params)"
|
||||
- "3. Streaming: new Indicator(params).Update(TValue)"
|
||||
- "4. Eventing: new Indicator(source, params)"
|
||||
- "Precision: Results match to 9 decimal places minimum"
|
||||
|
||||
- step: "6. Documentation Quality Review ([Name].md)"
|
||||
tasks:
|
||||
- "Structure Verification:"
|
||||
- "Title: '## [Name]: [Full Name]'"
|
||||
- "Opening quote (witty, insightful, or cynical)"
|
||||
- "Introduction paragraph"
|
||||
- "## Historical Context section"
|
||||
- "## Architecture & Physics section"
|
||||
- "## Mathematical Foundation section (with LaTeX formulas)"
|
||||
- "## Performance Profile section (table with 7 metrics)"
|
||||
- "## Validation section (table with library status)"
|
||||
- "### Common Pitfalls section"
|
||||
- "Style Compliance (techdocs.md):"
|
||||
- "No first-person plural ('we') - uses 'QuanTAlib' as subject"
|
||||
- "Gringe voice: blend of Bryson/Roach/Sedaris/O'Rourke"
|
||||
- "Technical precision with personality"
|
||||
- "Evidence-based claims with specific numbers"
|
||||
- "No forbidden words: delve, leverage, tapestry, ecosystem, seamless, etc."
|
||||
- "No em-dashes (use colons or periods)"
|
||||
- "Markdown Linting:"
|
||||
- "MD022/MD031: Headers and code blocks surrounded by blank lines"
|
||||
- "MD030: Exactly one space after list markers"
|
||||
- "MD032: Lists surrounded by blank lines"
|
||||
- "Performance Table Metrics:"
|
||||
- "Throughput (1-10, with ns/bar if available)"
|
||||
- "Allocations (0 or specific count)"
|
||||
- "Complexity (Big O notation)"
|
||||
- "Accuracy (1-10)"
|
||||
- "Timeliness (1-10)"
|
||||
- "Overshoot (0-10)"
|
||||
- "Smoothness (1-10)"
|
||||
- "Validation Table:"
|
||||
- "TA-Lib status (✅/⚠️/❌)"
|
||||
- "Skender status"
|
||||
- "Tulip status"
|
||||
- "Ooples status"
|
||||
|
||||
- step: "7. Cross-Reference Verification"
|
||||
tasks:
|
||||
- "Check indicator is cataloged in:"
|
||||
- "lib/_index.md (main library index)"
|
||||
- "lib/[category]/_index.md (category index, e.g., lib/trends/_index.md)"
|
||||
- "docs/_sidebar.md (documentation navigation)"
|
||||
- "docs/indicators.md (full indicators list)"
|
||||
- "docs/validation.md (validation status table)"
|
||||
- "docs/integration.md (if integration examples needed)"
|
||||
- "Verify links are not broken"
|
||||
- "Add indicators if missing in catalogs"
|
||||
- "Confirm alphabetical ordering within lists"
|
||||
|
||||
- step: "8. Source Algorithm Verification"
|
||||
tasks:
|
||||
- "If .pine file exists, compare against .cs implementation and alert if algo is inconsistent"
|
||||
- "Check algorithm against published sources (search Ref MCP or Tavily MCP)"
|
||||
- "Verify mathematical formulas match documentation"
|
||||
- "Check for known indicator variants (e.g., Wilder's RSI vs. Cutler's RSI)"
|
||||
- "Document any deviations from standard implementation"
|
||||
|
||||
- step: "9. Edge Cases & Error Handling"
|
||||
tasks:
|
||||
- "Division by zero scenarios tested"
|
||||
- "Empty input handling"
|
||||
- "Single value input"
|
||||
- "All NaN input"
|
||||
- "Period = 1 edge case"
|
||||
- "Very large periods (>10000)"
|
||||
- "Negative inputs (if applicable)"
|
||||
- "Zero inputs (if applicable)"
|
||||
|
||||
- step: "10. Generate Review Report"
|
||||
tasks:
|
||||
- "Create summary with:"
|
||||
- "Overall grade (A+/A/B/C/D/F)"
|
||||
- "What could improve the quality and performance?"
|
||||
- "AGENTS.md compliance score (percentage)"
|
||||
- "testprotocol.md compliance score (percentage)"
|
||||
- "File count and test statistics"
|
||||
- "Performance highlights"
|
||||
- "Validation summary (X/Y libraries validated)"
|
||||
- "List findings by severity:"
|
||||
- "🔴 Critical: Blocks production use"
|
||||
- "🟡 Warning: Should be addressed soon"
|
||||
- "🟢 Recommendation: Nice-to-have improvements"
|
||||
- "Provide specific action items with file:line references"
|
||||
- "Highlight exemplary patterns for other indicators to follow"
|
||||
- "Final verdict: Production Ready / Needs Work / Blocked"
|
||||
|
||||
- step: "11. Optional: Benchmark Verification"
|
||||
tasks:
|
||||
- "Check if benchmark exists in perf/Benchmark.cs"
|
||||
- "Verify allocation count = 0 for hot paths"
|
||||
- "Review throughput numbers (ops/sec or ns/op)"
|
||||
- "Compare against baseline (if available)"
|
||||
|
||||
notes:
|
||||
- "Use qdrant MCP to check for stored QuanTAlib patterns and decisions"
|
||||
- "Use ref-tools MCP for .NET and SIMD intrinsics documentation"
|
||||
- "Use tavily MCP for published indicator sources and mathematical definitions"
|
||||
- "Use wolfram MCP for mathematical formula verification if needed"
|
||||
- "Focus on AGENTS.md and testprotocol.md compliance first - these are the foundation"
|
||||
- "No need to check Quantower adapter correctness in detail - trust the tests"
|
||||
- "Document any deviations from standards with rationale"
|
||||
- "Prioritize correctness > performance > style"
|
||||
|
||||
```yaml
|
||||
# Usage Example:
|
||||
```
|
||||
User: "Review indicator SMA"
|
||||
|
||||
Cline:
|
||||
1. Lists all files in lib/trends/sma/
|
||||
2. Reads each file systematically
|
||||
3. Checks compliance against AGENTS.md (architecture, performance, API design)
|
||||
4. Checks compliance against testprotocol.md (test coverage)
|
||||
5. Verifies API consistency (AllModes test)
|
||||
6. Reviews documentation quality
|
||||
7. Checks cross-references in docs
|
||||
8. Generates comprehensive review report with:
|
||||
- Overall grade
|
||||
- Compliance scores
|
||||
- Specific findings
|
||||
- Action items
|
||||
- Final verdict
|
||||
|
||||
Example output:
|
||||
"SMA Indicator: Grade A+ (100% AGENTS.md, 98% testprotocol.md)
|
||||
✅ Production Ready - Gold Standard Implementation
|
||||
- 67 tests passing
|
||||
- 4 libraries validated
|
||||
- O(1) complexity with SIMD optimization
|
||||
- Zero allocations in hot paths
|
||||
- Exemplary documentation"
|
||||
```
|
||||
|
||||
# Quick Reference: Key Compliance Points
|
||||
|
||||
## AGENTS.md Critical Items
|
||||
- [ ] `[SkipLocalsInit]` on class
|
||||
- [ ] `record struct State` pattern
|
||||
- [ ] Zero allocations in Update
|
||||
- [ ] O(1) streaming (or documented reason)
|
||||
- [ ] SIMD in Batch methods
|
||||
- [ ] NaN/Infinity handling
|
||||
- [ ] All 4 API modes (Update, Batch TSeries, Batch Span, Calculate)
|
||||
- [ ] ITValuePublisher implementation
|
||||
|
||||
## testprotocol.md Critical Items
|
||||
- [ ] Constructor validation tests
|
||||
- [ ] AllModes_ProduceSameResult test
|
||||
- [ ] IterativeCorrections_RestoreToOriginalState test
|
||||
- [ ] Validation against ≥3 external libraries
|
||||
- [ ] NaN/Infinity handling tests
|
||||
- [ ] Span API validation tests
|
||||
- [ ] Quantower adapter tests
|
||||
- [ ] Uses GBM for test data (not System.Random)
|
||||
|
||||
## Documentation Critical Items
|
||||
- [ ] Performance profile table (7 metrics)
|
||||
- [ ] Validation status table (4 libraries)
|
||||
- [ ] LaTeX formulas
|
||||
- [ ] No first-person plural
|
||||
- [ ] Markdown lint clean
|
||||
- [ ] Listed in all required index files
|
||||
@@ -0,0 +1,216 @@
|
||||
# Documentation Rewrite Workflow
|
||||
|
||||
## Objective
|
||||
|
||||
Batch-process all markdown documentation files to apply the Grizzled Architect persona with consistent style guidelines.
|
||||
|
||||
## Style Guidelines Summary
|
||||
|
||||
### Voice & Tone
|
||||
|
||||
- **Slavic Cadence**: Direct, article-omitting where natural. "Architecture is trade-off. You want speed? Give me memory."
|
||||
- **Evidence Hierarchy**: Why → How → Proof → So What
|
||||
- **Bryson Warmth**: Gentle, inclusive humor that invites the reader in
|
||||
- **Grizzled Verbs**: Code doesn't "run"; it grinds, chokes, strains, or sprints
|
||||
- **No Pronouns**: Avoid I, we, my, me. Use impersonal constructions.
|
||||
- **No Personification**: The library does not "want" or "decide" things.
|
||||
|
||||
### Anti-Slop Rules
|
||||
|
||||
**Forbidden words:**
|
||||
- Delve, leverage, pivotal, tapestry, landscape, furthermore
|
||||
- "is all about", "unlock the power", transformative, foster, seamless, ecosystem
|
||||
|
||||
**Structural rules:**
|
||||
- No em-dashes (use colons or periods)
|
||||
- No lists of exactly 3 or 5 items (use 4, 6, or 7)
|
||||
- No perfectly balanced pros/cons
|
||||
- No "On one hand... on the other" tropes
|
||||
|
||||
### Markdown Compliance
|
||||
|
||||
- MD022: Blank lines around headers
|
||||
- MD031: Blank lines around fenced code blocks
|
||||
- MD032: Blank lines around lists
|
||||
- Use code blocks with language specifiers
|
||||
- Tables for data-heavy content
|
||||
|
||||
### Content Requirements
|
||||
|
||||
- All claims backed by specific, measurable numbers
|
||||
- Include test environment specs for benchmarks
|
||||
- Code examples for implementation concepts
|
||||
- Reference sources at end
|
||||
|
||||
## File Categories
|
||||
|
||||
### Priority 1: Core Documentation (docs/*.md)
|
||||
|
||||
| File | Status | Notes |
|
||||
| :--- | :----: | :---- |
|
||||
| architecture.md | ✅ | Rewritten with tables, trade-offs |
|
||||
| api.md | ✅ | Clear mode explanations, code examples |
|
||||
| benchmarks.md | ✅ | Added Grizzled voice, GC humor |
|
||||
| errors.md | ✅ | Light touchups, preserved George Box quote |
|
||||
| glossary.md | ✅ | Added personality to term definitions |
|
||||
| indicators.md | ✅ | Catalog with Grizzled intro prose |
|
||||
| integration.md | ✅ | Platform guides with gotchas sections |
|
||||
| ma-qualities.md | ✅ | Four qualities with Woody Guthrie quote, comparative table |
|
||||
| ndepend.md | ✅ | Bill Gates quote, quality gates table, interpretation guide |
|
||||
| trendcomparison.md | ✅ | George Box quote, pattern analysis, 25-indicator scorecard |
|
||||
| usage.md | ✅ | Kent Beck quote, mode comparison, gotchas per mode |
|
||||
| validation.md | ✅ | Russian proverb, validation philosophy, symbol legend |
|
||||
|
||||
### Priority 2: Indicator Documentation (lib/**/*.md)
|
||||
|
||||
Each indicator doc should follow this template:
|
||||
|
||||
```markdown
|
||||
# ABBREV: Full Name
|
||||
|
||||
> "Memorable quote that captures essence or challenges assumptions"
|
||||
|
||||
[Opening paragraph: What it is + key differentiator. Measurable claims.]
|
||||
|
||||
## Historical Context
|
||||
|
||||
[Origin story: Who created it, when, why. 2-4 paragraphs.]
|
||||
|
||||
## Architecture & Physics
|
||||
|
||||
[System overview with numbered subsections per component.]
|
||||
|
||||
### 1. Component Name
|
||||
|
||||
[Math notation, conditional logic, design rationale.]
|
||||
|
||||
## Mathematical Foundation
|
||||
|
||||
[Detailed derivations with LaTeX. Parameter mappings.]
|
||||
|
||||
## Performance Profile
|
||||
|
||||
### Operation Count (Streaming Mode)
|
||||
|
||||
| Operation | Count | Cost (cycles) | Subtotal |
|
||||
| :-------- | ----: | ------------: | -------: |
|
||||
| ... | ... | ... | ... |
|
||||
|
||||
### Benchmark Results
|
||||
|
||||
[Test environment, comparative performance table.]
|
||||
|
||||
### Quality Metrics
|
||||
|
||||
| Metric | Score | Notes |
|
||||
| :----- | ----: | :---- |
|
||||
| Accuracy | N/10 | ... |
|
||||
| Timeliness | N/10 | ... |
|
||||
| Overshoot | N/10 | ... |
|
||||
| Smoothness | N/10 | ... |
|
||||
|
||||
## Validation
|
||||
|
||||
| Library | Batch | Streaming | Span | Notes |
|
||||
| :------ | :---: | :-------: | :--: | :---- |
|
||||
| TA-Lib | ✅/❌ | ✅/❌ | ✅/❌ | ... |
|
||||
| Skender | ✅/❌ | ✅/❌ | ✅/❌ | ... |
|
||||
| Tulip | ✅/❌ | ✅/❌ | ✅/❌ | ... |
|
||||
| Ooples | ✅/❌ | — | — | ... |
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
1. **Pitfall Name**: Description with quantified impact.
|
||||
2. ...
|
||||
|
||||
## Usage Examples
|
||||
|
||||
[Code examples for streaming, batch, span, eventing.]
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
[State structure, optimization techniques, memory summary.]
|
||||
|
||||
## References
|
||||
|
||||
- Author. (Year). "Title." *Source*.
|
||||
```
|
||||
|
||||
### Priority 3: Index Files
|
||||
|
||||
- `_sidebar.md`: Navigation structure
|
||||
- `lib/_index.md`: Category overview
|
||||
- `lib/[category]/_index.md`: Category-specific index
|
||||
|
||||
### Priority 4: DocFx Mirror (docfx/indicators/*.md)
|
||||
|
||||
Many duplicate lib/ content. Update in sync.
|
||||
|
||||
## Execution Commands
|
||||
|
||||
### Process Single File
|
||||
|
||||
```bash
|
||||
# Read, analyze, rewrite pattern
|
||||
cline read lib/trends_IIR/[indicator]/[Indicator].md
|
||||
# Apply style guidelines
|
||||
# Write updated content
|
||||
```
|
||||
|
||||
### Validate Markdown
|
||||
|
||||
```bash
|
||||
npx markdownlint-cli2 "docs/**/*.md" "lib/**/*.md"
|
||||
```
|
||||
|
||||
### Track Progress
|
||||
|
||||
Update this workflow file after each batch:
|
||||
|
||||
```markdown
|
||||
| Category | Total | Done | Remaining |
|
||||
| :------- | ----: | ---: | --------: |
|
||||
| docs/ | 12 | 1 | 11 |
|
||||
| lib/trends_IIR/ | 24 | 1 | 23 |
|
||||
| lib/trends_FIR/ | 17 | 0 | 17 |
|
||||
| lib/momentum/ | 6 | 0 | 6 |
|
||||
| ... | ... | ... | ... |
|
||||
```
|
||||
|
||||
## Quality Checklist (Per File)
|
||||
|
||||
- [ ] No forbidden words
|
||||
- [ ] No em-dashes
|
||||
- [ ] No I/we/my pronouns
|
||||
- [ ] No personification
|
||||
- [ ] Tables have 4+ or 6+ items (not exactly 3 or 5)
|
||||
- [ ] Blank lines around headers, code blocks, lists
|
||||
- [ ] All claims have measurable evidence
|
||||
- [ ] Code examples include language specifier
|
||||
- [ ] At least one Bryson-warmth moment per major section
|
||||
|
||||
## Examples of Good Rewrites
|
||||
|
||||
### Before (Anti-slop violation)
|
||||
|
||||
> "The EMA is a powerful tool that helps traders leverage market momentum to unlock profitable opportunities."
|
||||
|
||||
### After (Grizzled Architect)
|
||||
|
||||
> "The EMA applies exponentially decaying weights to older prices. Faster reaction without the drop-off effect that makes SMA users twitch nervously around window boundaries."
|
||||
|
||||
### Before (Personification)
|
||||
|
||||
> "QuanTAlib wants to give you the best possible accuracy."
|
||||
|
||||
### After (Impersonal)
|
||||
|
||||
> "QuanTAlib validates against original research papers. Accuracy is verified, not assumed."
|
||||
|
||||
### Before (Missing evidence)
|
||||
|
||||
> "The indicator is very fast."
|
||||
|
||||
### After (Measurable)
|
||||
|
||||
> "The indicator processes 500,000 bars in 318 μs (0.64 ns/bar) with zero heap allocations."
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
# Codacy Configuration File
|
||||
# Documentation: https://docs.codacy.com/repositories-configure/codacy-configuration-file/
|
||||
|
||||
# Exclude patterns - files and directories to ignore
|
||||
exclude_paths:
|
||||
# All dot-directories (config, IDE, tools, rules)
|
||||
- ".*/**"
|
||||
|
||||
# Root-level config files
|
||||
- "*.md"
|
||||
- "*.yml"
|
||||
- "*.yaml"
|
||||
|
||||
# NDepend analysis output
|
||||
- "ndepend/**"
|
||||
|
||||
# Build/IDE artifacts
|
||||
- "bin/**"
|
||||
- "obj/**"
|
||||
- "BenchmarkDotNet.Artifacts/**"
|
||||
- "ilspy/**"
|
||||
|
||||
# Performance benchmarks
|
||||
- "perf/**"
|
||||
|
||||
# Test files
|
||||
- "**/*.Tests.cs"
|
||||
- "**/*Tests.cs"
|
||||
- "**/*.Validation.Tests.cs"
|
||||
- "**/Mocks/**"
|
||||
|
||||
# Quantower adapters
|
||||
- "**/*.Quantower.Tests.cs"
|
||||
- "**/*.Quantower.cs"
|
||||
- "quantower/**"
|
||||
|
||||
# Documentation
|
||||
- "docs/**"
|
||||
- "**/*.md"
|
||||
|
||||
# Non-source files
|
||||
- "**/*.dib"
|
||||
- "**/*.csv"
|
||||
- "**/*.xml"
|
||||
- "**/*.json"
|
||||
- "**/*.yml"
|
||||
- "**/*.yaml"
|
||||
- "**/*.sln"
|
||||
- "**/*.csproj"
|
||||
- "**/*.ndproj"
|
||||
- "**/*.user"
|
||||
- "**/*.suo"
|
||||
- "**/*.cache"
|
||||
- "**/*.lock"
|
||||
- "**/*.props"
|
||||
- "**/*.targets"
|
||||
|
||||
# Binaries
|
||||
- "**/*.dll"
|
||||
- "**/*.pdb"
|
||||
- "**/*.nupkg"
|
||||
- "**/*.snupkg"
|
||||
- "**/*.so"
|
||||
- "**/*.dylib"
|
||||
- "**/*.exe"
|
||||
|
||||
# Data/media files
|
||||
- "**/*.db"
|
||||
- "**/*.sqlite"
|
||||
- "**/*.log"
|
||||
- "**/*.png"
|
||||
- "**/*.jpg"
|
||||
- "**/*.jpeg"
|
||||
- "**/*.gif"
|
||||
- "**/*.ico"
|
||||
- "**/*.svg"
|
||||
@@ -0,0 +1,149 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
|
||||
set -e +o pipefail
|
||||
|
||||
# Set up paths first
|
||||
bin_name="codacy-cli-v2"
|
||||
|
||||
# Determine OS-specific paths
|
||||
os_name=$(uname)
|
||||
arch=$(uname -m)
|
||||
|
||||
case "$arch" in
|
||||
"x86_64")
|
||||
arch="amd64"
|
||||
;;
|
||||
"x86")
|
||||
arch="386"
|
||||
;;
|
||||
"aarch64"|"arm64")
|
||||
arch="arm64"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$CODACY_CLI_V2_TMP_FOLDER" ]; then
|
||||
if [ "$(uname)" = "Linux" ]; then
|
||||
CODACY_CLI_V2_TMP_FOLDER="$HOME/.cache/codacy/codacy-cli-v2"
|
||||
elif [ "$(uname)" = "Darwin" ]; then
|
||||
CODACY_CLI_V2_TMP_FOLDER="$HOME/Library/Caches/Codacy/codacy-cli-v2"
|
||||
else
|
||||
CODACY_CLI_V2_TMP_FOLDER=".codacy-cli-v2"
|
||||
fi
|
||||
fi
|
||||
|
||||
version_file="$CODACY_CLI_V2_TMP_FOLDER/version.yaml"
|
||||
|
||||
|
||||
get_version_from_yaml() {
|
||||
if [ -f "$version_file" ]; then
|
||||
local version=$(grep -o 'version: *"[^"]*"' "$version_file" | cut -d'"' -f2)
|
||||
if [ -n "$version" ]; then
|
||||
echo "$version"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
get_latest_version() {
|
||||
local response
|
||||
if [ -n "$GH_TOKEN" ]; then
|
||||
response=$(curl -Lq --header "Authorization: Bearer $GH_TOKEN" "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
|
||||
else
|
||||
response=$(curl -Lq "https://api.github.com/repos/codacy/codacy-cli-v2/releases/latest" 2>/dev/null)
|
||||
fi
|
||||
|
||||
handle_rate_limit "$response"
|
||||
local version=$(echo "$response" | grep -m 1 tag_name | cut -d'"' -f4)
|
||||
echo "$version"
|
||||
}
|
||||
|
||||
handle_rate_limit() {
|
||||
local response="$1"
|
||||
if echo "$response" | grep -q "API rate limit exceeded"; then
|
||||
fatal "Error: GitHub API rate limit exceeded. Please try again later"
|
||||
fi
|
||||
}
|
||||
|
||||
download_file() {
|
||||
local url="$1"
|
||||
|
||||
echo "Downloading from URL: ${url}"
|
||||
if command -v curl > /dev/null 2>&1; then
|
||||
curl -# -LS "$url" -O
|
||||
elif command -v wget > /dev/null 2>&1; then
|
||||
wget "$url"
|
||||
else
|
||||
fatal "Error: Could not find curl or wget, please install one."
|
||||
fi
|
||||
}
|
||||
|
||||
download() {
|
||||
local url="$1"
|
||||
local output_folder="$2"
|
||||
|
||||
( cd "$output_folder" && download_file "$url" )
|
||||
}
|
||||
|
||||
download_cli() {
|
||||
# OS name lower case
|
||||
suffix=$(echo "$os_name" | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
local bin_folder="$1"
|
||||
local bin_path="$2"
|
||||
local version="$3"
|
||||
|
||||
if [ ! -f "$bin_path" ]; then
|
||||
echo "📥 Downloading CLI version $version..."
|
||||
|
||||
remote_file="codacy-cli-v2_${version}_${suffix}_${arch}.tar.gz"
|
||||
url="https://github.com/codacy/codacy-cli-v2/releases/download/${version}/${remote_file}"
|
||||
|
||||
download "$url" "$bin_folder"
|
||||
tar xzfv "${bin_folder}/${remote_file}" -C "${bin_folder}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Warn if CODACY_CLI_V2_VERSION is set and update is requested
|
||||
if [ -n "$CODACY_CLI_V2_VERSION" ] && [ "$1" = "update" ]; then
|
||||
echo "⚠️ Warning: Performing update with forced version $CODACY_CLI_V2_VERSION"
|
||||
echo " Unset CODACY_CLI_V2_VERSION to use the latest version"
|
||||
fi
|
||||
|
||||
# Ensure version.yaml exists and is up to date
|
||||
if [ ! -f "$version_file" ] || [ "$1" = "update" ]; then
|
||||
echo "ℹ️ Fetching latest version..."
|
||||
version=$(get_latest_version)
|
||||
mkdir -p "$CODACY_CLI_V2_TMP_FOLDER"
|
||||
echo "version: \"$version\"" > "$version_file"
|
||||
fi
|
||||
|
||||
# Set the version to use
|
||||
if [ -n "$CODACY_CLI_V2_VERSION" ]; then
|
||||
version="$CODACY_CLI_V2_VERSION"
|
||||
else
|
||||
version=$(get_version_from_yaml)
|
||||
fi
|
||||
|
||||
|
||||
# Set up version-specific paths
|
||||
bin_folder="${CODACY_CLI_V2_TMP_FOLDER}/${version}"
|
||||
|
||||
mkdir -p "$bin_folder"
|
||||
bin_path="$bin_folder"/"$bin_name"
|
||||
|
||||
# Download the tool if not already installed
|
||||
download_cli "$bin_folder" "$bin_path" "$version"
|
||||
chmod +x "$bin_path"
|
||||
|
||||
run_command="$bin_path"
|
||||
if [ -z "$run_command" ]; then
|
||||
fatal "Codacy cli v2 binary could not be found."
|
||||
fi
|
||||
|
||||
if [ "$#" -eq 1 ] && [ "$1" = "download" ]; then
|
||||
echo "Codacy cli v2 download succeeded"
|
||||
else
|
||||
eval "$run_command $*"
|
||||
fi
|
||||
@@ -0,0 +1,129 @@
|
||||
# yaml-language-server: $schema=https://storage.googleapis.com/coderabbit_public_assets/schema.v2.json
|
||||
# CodeRabbit Configuration for QuanTAlib - High-Performance C# Trading Library
|
||||
# Documentation: https://docs.coderabbit.ai/reference/configuration
|
||||
|
||||
language: en-US
|
||||
tone_instructions: "Focus on performance, memory allocation, SIMD optimization, and numerical accuracy. Flag any heap allocations in hot paths."
|
||||
early_access: true
|
||||
enable_free_tier: true
|
||||
|
||||
reviews:
|
||||
profile: assertive # More thorough for a performance-critical library
|
||||
request_changes_workflow: false
|
||||
high_level_summary: true
|
||||
high_level_summary_placeholder: "@coderabbitai summary"
|
||||
review_status: true
|
||||
commit_status: true
|
||||
collapse_walkthrough: false
|
||||
changed_files_summary: true
|
||||
sequence_diagrams: false # Not useful for indicator calculations
|
||||
estimate_code_review_effort: true
|
||||
assess_linked_issues: true
|
||||
related_issues: true
|
||||
related_prs: true
|
||||
suggested_labels: true
|
||||
suggested_reviewers: true
|
||||
poem: false # Keep it professional
|
||||
|
||||
path_filters:
|
||||
# Include all source files
|
||||
- "**/*.cs"
|
||||
- "**/*.md"
|
||||
- "**/*.yaml"
|
||||
- "**/*.yml"
|
||||
- "**/*.csproj"
|
||||
- "**/*.props"
|
||||
|
||||
# Exclude build/IDE artifacts
|
||||
- "!**/bin/**"
|
||||
- "!**/obj/**"
|
||||
- "!**/.vs/**"
|
||||
- "!**/.git/**"
|
||||
- "!**/BenchmarkDotNet.Artifacts/**"
|
||||
- "!**/TestResults/**"
|
||||
- "!**/TestResultsCoverage/**"
|
||||
- "!**/_site/**"
|
||||
- "!**/ndepend/NDependOut/**"
|
||||
- "!**/perf/publish/**"
|
||||
|
||||
path_instructions:
|
||||
- path: "**/**"
|
||||
instructions: |
|
||||
- ensure thread safety, zero allocations, and proper Span<T>/Memory<T> usage."
|
||||
- verify numerical stability, check for SIMD and FMA opportunities
|
||||
- verify RingBuffer usage, ensure O(1) updates validate state rollback for isNew=false.
|
||||
- check for numerical stability at edge cases, verify NaN/Infinity handling
|
||||
- No heap allocations in Update() methods
|
||||
- Use Math.FusedMultiplyAdd for a*b+c patterns
|
||||
- Support isNew=false for bar correction (state rollback)
|
||||
- Handle NaN/Infinity with last-valid-value substitution
|
||||
- Use [MethodImpl(AggressiveInlining)] for hot paths
|
||||
|
||||
auto_review:
|
||||
enabled: true
|
||||
auto_incremental_review: true
|
||||
ignore_title_keywords:
|
||||
- "WIP"
|
||||
- "DO NOT MERGE"
|
||||
- "draft"
|
||||
drafts: false
|
||||
base_branches:
|
||||
- dev
|
||||
|
||||
finishing_touches:
|
||||
docstrings:
|
||||
enabled: false # XML docs handled separately
|
||||
unit_tests:
|
||||
enabled: false # Tests excluded from review
|
||||
|
||||
tools:
|
||||
# Disable tools not relevant to C#
|
||||
shellcheck:
|
||||
enabled: false
|
||||
ruff:
|
||||
enabled: false
|
||||
eslint:
|
||||
enabled: false
|
||||
flake8:
|
||||
enabled: false
|
||||
pylint:
|
||||
enabled: false
|
||||
rubocop:
|
||||
enabled: false
|
||||
phpstan:
|
||||
enabled: false
|
||||
golangci-lint:
|
||||
enabled: false
|
||||
swiftlint:
|
||||
enabled: false
|
||||
detekt:
|
||||
enabled: false
|
||||
|
||||
# Keep enabled for config files
|
||||
yamllint:
|
||||
enabled: true
|
||||
markdownlint:
|
||||
enabled: true
|
||||
gitleaks:
|
||||
enabled: true # Security - detect secrets
|
||||
github-checks:
|
||||
enabled: true
|
||||
timeout_ms: 90000
|
||||
|
||||
chat:
|
||||
auto_reply: true
|
||||
|
||||
knowledge_base:
|
||||
opt_out: false
|
||||
web_search:
|
||||
enabled: true
|
||||
code_guidelines:
|
||||
enabled: true
|
||||
filePatterns:
|
||||
- ".clinerules/**"
|
||||
learnings:
|
||||
scope: auto
|
||||
issues:
|
||||
scope: auto
|
||||
pull_requests:
|
||||
scope: auto
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RunSettings>
|
||||
<DataCollectionRunSettings>
|
||||
<DataCollectors>
|
||||
<DataCollector friendlyName="XPlat Code Coverage">
|
||||
<Configuration>
|
||||
<Format>json,cobertura,lcov,opencover</Format>
|
||||
<Exclude>
|
||||
<ModulePath>.*OoplesFinance.*</ModulePath>
|
||||
<ModulePath>.*Skender.*</ModulePath>
|
||||
<ModulePath>.*TALib.*</ModulePath>
|
||||
<ModulePath>.*Tulip.*</ModulePath>
|
||||
<ModulePath>.*xunit.*</ModulePath>
|
||||
<ModulePath>.*Microsoft.*</ModulePath>
|
||||
</Exclude>
|
||||
</Configuration>
|
||||
</DataCollector>
|
||||
</DataCollectors>
|
||||
</DataCollectionRunSettings>
|
||||
</RunSettings>
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": 1,
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"gitversion.tool": {
|
||||
"version": "6.5.1",
|
||||
"commands": [
|
||||
"dotnet-gitversion"
|
||||
],
|
||||
"rollForward": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ version = 1
|
||||
[[analyzers]]
|
||||
name = "csharp"
|
||||
enabled = true
|
||||
exclude = ["CS-R1131"]
|
||||
|
||||
[[analyzers]]
|
||||
name = "test-coverage"
|
||||
@@ -14,4 +15,4 @@ enabled = true
|
||||
|
||||
[[transformers]]
|
||||
name = "dotnet-format"
|
||||
enabled = true
|
||||
enabled = true
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# EditorConfig for QuanTAlib
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.cs]
|
||||
|
||||
resharper_check_namespace_highlighting = none
|
||||
resharper_redundant_argument_default_value_highlighting = none
|
||||
resharper_invalid_xml_doc_comment_highlighting = none
|
||||
resharper_inconsistent_naming_highlighting = none
|
||||
resharper_redundant_using_directive_highlighting = none
|
||||
resharper_for_can_be_converted_to_foreach_highlighting = none
|
||||
resharper_unused_parameter_local_highlighting = none
|
||||
resharper_conditional_access_qualifier_is_non_nullable_according_to_api_contract_highlighting = none
|
||||
resharper_redundant_lambda_parameter_type_highlighting = none
|
||||
|
||||
resharper_redundant_cast_highlighting = hint
|
||||
resharper_redundant_assignment_highlighting = hint
|
||||
resharper_not_accessed_field_local_highlighting = hint
|
||||
resharper_unused_auto_property_accessor_global_highlighting = hint
|
||||
resharper_condition_is_always_true_or_false_highlighting = hint
|
||||
resharper_access_to_modified_closure_highlighting = hint
|
||||
resharper_generic_enumerator_not_disposed_highlighting = hint
|
||||
|
||||
dotnet_diagnostic.S3776.severity = none
|
||||
dotnet_diagnostic.S1244.severity = none
|
||||
dotnet_diagnostic.IDE0028.severity = none
|
||||
dotnet_diagnostic.CA1416.severity = none
|
||||
dotnet_diagnostic.S3236.severity = none
|
||||
dotnet_diagnostic.MA0046.severity = none
|
||||
dotnet_diagnostic.MA0003.severity = suggestion
|
||||
|
||||
csharp_style_var_for_built_in_types = false:silent
|
||||
csharp_style_var_when_type_is_apparent = true:suggestion
|
||||
csharp_style_var_elsewhere = false:silent
|
||||
|
||||
[ndepend/**]
|
||||
dotnet_analyzer_diagnostic.severity = none
|
||||
generated_code = true
|
||||
|
||||
[*.sh]
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
@@ -0,0 +1,39 @@
|
||||
# Git Line Ending Configuration for QuanTAlib
|
||||
|
||||
# Default behavior: let Git normalize line endings to LF on checkin
|
||||
* text=auto eol=lf
|
||||
|
||||
# Config files must always use LF (cross-platform compatibility)
|
||||
*.yaml text eol=lf
|
||||
*.yml text eol=lf
|
||||
*.json text eol=lf
|
||||
*.xml text eol=lf
|
||||
*.toml text eol=lf
|
||||
*.md text eol=lf
|
||||
*.editorconfig text eol=lf
|
||||
|
||||
# Shell scripts must always use LF
|
||||
*.sh text eol=lf
|
||||
|
||||
# C# source files use LF
|
||||
*.cs text eol=lf
|
||||
*.csproj text eol=lf
|
||||
*.props text eol=lf
|
||||
*.targets text eol=lf
|
||||
*.sln text eol=lf
|
||||
|
||||
# Windows-specific files use CRLF
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
*.ps1 text eol=crlf
|
||||
|
||||
# Binary files
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.gif binary
|
||||
*.ico binary
|
||||
*.dll binary
|
||||
*.exe binary
|
||||
*.snupkg binary
|
||||
*.nupkg binary
|
||||
@@ -186,7 +186,7 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Chart.IChartWindow.YScaleFactor">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.Chart.IChartWindowCoordinatesConverter">
|
||||
@@ -764,12 +764,12 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.RangeIndex">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.TimeLeft">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.Value">
|
||||
@@ -779,22 +779,22 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.STDCoefficient">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.CumulativeVolume">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.CumulativePriceMVolume">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Abstractions.IVwapHistoryItem.MPDCoefficient">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.Serialization.SnapshotData">
|
||||
@@ -815,7 +815,7 @@
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.IVolumeAnalysisItem">
|
||||
<summary>
|
||||
Defines 'Volume Analysis' calculation result item
|
||||
Defines 'Volume Analysis' calculation result item
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.Account">
|
||||
@@ -887,7 +887,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.AccountOperation.Update(System.Collections.Generic.IList{TradingPlatform.BusinessLayer.SettingItem})">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="settings">The settings.</param>
|
||||
</member>
|
||||
@@ -900,7 +900,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.AccountOperation.Execute(System.Collections.Generic.IList{TradingPlatform.BusinessLayer.SettingItem})">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="settings">The settings.</param>
|
||||
</member>
|
||||
@@ -1049,13 +1049,13 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.AdditionalInfoItem.Update(TradingPlatform.BusinessLayer.AdditionalInfoItem)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="item">The item.</param>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.AdditionalInfoItem.Clone">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<returns>An object.</returns>
|
||||
</member>
|
||||
@@ -1214,11 +1214,11 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.SyntheticHistorySynhroniser.MoveNext(System.Threading.CancellationToken)">
|
||||
<summary>
|
||||
Increment current position
|
||||
</summary>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="E:TradingPlatform.BusinessLayer.DeliveredAsset.Updated">
|
||||
<summary>
|
||||
Will be triggered on each <see cref="M:TradingPlatform.BusinessLayer.DeliveredAsset.UpdateByMessage(TradingPlatform.BusinessLayer.Integration.MessageOpenDeliveredAsset)"/> invocation
|
||||
Will be triggered on each <see cref="M:TradingPlatform.BusinessLayer.DeliveredAsset.UpdateByMessage(TradingPlatform.BusinessLayer.Integration.MessageOpenDeliveredAsset)"/> invocation
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.DeliveredAsset.UpdateByMessage(TradingPlatform.BusinessLayer.Integration.MessageOpenDeliveredAsset)">
|
||||
@@ -1471,12 +1471,12 @@
|
||||
</member>
|
||||
<member name="F:TradingPlatform.BusinessLayer.Report.Columns">
|
||||
<summary>
|
||||
Columns collection
|
||||
Columns collection
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:TradingPlatform.BusinessLayer.Report.Rows">
|
||||
<summary>
|
||||
Rows collection
|
||||
Rows collection
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Report.#ctor">
|
||||
@@ -1566,7 +1566,7 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.ReportType.Settings">
|
||||
<summary>
|
||||
<see cref="T:TradingPlatform.BusinessLayer.ICustomizable"/> report settings
|
||||
<see cref="T:TradingPlatform.BusinessLayer.ICustomizable"/> report settings
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.RulesManager">
|
||||
@@ -3200,7 +3200,7 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.HistoryItemTick.AskSize">
|
||||
<summary>
|
||||
Defines Ask size
|
||||
Defines Ask size
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.HistoryItemTick.Item(TradingPlatform.BusinessLayer.PriceType)">
|
||||
@@ -3574,12 +3574,12 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.DayBar.OpenInterest">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.DOMQuote">
|
||||
<summary>
|
||||
Represent access to DOM2 quote, which contains Bids and Asks.
|
||||
Represent access to DOM2 quote, which contains Bids and Asks.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.DOMQuote.Asks">
|
||||
@@ -3619,7 +3619,7 @@
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.Level2Quote">
|
||||
<summary>
|
||||
Represent access to Level2 quote.
|
||||
Represent access to Level2 quote.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Level2Quote.PriceType">
|
||||
@@ -3807,7 +3807,7 @@
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.HVSheduleMode">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:TradingPlatform.BusinessLayer.HVSheduleMode.HV">
|
||||
@@ -4353,7 +4353,7 @@
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Indicator.LinesLevels">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Indicator.SeparateWindow">
|
||||
@@ -4393,7 +4393,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Indicator.AddIndicator(TradingPlatform.BusinessLayer.Indicator)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="indicator"></param>
|
||||
</member>
|
||||
@@ -4614,7 +4614,7 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.IndicatorLineMarker.#ctor">
|
||||
<summary>
|
||||
Constructor for IndicatorLineMarker
|
||||
</summary>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.IndicatorLineMarkerIconType">
|
||||
<summary>
|
||||
@@ -4643,7 +4643,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.LineSeries.GetMarker(System.Int32)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.LineSeries.ClearMarkers">
|
||||
@@ -4830,7 +4830,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.SubscribeQuotesParameters.#ctor(System.String,TradingPlatform.BusinessLayer.SubscribeQuoteType)">
|
||||
<summary>
|
||||
SubscribeQuotesParameters constructor
|
||||
SubscribeQuotesParameters constructor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.ModifyOrderRequestParameters.OrderId">
|
||||
@@ -4880,7 +4880,7 @@
|
||||
</member>
|
||||
<member name="F:TradingPlatform.BusinessLayer.DatePickerFormat.LongDateTime">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.SettingItemGroup">
|
||||
@@ -5339,7 +5339,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.AggressorFlagCalculator.Dispose">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.AggressorFlagCalculator.CalculateAggressorFlag(System.Double,System.Double,System.Double)">
|
||||
@@ -5568,17 +5568,17 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.BufferedProcessor`1.Start">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.BufferedProcessor`1.Stop">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.BufferedProcessor`1.Push(`0)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="subject">The subject.</param>
|
||||
</member>
|
||||
@@ -5595,7 +5595,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.TasksHolder`1.#ctor(System.Int32)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TradingPlatform.BusinessLayer.Utils.TimeFrameConfig.DefaultAggregation">
|
||||
@@ -5607,7 +5607,7 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.Utils.HistoryStepsCalculator.AddMonths(System.DateTime,System.Int32)">
|
||||
<summary>
|
||||
https://stackoverflow.com/questions/3060381/datetime-addmonths-adding-only-month-not-days
|
||||
|
||||
|
||||
Проблема:
|
||||
(29 Feb).AddMonth(1) = 29 March
|
||||
</summary>
|
||||
@@ -5640,7 +5640,7 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.IBrandingInformation.GetResourceNames">
|
||||
<summary>
|
||||
Get all available custom resources
|
||||
</summary>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.IBrandingInformation.GetResource(System.String)">
|
||||
<summary>
|
||||
@@ -5650,7 +5650,7 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.IBrandingInformation.IsItemHidden(System.String,System.String)">
|
||||
<summary>
|
||||
Check whether specified items was hidden by branding specification
|
||||
</summary>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.AssemblyLoader">
|
||||
@@ -5900,15 +5900,15 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
List<GlobalVariable> global_List=new List<GlobalVariable>();
|
||||
|
||||
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
if(GlobalVariablesManager.Count()>0)
|
||||
{
|
||||
global_List=GlobalVariablesManager.GetGlobalVariablesList();
|
||||
@@ -5935,14 +5935,14 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
List<GlobalVariable> global_List=new List<GlobalVariable>();
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
if(GlobalVariablesManager.Count()>0)
|
||||
{
|
||||
global_List=GlobalVariablesManager.GetGlobalVariablesList();
|
||||
@@ -5969,14 +5969,14 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
List<GlobalVariable> global_List=new List<GlobalVariable>();
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
if(GlobalVariablesManager.Count()>0)
|
||||
{
|
||||
global_List=GlobalVariablesManager.GetGlobalVariablesList();
|
||||
@@ -5984,7 +5984,7 @@
|
||||
{
|
||||
//Simplified way to retrieve global variable value
|
||||
el.GlobalVariable("new_global_variable_period", period)
|
||||
|
||||
|
||||
//However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example.
|
||||
}
|
||||
}
|
||||
@@ -5999,7 +5999,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.GlobalVariables.GlobalVariablesManager.SetValue(System.String,System.Object,TradingPlatform.BusinessLayer.GlobalVariables.VariableLifetime)">
|
||||
<summary>
|
||||
Sets variable value to a global storage
|
||||
Sets variable value to a global storage
|
||||
</summary>
|
||||
<example>
|
||||
<span id="Example 1">
|
||||
@@ -6007,27 +6007,27 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
GlobalVariablesManager(){
|
||||
base.ProjectName = "GlobalVariablesManager";
|
||||
base.Password=GetHashedPassword(ProjectName);
|
||||
base.Password=GetHashedPassword(ProjectName);
|
||||
}
|
||||
|
||||
|
||||
[InputParameter("Period", 0, 1, 9999)]
|
||||
public int period = 5;
|
||||
|
||||
|
||||
public override void OnQuote()
|
||||
{
|
||||
//Simplified way to store a global variable
|
||||
|
||||
//Simplified way to store a global variable
|
||||
|
||||
GlobalVariablesManager.SetValue("global_variable_period", period, VariableLifetime.SaveSession);
|
||||
|
||||
|
||||
//However, to indicate any variable belongs to certain indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc.
|
||||
|
||||
|
||||
GlobalVariablesManager.SetValue("global_variable_period" +Symbols.Current.Name+period+Password, period, VariableLifetime.SaveSession);
|
||||
}
|
||||
}
|
||||
@@ -6049,17 +6049,17 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
//Simplified way to remove a global variable
|
||||
|
||||
{
|
||||
//Simplified way to remove a global variable
|
||||
|
||||
GlobalVariablesManager.Remove("global_variable_period");
|
||||
|
||||
|
||||
//However, to remove certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example.
|
||||
}
|
||||
}
|
||||
@@ -6079,13 +6079,13 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
if(GlobalVariablesManager.Count()>0)
|
||||
{
|
||||
Print("Your session obtains "+GlobalVariablesManager.Count()+" global variables");
|
||||
@@ -6108,15 +6108,15 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
GlobalVariablesManager.RemoveAll();
|
||||
|
||||
{
|
||||
GlobalVariablesManager.RemoveAll();
|
||||
|
||||
if(GlobalVariablesManager.Count()==0)
|
||||
{
|
||||
Print("Your session does not have any global variables");
|
||||
@@ -6138,20 +6138,20 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
//Simplified way to check an existance of a global variable
|
||||
|
||||
{
|
||||
//Simplified way to check an existance of a global variable
|
||||
|
||||
if(GlobalVariablesManager.Exists("global_variable_period"))
|
||||
Print("Your session has this global variable");
|
||||
else
|
||||
GlobalVariablesManager.SetValue("global_variable_period");
|
||||
|
||||
GlobalVariablesManager.SetValue("global_variable_period");
|
||||
|
||||
//However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example.
|
||||
}
|
||||
}
|
||||
@@ -6172,19 +6172,19 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
//Simplified way to retrieve global variable value
|
||||
|
||||
|
||||
if(GlobalVariablesManager.Exists("global_variable_period"))
|
||||
//Always perform a type casting before assigning any variable from global storage
|
||||
period = (int)GlobalVariablesManager.GetValue("global_variable_period");
|
||||
|
||||
period = (int)GlobalVariablesManager.GetValue("global_variable_period");
|
||||
|
||||
//However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example.
|
||||
}
|
||||
}
|
||||
@@ -6205,24 +6205,24 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
{
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
int new_period;
|
||||
|
||||
|
||||
//Simplified way to retrieve global variable value
|
||||
|
||||
|
||||
if(GlobalVariablesManager.TryGetValue("global_variable_period"))
|
||||
Print("New variable is assigned from globals: " + new_period);
|
||||
if(new_period==period)
|
||||
Print("Matching, no need to re-assign globals: ");
|
||||
Print("Matching, no need to re-assign globals: ");
|
||||
else
|
||||
GlobalVariablesManager.SetValue("global_variable_period", period, VariableLifetime.SaveSession);
|
||||
|
||||
GlobalVariablesManager.SetValue("global_variable_period", period, VariableLifetime.SaveSession);
|
||||
|
||||
//However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example.
|
||||
}
|
||||
}
|
||||
@@ -6244,14 +6244,14 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
Connection myConnection = Connection.CurrentConnection;
|
||||
public override void OnQuote()
|
||||
{
|
||||
{
|
||||
if(myConnection.Status==Disconnected)
|
||||
GlobalVariablesManager.Flush();
|
||||
}
|
||||
@@ -6271,17 +6271,17 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using PTLRuntime.NETScript;
|
||||
|
||||
|
||||
namespace GlobalVariablesManager
|
||||
{
|
||||
public class GlobalVariablesManager : NETIndicator
|
||||
{
|
||||
List <GlobalVariable>global_List=new List<GlobalVariable>();
|
||||
List <GlobalVariable>global_List=new List<GlobalVariable>();
|
||||
public override void Init()
|
||||
{
|
||||
{
|
||||
if(GlobalVariablesManager.Count()>0)
|
||||
global_List=GlobalVariablesManager.GetGlobalVariablesList();
|
||||
|
||||
|
||||
foreach (var el in global_List)
|
||||
{
|
||||
Print(el.Name);
|
||||
@@ -6351,7 +6351,7 @@
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.OnLocaleChanged">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.key(System.String)">
|
||||
@@ -6364,24 +6364,24 @@
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.IsHidden(System.String,System.String,System.String)">
|
||||
<summary>
|
||||
Check, whether current translation equal to hidden
|
||||
</summary>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.UnRegisterPlugin(System.String)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="pluginName"></param>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.RegisterPlugin(System.String,System.String)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
<param name="pluginName"></param>
|
||||
<param name="location"></param>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.loc.InitializeCoreLocalizer">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:TradingPlatform.BusinessLayer.SymbolList">
|
||||
@@ -6395,51 +6395,51 @@
|
||||
http://www.codeguru.com/csharp/csharp/cs_date_time/timeroutines/article.php/c4207/C-SNTP-Client.htm
|
||||
+++ добавлен диспозе, подправлен ToString(), убран лишний метод.
|
||||
+++ ReceiveTimeoutбSendTimeout
|
||||
|
||||
|
||||
NTPClient is a C# class designed to connect to time servers on the Internet.
|
||||
The implementation of the protocol is based on the RFC 2030.
|
||||
|
||||
|
||||
Public class members:
|
||||
|
||||
|
||||
LeapIndicator - Warns of an impending leap second to be inserted/deleted in the last
|
||||
minute of the current day. (See the _LeapIndicator enum)
|
||||
|
||||
|
||||
VersionNumber - Version number of the protocol (3 or 4).
|
||||
|
||||
|
||||
Mode - Returns mode. (See the _Mode enum)
|
||||
|
||||
|
||||
Stratum - Stratum of the clock. (See the _Stratum enum)
|
||||
|
||||
|
||||
PollInterval - Maximum interval between successive messages.
|
||||
|
||||
|
||||
Precision - Precision of the clock.
|
||||
|
||||
|
||||
RootDelay - Round trip time to the primary reference source.
|
||||
|
||||
|
||||
RootDispersion - Nominal error relative to the primary reference source.
|
||||
|
||||
|
||||
ReferenceTimestamp - The time at which the clock was last set or corrected.
|
||||
|
||||
|
||||
OriginateTimestamp - The time at which the request departed the client for the server.
|
||||
|
||||
|
||||
ReceiveTimestamp - The time at which the request arrived at the server.
|
||||
|
||||
|
||||
Transmit Timestamp - The time at which the reply departed the server for client.
|
||||
|
||||
|
||||
RoundTripDelay - The time between the departure of request and arrival of reply.
|
||||
|
||||
|
||||
LocalClockOffset - The offset of the local clock relative to the primary reference
|
||||
source.
|
||||
|
||||
|
||||
Initialize - Sets up data structure and prepares for connection.
|
||||
|
||||
|
||||
Connect - Connects to the time server and populates the data structure.
|
||||
|
||||
|
||||
IsResponseValid - Returns true if received data is valid and if comes from
|
||||
a NTP-compliant time server.
|
||||
|
||||
|
||||
ToString - Returns a string representation of the object.
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Structure of the standard NTP header (as described in RFC 2030)
|
||||
1 2 3
|
||||
@@ -6477,9 +6477,9 @@
|
||||
| |
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
NTP Timestamp Format (as described in RFC 2030)
|
||||
1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
@@ -6488,7 +6488,7 @@
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Seconds Fraction (0-padded) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:TradingPlatform.BusinessLayer.TimeSync.NTPClient.Connect">
|
||||
@@ -6573,12 +6573,12 @@
|
||||
</member>
|
||||
<member name="M:Platform.Utils.Encryptor.EncryptString(System.String)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Platform.Utils.Encryptor.DecryptString(System.String)">
|
||||
<summary>
|
||||
|
||||
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
---
|
||||
name: beast
|
||||
description: Meticulous auto-agent for high-performance .NET library development with full MCP tool integration
|
||||
tools:
|
||||
- execute
|
||||
- read
|
||||
- edit
|
||||
- search
|
||||
- web
|
||||
- codacy-mcp-server/*
|
||||
- gitkraken/*
|
||||
- github/*
|
||||
- qdrant-mcp/*
|
||||
- sequential-thinking-mcp/*
|
||||
- tavily-mcp/*
|
||||
- wolfram-mcp/*
|
||||
- agent
|
||||
- todo
|
||||
---
|
||||
|
||||
# Role: Meticulous Auto-Agent
|
||||
|
||||
**Persona:** You are "Beast," a high-agency autonomous developer specialized in high-performance .NET development. You have full permission to use local shell commands, filesystem tools, and all available MCP servers.
|
||||
|
||||
## 🎯 Mission
|
||||
|
||||
Build and maintain QuanTAlib: a zero-allocation, SIMD-optimized C# quantitative analysis library. Every decision prioritizes correctness, performance, and mathematical rigor.
|
||||
|
||||
## 🧰 Available MCP Servers
|
||||
|
||||
### Core Development Tools
|
||||
|
||||
#### **fs** (Filesystem Operations)
|
||||
- **Purpose:** Local filesystem access for reading, writing, and exploring the codebase
|
||||
- **When to use:**
|
||||
- Reading source files, tests, documentation
|
||||
- Writing generated code, scripts, benchmarks
|
||||
- Listing directory contents
|
||||
- Exploring project structure
|
||||
- Searching for patterns across files
|
||||
- Getting file metadata (size, modified date, permissions)
|
||||
- **Tools:**
|
||||
- `read_file` - Read file contents (text or binary)
|
||||
- `write_file` - Write/create files with content
|
||||
- `list_directory` - List files and subdirectories
|
||||
- `search_files` - Search file contents with patterns
|
||||
- `get_file_info` - Get file metadata (size, dates, permissions)
|
||||
- `move_file` - Move/rename files
|
||||
- `create_directory` - Create new directories
|
||||
- **Priority:** PRIMARY tool for ALL file operations
|
||||
- **Root Path:** `C:\github` (configured scope)
|
||||
- **Pattern:** Always use fs tools instead of shell commands for file operations
|
||||
|
||||
#### **sequential-thinking** (Planning & Decomposition)
|
||||
- **Purpose:** Multi-step reasoning and complex problem solving
|
||||
- **When to use:**
|
||||
- Breaking down complex algorithmic challenges
|
||||
- Planning multi-file refactors
|
||||
- Analyzing trade-offs in design decisions
|
||||
- Generating solution hypotheses and verifying them
|
||||
- **Tool:** `sequentialthinking`
|
||||
- **Pattern:** Use for any task requiring more than 3-4 logical steps
|
||||
|
||||
#### **tavily** (Web Search & Documentation)
|
||||
- **Purpose:** Fresh API info, .NET updates, performance patterns
|
||||
- **When to use:**
|
||||
- Finding latest .NET 10/C# 13 features
|
||||
- SIMD best practices and hardware intrinsics
|
||||
- Trading library optimization patterns
|
||||
- Current benchmarking methodologies
|
||||
- **Tools:** `tavily-search`, `tavily-extract`, `tavily-crawl`, `tavily-map`
|
||||
- **Priority:** Use AFTER ref-tools for .NET-specific queries
|
||||
|
||||
#### **ref-tools** (Documentation Search)
|
||||
- **Purpose:** Official .NET docs, GitHub repos, private documentation
|
||||
- **When to use:**
|
||||
- .NET Runtime internals
|
||||
- System.Runtime.Intrinsics APIs
|
||||
- Vector<T> documentation
|
||||
- SIMD intrinsics reference
|
||||
- **Tools:** `ref_search_documentation`, `ref_read_url`
|
||||
- **Priority:** PRIMARY source for .NET-specific information
|
||||
|
||||
#### **wolfram** (Mathematical Validation)
|
||||
- **Purpose:** Math verification, algorithm correctness
|
||||
- **When to use:**
|
||||
- Validating complex formulas
|
||||
- Verifying statistical calculations
|
||||
- Checking mathematical properties (convergence, stability)
|
||||
- Computing expected values for test validation
|
||||
- **Tools:** `wolfram_query`
|
||||
- **Modes:** `llm` (default), `full` (structured data), `short` (concise), `simple` (image)
|
||||
|
||||
### Quality & Memory Tools
|
||||
|
||||
#### **qdrant** (Persistent Memory)
|
||||
- **Purpose:** Store and retrieve architectural decisions, patterns, benchmarks
|
||||
- **When to use:**
|
||||
- Storing performance benchmarks with context
|
||||
- Recording architectural decisions and their rationale
|
||||
- Saving validated patterns (SIMD, FMA, optimization techniques)
|
||||
- Retrieving past solutions to similar problems
|
||||
- **Tools:** `qdrant-find`, `qdrant-store`
|
||||
- **Important:** Query FIRST before designing new patterns
|
||||
- **Store Format:** `{decision, benchmark, pattern, src, date, tags: ["perf", "simd", "pattern-name"]}`
|
||||
- **Never store:** API keys, secrets, or sensitive data
|
||||
|
||||
#### **codacy** (Code Quality Analysis)
|
||||
- **Purpose:** Automated code quality checks and issue tracking
|
||||
- **When to use:**
|
||||
- Listing code quality issues in repositories
|
||||
- Searching for security vulnerabilities (SRM items)
|
||||
- Validating code patterns and tool configurations
|
||||
- Checking organization and repository status
|
||||
- **Tools:** `codacy_list_organizations`, `codacy_list_repository_issues`, `codacy_search_organization_srm_items`, `codacy_cli_analyze`
|
||||
- **Pattern:** Use for pre-commit quality gates and security scans
|
||||
|
||||
## ⚙️ Standard Operating Procedure (SOP)
|
||||
|
||||
### Phase 1: Discovery & Context
|
||||
|
||||
1. **Query Memory:** Check `qdrant-find` for existing patterns, decisions, benchmarks
|
||||
2. **Search Documentation:** Use `ref_search_documentation` for .NET/SIMD specifics
|
||||
3. **Web Research:** Use `tavily-search` if ref-tools lacks current info
|
||||
4. **Explore Codebase:** List files, read relevant sources
|
||||
5. **Validate Math:** Use `wolfram_query` for complex formulas
|
||||
|
||||
### Phase 2: Planning
|
||||
|
||||
1. **Complex Tasks:** Use `sequentialthinking` to break down into steps
|
||||
2. **Document Plan:** Create task_progress checklist
|
||||
3. **Identify Dependencies:** Note which patterns/benchmarks to retrieve from qdrant
|
||||
4. **Set Performance Targets:** Define throughput, allocation, complexity goals
|
||||
|
||||
### Phase 3: Implementation
|
||||
|
||||
1. **Read Existing Code:** Understand current patterns
|
||||
2. **Apply Stored Patterns:** Retrieve and adapt from qdrant
|
||||
3. **Optimize:** SIMD, FMA, stackalloc, aggressive inlining
|
||||
4. **Validate:** Math correctness via wolfram, code quality via codacy
|
||||
5. **Benchmark:** Measure performance, compare to baseline
|
||||
|
||||
### Phase 4: Verification & Storage
|
||||
|
||||
1. **Test All Modes:** Unit tests, validation tests, Quantower adapter tests
|
||||
2. **Run Quality Checks:** `codacy_cli_analyze` for local validation
|
||||
3. **Document Results:** Benchmark numbers with context
|
||||
4. **Persist to Memory:** `qdrant-store` with tags for future retrieval
|
||||
5. **Mark Superseded:** Tag old patterns as deprecated if improved
|
||||
6. For local file discovery, prioritize the terminal tool using dir /s /b. Only use fs/list_directory if recursion is not needed.
|
||||
|
||||
## 📁 Temporary Workspace
|
||||
|
||||
**Location:** `temp/`
|
||||
|
||||
All temporary files, generated scripts, and intermediate artifacts must be stored in the `temp/` directory:
|
||||
|
||||
- **Scripts:** `temp/scripts/` - PowerShell (.ps1), Bash (.sh), Batch (.bat/.cmd)
|
||||
- **Benchmarks:** `temp/benchmarks/` - Performance test results
|
||||
- **Test Data:** `temp/testdata/` - Generated test datasets
|
||||
- **Logs:** `temp/logs/` - Execution logs and diagnostic output
|
||||
|
||||
**Guidelines:**
|
||||
- Use descriptive filenames with timestamps (e.g., `temp/scripts/benchmark_20260110_185530.ps1`)
|
||||
- Create subdirectories as needed to organize content
|
||||
- The temp directory is gitignored - never commit temporary files
|
||||
- Clean up old temporary files when no longer needed
|
||||
|
||||
## 🔄 Tool Usage Patterns
|
||||
|
||||
### Research Pattern
|
||||
```
|
||||
1. qdrant-find: Check for existing solutions
|
||||
2. ref_search_documentation: Official .NET docs
|
||||
3. tavily-search: Current best practices
|
||||
4. wolfram_query: Validate math
|
||||
```
|
||||
|
||||
### Implementation Pattern
|
||||
```
|
||||
1. sequentialthinking: Plan the approach
|
||||
2. Read files: Understand current code
|
||||
3. qdrant-find: Retrieve applicable patterns
|
||||
4. Implement: Write optimized code
|
||||
5. codacy_cli_analyze: Local quality check
|
||||
```
|
||||
|
||||
### Validation Pattern
|
||||
```
|
||||
1. Test: Run all test suites
|
||||
2. Benchmark: Measure performance
|
||||
3. wolfram_query: Verify mathematical correctness
|
||||
4. codacy_list_repository_issues: Check quality gate
|
||||
```
|
||||
|
||||
### Memory Pattern
|
||||
```
|
||||
1. Before: qdrant-find for context
|
||||
2. After: qdrant-store with tags
|
||||
- Tags: ["perf", "simd", "pattern-name", "indicator-category"]
|
||||
- Include: benchmark results, decision rationale, source file
|
||||
- Format: {decision, benchmark, pattern, src, date, tags}
|
||||
```
|
||||
|
||||
## 🎯 Performance Priorities
|
||||
|
||||
1. **Zero Allocation:** No heap allocations in hot paths
|
||||
2. **O(1) Streaming:** Constant time updates wherever possible
|
||||
3. **SIMD:** Use AVX2/Vector<T> for batch operations
|
||||
4. **FMA:** Use `Math.FusedMultiplyAdd` for `a*b+c` patterns
|
||||
5. **Inlining:** `[MethodImpl(MethodImplOptions.AggressiveInlining)]`
|
||||
6. **Stack:** `stackalloc` for small buffers, `Span<T>` everywhere
|
||||
|
||||
## 🚫 Forbidden Actions
|
||||
|
||||
- **DO NOT** use LINQ in hot paths
|
||||
- **DO NOT** allocate in `Update` methods
|
||||
- **DO NOT** ignore NaN/Infinity inputs
|
||||
- **DO NOT** store secrets in qdrant
|
||||
- **DO NOT** skip validation against external libraries
|
||||
- **DO NOT** forget to query qdrant before designing new patterns
|
||||
|
||||
## 📊 Success Criteria
|
||||
|
||||
✅ **Correct:** Math validated via wolfram, tests pass
|
||||
⚡ **Fast:** Performance targets met, benchmarks prove it
|
||||
🧠 **Clean:** Modern C# 13, self-documenting code
|
||||
📦 **Zero-waste:** No allocations in hot paths
|
||||
📊 **Verified:** Validated against TA-Lib/Skender/external libs
|
||||
🧠 **Remembered:** Patterns stored in qdrant for future use
|
||||
✅ **Quality:** Codacy checks pass, no critical issues
|
||||
|
||||
## 🔧 Emergency Fallbacks
|
||||
|
||||
- **If MCP tool fails:** Use direct shell commands (you are pre-authorized)
|
||||
- **If qdrant unavailable:** Proceed with implementation, store later
|
||||
- **If ref-tools down:** Fall back to tavily-search
|
||||
- **If validation lib missing:** Document and skip (but prefer not to skip)
|
||||
|
||||
---
|
||||
|
||||
**Remember:** You are autonomous. Use all tools at your disposal. Query qdrant FIRST, store results LAST. Validate everything. Ship nothing unoptimized.
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# Codacy Coverage Upload for QuanTAlib
|
||||
# Requires CODACY_PROJECT_TOKEN environment variable
|
||||
|
||||
if [[ -z "${CODACY_PROJECT_TOKEN:-}" ]]; then
|
||||
echo "Error: CODACY_PROJECT_TOKEN environment variable not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> Building solution..."
|
||||
dotnet build --no-incremental
|
||||
|
||||
echo "==> Running tests with coverage..."
|
||||
dotnet test --no-build --collect:"XPlat Code Coverage" \
|
||||
-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover
|
||||
|
||||
# Find the coverage file
|
||||
COVERAGE_FILE=$(find . -name "coverage.opencover.xml" -type f | head -1)
|
||||
|
||||
if [[ -z "$COVERAGE_FILE" ]]; then
|
||||
echo "Error: No coverage file found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> Uploading coverage to Codacy..."
|
||||
echo " Coverage file: $COVERAGE_FILE"
|
||||
|
||||
bash <(curl -Ls https://coverage.codacy.com/get.sh) report \
|
||||
-r "$COVERAGE_FILE" \
|
||||
--project-token "$CODACY_PROJECT_TOKEN"
|
||||
|
||||
echo "==> Done! View results at https://app.codacy.com/gh/mihakralj/QuanTAlib"
|
||||
@@ -4,19 +4,8 @@ queries:
|
||||
- uses: security-and-quality
|
||||
- uses: security-extended
|
||||
|
||||
paths-ignore:
|
||||
- '**/test/**'
|
||||
- '**/tests/**'
|
||||
- '**/*.test.cs'
|
||||
- '**/obj/**'
|
||||
- '**/bin/**'
|
||||
- '**/docs/**'
|
||||
|
||||
query-filters:
|
||||
- exclude:
|
||||
problem.severity:
|
||||
- warning
|
||||
- recommendation
|
||||
|
||||
paths:
|
||||
- src
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
description: Configuration for AI behavior when interacting with Codacy's MCP Server
|
||||
applyTo: '**'
|
||||
---
|
||||
---
|
||||
# Codacy Rules
|
||||
Configuration for AI behavior when interacting with Codacy's MCP Server
|
||||
|
||||
## using any tool that accepts the arguments: `provider`, `organization`, or `repository`
|
||||
- ALWAYS use:
|
||||
- provider: gh
|
||||
- organization: mihakralj
|
||||
- repository: QuanTAlib
|
||||
- Avoid calling `git remote -v` unless really necessary
|
||||
|
||||
## CRITICAL: After ANY successful `edit_file` or `reapply` operation
|
||||
- YOU MUST IMMEDIATELY run the `codacy_cli_analyze` tool from Codacy's MCP Server for each file that was edited, with:
|
||||
- `rootPath`: set to the workspace path
|
||||
- `file`: set to the path of the edited file
|
||||
- `tool`: leave empty or unset
|
||||
- If any issues are found in the new edits, propose and apply fixes for them.
|
||||
- > NOTE: Failure to follow this rule is considered a critical error.
|
||||
|
||||
## When you tried to run the `codacy_cli_analyze` tool and the Codacy CLI is not installed
|
||||
- Ask the user 'Codacy CLI is not installed. Would you like me to install it now?'
|
||||
- If the user responds with "yes", run the `codacy_cli_install` tool and then continue with the original task
|
||||
- If the user responds with "no", instruct the user that they can disable automatic analysis in the extension settings
|
||||
- Wait for the user to respond before proceeding with any other actions
|
||||
|
||||
## After every response
|
||||
- If you made any file edits in this conversation, verify you ran `codacy_cli_analyze` tool from Codacy's MCP Server
|
||||
|
||||
## When there are no Codacy MCP Server tools available, or the MCP Server is not reachable
|
||||
- Suggest the user the following troubleshooting steps:
|
||||
- Try to reset the MCP on the extension
|
||||
- If the user is using VSCode, suggest them to review their Copilot > MCP settings in Github, under their organization or personal account. Refer them to Settings > Copilot > Enable MCP servers in Copilot. Suggested URL (https://github.com/settings/copilot/features) or https://github.com/organizations/{organization-name}/settings/copilot/features (This can only be done by their organization admins / owners)
|
||||
- If none of the above steps work, suggest the user to contact Codacy support
|
||||
|
||||
## Trying to call a tool that needs a rootPath as a parameter
|
||||
- Always use the standard, non-URL-encoded file system path
|
||||
|
||||
## CRITICAL: Dependencies and Security Checks
|
||||
- IMMEDIATELY after ANY of these actions:
|
||||
- Running npm/yarn/pnpm install
|
||||
- Adding dependencies to package.json
|
||||
- Adding requirements to requirements.txt
|
||||
- Adding dependencies to pom.xml
|
||||
- Adding dependencies to build.gradle
|
||||
- Any other package manager operations
|
||||
- You MUST run the `codacy_cli_analyze` tool with:
|
||||
- `rootPath`: set to the workspace path
|
||||
- `tool`: set to "trivy"
|
||||
- `file`: leave empty or unset
|
||||
- If any vulnerabilities are found because of the newly added packages:
|
||||
- Stop all other operations
|
||||
- Propose and apply fixes for the security issues
|
||||
- Only continue with the original task after security issues are resolved
|
||||
- EXAMPLE:
|
||||
- After: npm install react-markdown
|
||||
- Do: Run codacy_cli_analyze with trivy
|
||||
- Before: Continuing with any other tasks
|
||||
|
||||
## General
|
||||
- Repeat the relevant steps for each modified file.
|
||||
- "Propose fixes" means to both suggest and, if possible, automatically apply the fixes.
|
||||
- You MUST NOT wait for the user to ask for analysis or remind you to run the tool.
|
||||
- Do not run `codacy_cli_analyze` looking for changes in duplicated code or code complexity metrics.
|
||||
- Complexity metrics are different from complexity issues. When trying to fix complexity in a repository or file, focus on solving the complexity issues and ignore the complexity metric.
|
||||
- Do not run `codacy_cli_analyze` looking for changes in code coverage.
|
||||
- Do not try to manually install Codacy CLI using either brew, npm, npx, or any other package manager.
|
||||
- If the Codacy CLI is not installed, just run the `codacy_cli_analyze` tool from Codacy's MCP Server.
|
||||
- When calling `codacy_cli_analyze`, only send provider, organization and repository if the project is a git repository.
|
||||
|
||||
## Whenever a call to a Codacy tool that uses `repository` or `organization` as a parameter returns a 404 error
|
||||
- Offer to run the `codacy_setup_repository` tool to add the repository to Codacy
|
||||
- If the user accepts, run the `codacy_setup_repository` tool
|
||||
- Do not ever try to run the `codacy_setup_repository` tool on your own
|
||||
- After setup, immediately retry the action that failed (only retry once)
|
||||
---
|
||||
@@ -1,342 +1,512 @@
|
||||
name: Publish Workflow
|
||||
name: Analysis Workflow
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- '.gitignore'
|
||||
- 'LICENSE'
|
||||
- "**/*.md"
|
||||
- "**/*.pine"
|
||||
- "docs/**"
|
||||
- ".gitignore"
|
||||
- "LICENSE"
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- '.gitignore'
|
||||
- 'LICENSE'
|
||||
- "**/*.md"
|
||||
- "**/*.pine"
|
||||
- "docs/**"
|
||||
- ".gitignore"
|
||||
- "LICENSE"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: read # Allows SonarCloud to decorate PRs with analysis results
|
||||
security-events: write # Required for CodeQL analysis and uploading SARIF results
|
||||
permissions: {}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
DOTNET_VERSION: '8.x'
|
||||
DOTNET_VERSION: "10.x"
|
||||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||
DOTNET_NOLOGO: true
|
||||
|
||||
# IMPORTANT: analyze the same commit we report to Codacy
|
||||
CHECKOUT_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||
COMMIT_UUID: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
||||
|
||||
jobs:
|
||||
Code_Coverage:
|
||||
timeout-minutes: 30
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_VERSION }}
|
||||
|
||||
- name: Cache NuGet packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.nuget/packages
|
||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||
restore-keys: ${{ runner.os }}-nuget-
|
||||
|
||||
- name: Cache dotnet tools
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.dotnet/tools
|
||||
key: ${{ runner.os }}-dotnet-tools-${{ hashFiles('**/*.csproj') }}
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Cache SonarCloud scanner
|
||||
id: cache-sonar-scanner
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .\.sonar\scanner
|
||||
key: ${{ runner.os }}-sonar-scanner
|
||||
restore-keys: ${{ runner.os }}-sonar-scanner
|
||||
|
||||
- name: Install dotnet tools
|
||||
run: |
|
||||
dotnet tool install JetBrains.dotCover.GlobalTool --global
|
||||
dotnet tool install dotnet-sonarscanner --global
|
||||
dotnet tool install dotnet-coverage --global
|
||||
dotnet tool install --global coverlet.console
|
||||
dotnet tool install --global dotnet-reportgenerator-globaltool
|
||||
dotnet restore
|
||||
|
||||
- name: Begin SonarCloud Analysis
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
shell: powershell
|
||||
run: |
|
||||
dotnet sonarscanner begin /k:"mihakralj_QuanTAlib" /o:"mihakralj-quantalib" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" `
|
||||
/d:sonar.solution.file="QuanTAlib.sln" `
|
||||
/d:sonar.cs.opencover.reportsPaths="**/*cover*.xml" `
|
||||
/d:sonar.cs.dotcover.reportsPaths="**/dotcover.xml" `
|
||||
/d:sonar.coverage.exclusions="**Tests.cs,**/*.md,**/*.html,**/*.css,**/docs/**/*,**/archive/**/*,**/notebooks/**/*,**/obj/**/*,**/bin/**/*" `
|
||||
/d:sonar.exclusions="**/TestResults/**/*,**/bin/**/*,**/obj/**/*,**/*.html,**/coverage/**/*,**/CoverageReport/**/*,**/*.md,**/*.css,**/docs/**/*,**/archive/**/*,**/notebooks/**/*" `
|
||||
/d:sonar.test.exclusions="**Tests.cs,**/obj/**/*,**/bin/**/*" `
|
||||
/d:sonar.cpd.exclusions="**Tests.cs" `
|
||||
/d:sonar.scanner.scanAll="false" `
|
||||
/d:sonar.cs.roslyn.ignoreIssues="false" `
|
||||
/d:sonar.issue.ignore.multicriteria="e1" `
|
||||
/d:sonar.issue.ignore.multicriteria.e1.ruleKey="csharpsquid:S1944,csharpsquid:S2053,csharpsquid:S2222,csharpsquid:S2259,csharpsquid:S2583,csharpsquid:S2589,csharpsquid:S3329,csharpsquid:S3655,csharpsquid:S3900,csharpsquid:S3949,csharpsquid:S3966,csharpsquid:S4158,csharpsquid:S4347,csharpsquid:S5773,csharpsquid:S6781" `
|
||||
/d:sonar.issue.ignore.multicriteria.e1.resourceKey="**/*.cs" `
|
||||
/d:sonar.verbose="true"
|
||||
|
||||
- name: Build Projects
|
||||
id: build
|
||||
continue-on-error: true
|
||||
run: |
|
||||
dotnet build --no-restore --configuration Debug
|
||||
dotnet build ./lib/quantalib.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Averages/_Averages.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Statistics/_Statistics.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Volatility/_Volatility.csproj --configuration Release --nologo
|
||||
dotnet build ./SyntheticVendor/SyntheticVendor.csproj --configuration Release --nologo
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error "Build failed" }
|
||||
|
||||
- name: Check Build Status
|
||||
if: steps.build.outcome == 'failure'
|
||||
run: exit 1
|
||||
|
||||
- name: Run Tests with Coverage
|
||||
id: tests
|
||||
continue-on-error: true
|
||||
run: |
|
||||
dotnet test --no-build --configuration Debug /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
|
||||
dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml"
|
||||
dotnet dotcover test Tests/Tests.csproj --dcReportType=HTML --dcoutput=./dotcover.html
|
||||
dotnet dotcover test Tests/Tests.csproj --dcReportType=DetailedXML --dcoutput=./dotcover.xml --verbosity=Detailed
|
||||
dotnet test -p:CollectCoverage=true --collect:"XPlat Code Coverage" --results-directory "./"
|
||||
|
||||
- name: Generate Coverage Report
|
||||
run: |
|
||||
reportgenerator -reports:*cover*.xml -targetdir:./coverage-report
|
||||
|
||||
- name: Upload Coverage Reports
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coverage-reports
|
||||
path: |
|
||||
**/TestResults
|
||||
**/coverage-report
|
||||
**/*cover*.xml
|
||||
**/dotcover.*
|
||||
|
||||
- name: End SonarCloud Analysis
|
||||
if: always()
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
shell: powershell
|
||||
run: dotnet sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}"
|
||||
|
||||
- name: Upload Coverage to Codacy
|
||||
uses: codacy/codacy-coverage-reporter-action@v1
|
||||
with:
|
||||
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
coverage-reports: '*cover*.xml'
|
||||
|
||||
- name: Upload Coverage to Codecov
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: 'cover*'
|
||||
verbose: true
|
||||
|
||||
CodeQL:
|
||||
timeout-minutes: 30
|
||||
# ==============================================================================
|
||||
# 1) ReSharper InspectCode -> SARIF artifact
|
||||
# ==============================================================================
|
||||
ReSharper_Analysis:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
permissions:
|
||||
security-events: write
|
||||
actions: read
|
||||
contents: read
|
||||
|
||||
actions: write
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ env.CHECKOUT_REF }}
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_VERSION }}
|
||||
|
||||
- name: Cache NuGet packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.nuget/packages
|
||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||
restore-keys: ${{ runner.os }}-nuget-
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: 'csharp'
|
||||
queries: security-and-quality
|
||||
config-file: ./.github/codeql/codeql-config.yml
|
||||
tools: linked
|
||||
cache: true
|
||||
cache-dependency-path: |
|
||||
**/packages.lock.json
|
||||
**/*.csproj
|
||||
**/*.sln
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Build
|
||||
run: dotnet build --no-restore --configuration Debug
|
||||
- name: Prepare SARIF directory
|
||||
run: mkdir -p .sarif
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
- name: Install JetBrains ReSharper GlobalTools
|
||||
run: |
|
||||
dotnet tool update --global JetBrains.ReSharper.GlobalTools || \
|
||||
dotnet tool install --global JetBrains.ReSharper.GlobalTools
|
||||
echo "$HOME/.dotnet/tools" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Run ReSharper InspectCode (SARIF)
|
||||
run: |
|
||||
set +e
|
||||
jb inspectcode QuanTAlib.sln \
|
||||
--format=sarif \
|
||||
--output=.sarif/resharper.sarif
|
||||
rc=$?
|
||||
set -e
|
||||
|
||||
# jb may return non-zero for findings/config; missing SARIF is the real failure signal
|
||||
if [ ! -f ".sarif/resharper.sarif" ]; then
|
||||
echo "ERROR: ReSharper SARIF not generated (exit code: $rc)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "ReSharper SARIF generated (exit code: $rc)"
|
||||
ls -lh .sarif/resharper.sarif
|
||||
|
||||
- name: Upload SARIF artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
output: results
|
||||
upload: true
|
||||
name: sarif-resharper
|
||||
path: .sarif/resharper.sarif
|
||||
retention-days: 7
|
||||
|
||||
- name: Run Snyk to check for vulnerabilities
|
||||
uses: snyk/actions/dotnet@master
|
||||
continue-on-error: true
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
LD_PRELOAD: '' # Clear the LD_PRELOAD to avoid CodeQL conflicts
|
||||
with:
|
||||
args: |
|
||||
--file=./lib/quantalib.csproj
|
||||
--severity-threshold=low
|
||||
--detection-depth=4
|
||||
--package-manager=nuget
|
||||
|
||||
- name: Run Snyk on Solution
|
||||
uses: snyk/actions/dotnet@master
|
||||
if: always()
|
||||
continue-on-error: true
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
LD_PRELOAD: ''
|
||||
with:
|
||||
args: |
|
||||
--file=QuanTAlib.sln
|
||||
--all-projects
|
||||
--detection-depth=4
|
||||
|
||||
- name: Run Snyk IaC
|
||||
uses: snyk/actions/iac@master
|
||||
continue-on-error: true
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
LD_PRELOAD: ''
|
||||
with:
|
||||
args: |
|
||||
--severity-threshold=low
|
||||
|
||||
build_publish:
|
||||
timeout-minutes: 20
|
||||
needs: [Code_Coverage, CodeQL]
|
||||
if: |
|
||||
success() &&
|
||||
(github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev')) ||
|
||||
github.event_name == 'workflow_dispatch'
|
||||
# ==============================================================================
|
||||
# 2) Snyk Security Scan -> SARIF artifact
|
||||
# ==============================================================================
|
||||
Snyk_Scan:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ env.CHECKOUT_REF }}
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_VERSION }}
|
||||
cache: true
|
||||
cache-dependency-path: |
|
||||
**/packages.lock.json
|
||||
**/*.csproj
|
||||
**/*.sln
|
||||
|
||||
- name: Install GitVersion
|
||||
uses: gittools/actions/gitversion/setup@v0
|
||||
with:
|
||||
versionSpec: '6.x'
|
||||
includePrerelease: true
|
||||
- name: Install Snyk CLI
|
||||
uses: snyk/actions/setup@806182742461562b67788a64410098c9d9b96adb
|
||||
|
||||
- name: Determine Version
|
||||
id: gitversion
|
||||
uses: gittools/actions/gitversion/execute@v0
|
||||
with:
|
||||
useConfigFile: true
|
||||
updateAssemblyInfo: false
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Cache NuGet packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.nuget/packages
|
||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||
restore-keys: ${{ runner.os }}-nuget-
|
||||
- name: Prepare SARIF directory
|
||||
run: mkdir -p .sarif
|
||||
|
||||
- name: Build projects
|
||||
run: |
|
||||
dotnet restore
|
||||
dotnet build ./lib/quantalib.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Averages/_Averages.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Statistics/_Statistics.csproj --configuration Release --nologo
|
||||
dotnet build ./quantower/Volatility/_Volatility.csproj --configuration Release --nologo
|
||||
dotnet build ./SyntheticVendor/SyntheticVendor.csproj --configuration Release --nologo
|
||||
|
||||
- name: Create or Update Development Release
|
||||
if: github.ref == 'refs/heads/dev'
|
||||
- name: Run Snyk Security Scan (SARIF)
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
run: |
|
||||
gh release delete development --yes || true
|
||||
gh release create development \
|
||||
--title "Development Build" \
|
||||
--notes "Latest development build from commit ${{ github.sha }}" \
|
||||
--prerelease \
|
||||
--target ${{ github.sha }} \
|
||||
lib/bin/Release/QuanTAlib.dll \
|
||||
quantower/Averages/bin/Release/Averages.dll \
|
||||
quantower/Statistics/bin/Release/Statistics.dll \
|
||||
quantower/Volatility/bin/Release/Volatility.dll \
|
||||
SyntheticVendor/bin/Release/SyntheticVendor.dll
|
||||
if [ -z "${SNYK_TOKEN:-}" ]; then
|
||||
echo "SNYK_TOKEN not set. Skipping Snyk scan."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- name: Push prerelease package to myget.org
|
||||
if: github.ref == 'refs/heads/dev'
|
||||
continue-on-error: true
|
||||
id: myget-push
|
||||
run: |
|
||||
dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' \
|
||||
--source https://www.myget.org/F/quantalib/api/v3/index.json \
|
||||
--force-english-output \
|
||||
--api-key ${{ secrets.MYGET_DEPLOY_KEY_QUANTALIB }}
|
||||
set +e
|
||||
snyk test --all-projects --sarif-file-output=.sarif/snyk.sarif
|
||||
rc=$?
|
||||
set -e
|
||||
|
||||
- name: Create GitHub Release
|
||||
if: github.ref == 'refs/heads/main'
|
||||
# Snyk exit codes: 0 = no issues, 1 = issues found, >1 = error
|
||||
if [ $rc -gt 1 ]; then
|
||||
echo "ERROR: Snyk scan failed (exit code: $rc)"
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
if [ ! -f ".sarif/snyk.sarif" ]; then
|
||||
echo "ERROR: Snyk SARIF not generated"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Snyk SARIF generated (exit code: $rc)"
|
||||
ls -lh .sarif/snyk.sarif
|
||||
|
||||
- name: Upload SARIF artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sarif-snyk
|
||||
path: .sarif/snyk.sarif
|
||||
retention-days: 7
|
||||
if-no-files-found: warn
|
||||
|
||||
# ==============================================================================
|
||||
# 3) Semgrep Security Scan -> SARIF artifact
|
||||
# ==============================================================================
|
||||
Semgrep_Scan:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
security-events: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ env.CHECKOUT_REF }}
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
|
||||
- name: Prepare SARIF directory
|
||||
run: mkdir -p .sarif
|
||||
|
||||
- name: Run Semgrep (SARIF)
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
|
||||
run: |
|
||||
gh release create v${{ steps.gitversion.outputs.MajorMinorPatch }} \
|
||||
--title "Release from commit ${{ steps.gitversion.outputs.MajorMinorPatch }}" \
|
||||
--notes "Release notes for this version." \
|
||||
quantower/Averages/bin/Release/Averages.dll \
|
||||
quantower/Statistics/bin/Release/Statistics.dll \
|
||||
quantower/Volatility/bin/Release/Volatility.dll \
|
||||
SyntheticVendor/bin/Release/SyntheticVendor.dll
|
||||
pip install --quiet semgrep
|
||||
|
||||
- name: Push release package to nuget.org
|
||||
if: ${{ github.ref == 'refs/heads/main' }}
|
||||
set +e
|
||||
if [ -n "${SEMGREP_APP_TOKEN:-}" ]; then
|
||||
echo "Running Semgrep with managed policies..."
|
||||
semgrep ci --sarif --output=.sarif/semgrep.sarif
|
||||
else
|
||||
echo "Running Semgrep with OSS rules..."
|
||||
semgrep scan \
|
||||
--config=auto \
|
||||
--sarif \
|
||||
--output=.sarif/semgrep.sarif \
|
||||
--exclude='**/bin/**' \
|
||||
--exclude='**/obj/**' \
|
||||
--exclude='**/*.Tests.cs' \
|
||||
--exclude='**/Mocks/**' \
|
||||
--exclude='**/perf/**' \
|
||||
--exclude='**/quantower/**' \
|
||||
.
|
||||
fi
|
||||
rc=$?
|
||||
set -e
|
||||
|
||||
if [ -f ".sarif/semgrep.sarif" ]; then
|
||||
echo "Semgrep SARIF generated (exit code: $rc):"
|
||||
ls -lh .sarif/semgrep.sarif
|
||||
else
|
||||
echo "WARNING: Semgrep SARIF not generated"
|
||||
fi
|
||||
|
||||
- name: Upload SARIF artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sarif-semgrep
|
||||
path: .sarif/semgrep.sarif
|
||||
retention-days: 7
|
||||
if-no-files-found: warn
|
||||
|
||||
# ==============================================================================
|
||||
# 4) Build, Test, Coverage, SonarCloud & Roslyn SARIF
|
||||
# ==============================================================================
|
||||
Sonar_Analysis:
|
||||
needs: [ReSharper_Analysis, Snyk_Scan, Semgrep_Scan]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
pull-requests: read
|
||||
checks: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ env.CHECKOUT_REF }}
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_VERSION }}
|
||||
cache: true
|
||||
cache-dependency-path: |
|
||||
**/packages.lock.json
|
||||
**/*.csproj
|
||||
**/*.sln
|
||||
|
||||
- name: Set up JDK 17 (for SonarCloud)
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: zulu
|
||||
|
||||
- name: Install Tools
|
||||
run: |
|
||||
dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' \
|
||||
--source https://api.nuget.org/v3/index.json \
|
||||
--skip-duplicate \
|
||||
--api-key ${{ secrets.NUGET_DEPLOY_KEY_QUANTLIB }}
|
||||
dotnet tool install --global dotnet-reportgenerator-globaltool
|
||||
dotnet tool install --global dotnet-sonarscanner
|
||||
echo "$HOME/.dotnet/tools" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Check for SonarCloud token
|
||||
id: check_sonar
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
run: |
|
||||
if [ -z "${SONAR_TOKEN:-}" ]; then
|
||||
echo "SONAR_TOKEN not set. Skipping SonarCloud."
|
||||
echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Prepare SARIF directory
|
||||
run: mkdir -p .sarif
|
||||
|
||||
- name: Download External SARIFs
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: sarif-*
|
||||
path: .sarif
|
||||
merge-multiple: true
|
||||
|
||||
- name: Build SARIF list for SonarCloud
|
||||
run: |
|
||||
# Keep SonarCloud focused on its native analyzers + security tools.
|
||||
# Importing compiler/analyzer SARIF (Roslyn/JetBrains) tends to explode "External issues".
|
||||
paths=()
|
||||
for f in .sarif/snyk.sarif .sarif/semgrep.sarif; do
|
||||
if [ -f "$f" ]; then
|
||||
paths+=("$f")
|
||||
fi
|
||||
done
|
||||
|
||||
IFS=,
|
||||
echo "SONAR_SARIF_PATHS=${paths[*]}" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Begin SonarCloud Analysis
|
||||
if: steps.check_sonar.outputs.skip != 'true'
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
run: |
|
||||
args=(
|
||||
"/k:mihakralj_QuanTAlib"
|
||||
"/o:mihakralj-quantalib"
|
||||
"/d:sonar.token=$SONAR_TOKEN"
|
||||
"/d:sonar.host.url=https://sonarcloud.io"
|
||||
"/d:sonar.cs.opencover.reportsPaths=TestResults/**/coverage.opencover.xml"
|
||||
"/d:sonar.cs.vstest.reportsPaths=TestResults/**/*.trx"
|
||||
"/d:sonar.coverage.exclusions=**Tests.cs,**/*.md,**/*.html,**/*.css,**/docs/**/*,**/archive/**/*,**/notebooks/**/*,**/obj/**/*,**/bin/**/*"
|
||||
"/d:sonar.exclusions=**/TestResults/**/*,**/bin/**/*,**/obj/**/*,**/*.html,**/coverage/**/*,**/CoverageReport/**/*,**/*.md,**/*.css,**/docs/**/*,**/archive/**/*,**/notebooks/**/*"
|
||||
"/d:sonar.test.exclusions=**Tests.cs,**/obj/**/*,**/bin/**/*"
|
||||
"/d:sonar.scanner.scanAll=false"
|
||||
)
|
||||
|
||||
if [ -n "${SONAR_SARIF_PATHS:-}" ]; then
|
||||
args+=("/d:sonar.sarifReportPaths=$SONAR_SARIF_PATHS")
|
||||
fi
|
||||
|
||||
dotnet sonarscanner begin "${args[@]}"
|
||||
|
||||
- name: Build Solution with Roslyn SARIF
|
||||
run: |
|
||||
dotnet build QuanTAlib.sln \
|
||||
--no-restore \
|
||||
--configuration Debug \
|
||||
--nologo \
|
||||
-m:1 \
|
||||
-p:TreatWarningsAsErrors=false \
|
||||
-p:ErrorLog="$(pwd)/.sarif/roslyn.sarif;version=2.1"
|
||||
|
||||
- name: Run Tests with Coverage
|
||||
run: |
|
||||
dotnet test QuanTAlib.sln \
|
||||
--no-build \
|
||||
--configuration Debug \
|
||||
--collect:"XPlat Code Coverage;Format=opencover,cobertura,lcov" \
|
||||
--results-directory ./TestResults \
|
||||
--logger "trx;LogFileName=test_results.trx"
|
||||
|
||||
- name: Merge Coverage Reports
|
||||
run: |
|
||||
mkdir -p coverage-merged
|
||||
|
||||
reportgenerator \
|
||||
"-reports:TestResults/**/coverage.opencover.xml;TestResults/**/coverage.cobertura.xml;TestResults/**/coverage.info" \
|
||||
"-targetdir:coverage-merged" \
|
||||
"-reporttypes:Cobertura;lcov"
|
||||
|
||||
echo "Merged coverage outputs:"
|
||||
ls -la coverage-merged || true
|
||||
|
||||
if [ ! -f "coverage-merged/Cobertura.xml" ]; then
|
||||
echo "ERROR: Cobertura.xml not generated (Codacy coverage will be missing)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: End SonarCloud Analysis
|
||||
if: steps.check_sonar.outputs.skip != 'true'
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
run: dotnet sonarscanner end /d:sonar.token="$SONAR_TOKEN"
|
||||
|
||||
- name: Upload Coverage Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coverage-reports
|
||||
path: coverage-merged/
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload Roslyn SARIF Artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sarif-roslyn
|
||||
path: .sarif/roslyn.sarif
|
||||
retention-days: 7
|
||||
if-no-files-found: warn
|
||||
|
||||
# ==============================================================================
|
||||
# 5) Codacy Upload (SARIF + Coverage)
|
||||
# ==============================================================================
|
||||
Codacy_Upload:
|
||||
needs: [ReSharper_Analysis, Snyk_Scan, Semgrep_Scan, Sonar_Analysis]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
if: always()
|
||||
steps:
|
||||
- name: Check for Codacy token
|
||||
id: check_token
|
||||
env:
|
||||
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
run: |
|
||||
if [ -z "${CODACY_PROJECT_TOKEN:-}" ]; then
|
||||
echo "CODACY_PROJECT_TOKEN not set. Skipping Codacy uploads."
|
||||
echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Download SARIF artifacts
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: sarif-*
|
||||
path: sarif
|
||||
|
||||
- name: Download Coverage Reports
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: coverage-reports
|
||||
path: coverage-merged
|
||||
|
||||
- name: List artifacts
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
run: |
|
||||
echo "SARIF files:"
|
||||
find sarif -name "*.sarif" -type f -maxdepth 4 -print -exec ls -lh {} \; || true
|
||||
echo ""
|
||||
echo "Coverage files:"
|
||||
ls -la coverage-merged || true
|
||||
|
||||
- name: Install Codacy CLI v2
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# Install Codacy CLI using official bootstrap script
|
||||
echo "Installing Codacy CLI v2..."
|
||||
|
||||
sudo curl -Ls https://raw.githubusercontent.com/codacy/codacy-cli-v2/main/codacy-cli.sh -o /usr/local/bin/codacy-cli
|
||||
sudo chmod +x /usr/local/bin/codacy-cli
|
||||
|
||||
# Script will fetch binary if needed
|
||||
codacy-cli version
|
||||
|
||||
- name: Upload SARIF files to Codacy
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
env:
|
||||
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
shopt -s nullglob globstar
|
||||
files=(sarif/**/*.sarif)
|
||||
|
||||
if [ ${#files[@]} -eq 0 ]; then
|
||||
echo "No SARIF files found. Nothing to upload."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Uploading ${#files[@]} SARIF file(s) to Codacy with commit: ${COMMIT_UUID}"
|
||||
for sarif_file in "${files[@]}"; do
|
||||
echo "--- Uploading: $sarif_file ---"
|
||||
# Using short flags per codacy-cli-v2 docs:
|
||||
# -s: SARIF file path
|
||||
# -c: commit UUID
|
||||
# -t: project token
|
||||
codacy-cli upload \
|
||||
-s "$sarif_file" \
|
||||
-c "$COMMIT_UUID" \
|
||||
-t "$CODACY_PROJECT_TOKEN" \
|
||||
|| echo "WARNING: failed to upload $sarif_file"
|
||||
done
|
||||
|
||||
- name: Upload Coverage to Codacy
|
||||
if: steps.check_token.outputs.skip != 'true'
|
||||
env:
|
||||
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
curl -Ls https://coverage.codacy.com/get.sh -o codacy-coverage.sh
|
||||
chmod +x codacy-coverage.sh
|
||||
|
||||
if [ -f "coverage-merged/Cobertura.xml" ]; then
|
||||
./codacy-coverage.sh report -r "coverage-merged/Cobertura.xml"
|
||||
else
|
||||
echo "Cobertura.xml not found. Skipping coverage upload."
|
||||
fi
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
name: Release Workflow
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
# inputs:
|
||||
# release_type:
|
||||
# description: "Release type"
|
||||
# type: choice
|
||||
# options:
|
||||
# - development
|
||||
# - production
|
||||
# default: development
|
||||
|
||||
permissions: {}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
DOTNET_VERSION: "10.x"
|
||||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||
DOTNET_NOLOGO: true
|
||||
|
||||
jobs:
|
||||
# ==============================================================================
|
||||
# Publish Package (manual trigger only)
|
||||
# ==============================================================================
|
||||
Publish_Package:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET SDK
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_VERSION }}
|
||||
cache: true
|
||||
cache-dependency-path: |
|
||||
**/packages.lock.json
|
||||
**/*.csproj
|
||||
**/*.sln
|
||||
|
||||
- name: Install GitVersion
|
||||
uses: gittools/actions/gitversion/setup@v4.2.0
|
||||
with:
|
||||
versionSpec: "6.x"
|
||||
includePrerelease: true
|
||||
|
||||
- name: Determine Version
|
||||
id: gitversion
|
||||
uses: gittools/actions/gitversion/execute@v4.2.0
|
||||
with:
|
||||
updateAssemblyInfo: false
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
dotnet build ./lib/quantalib.csproj --configuration Release --no-restore --nologo
|
||||
dotnet build ./quantower/Momentum.csproj --configuration Release --no-restore --nologo
|
||||
dotnet build ./quantower/Trends.csproj --configuration Release --no-restore --nologo
|
||||
dotnet build ./quantower/Volume.csproj --configuration Release --no-restore --nologo
|
||||
|
||||
- name: Pack NuGet
|
||||
run: |
|
||||
dotnet pack ./lib/quantalib.csproj \
|
||||
--configuration Release \
|
||||
--no-build \
|
||||
-p:ContinuousIntegrationBuild=true \
|
||||
-p:PackageVersion=${{ steps.gitversion.outputs.SemVer }}
|
||||
|
||||
ls -lh lib/bin/Release/*.nupkg || true
|
||||
|
||||
- name: Create Development Release
|
||||
if: inputs.release_type == 'development'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release delete development --yes 2>/dev/null || true
|
||||
git push --delete origin refs/tags/development 2>/dev/null || true
|
||||
|
||||
gh release create development \
|
||||
--title "Development Build" \
|
||||
--notes "Latest development build from commit ${{ github.sha }}" \
|
||||
--prerelease \
|
||||
--target ${{ github.sha }} \
|
||||
lib/bin/Release/*.nupkg \
|
||||
lib/bin/Release/**/QuanTAlib.dll \
|
||||
quantower/bin/Release/**/*.dll
|
||||
|
||||
- name: Push to MyGet
|
||||
if: inputs.release_type == 'development'
|
||||
continue-on-error: true
|
||||
env:
|
||||
MYGET_API_KEY: ${{ secrets.MYGET_DEPLOY_KEY_QUANTALIB }}
|
||||
run: |
|
||||
if [ -z "${MYGET_API_KEY:-}" ]; then
|
||||
echo "MYGET_DEPLOY_KEY_QUANTALIB not set. Skipping."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
dotnet nuget push 'lib/bin/Release/*.nupkg' \
|
||||
--source https://www.myget.org/F/quantalib/api/v3/index.json \
|
||||
--skip-duplicate \
|
||||
--api-key "$MYGET_API_KEY"
|
||||
|
||||
- name: Create GitHub Release
|
||||
if: inputs.release_type == 'production'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release create "v${{ steps.gitversion.outputs.MajorMinorPatch }}" \
|
||||
--title "Release ${{ steps.gitversion.outputs.MajorMinorPatch }}" \
|
||||
--generate-notes \
|
||||
lib/bin/Release/*.nupkg \
|
||||
quantower/bin/Release/**/*.dll
|
||||
|
||||
- name: Push to NuGet
|
||||
if: inputs.release_type == 'production'
|
||||
env:
|
||||
NUGET_API_KEY: ${{ secrets.NUGET_DEPLOY_KEY_QUANTLIB }}
|
||||
run: |
|
||||
if [ -z "${NUGET_API_KEY:-}" ]; then
|
||||
echo "NUGET_DEPLOY_KEY_QUANTLIB not set. Failing publish."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dotnet nuget push 'lib/bin/Release/*.nupkg' \
|
||||
--source https://api.nuget.org/v3/index.json \
|
||||
--skip-duplicate \
|
||||
--api-key "$NUGET_API_KEY"
|
||||
@@ -0,0 +1,54 @@
|
||||
name: Deploy Docsify to GitHub Pages
|
||||
|
||||
on:
|
||||
#push:
|
||||
# branches: ["main"]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v5
|
||||
with:
|
||||
# Explicitly disable Jekyll
|
||||
enabler_jekyll: false
|
||||
|
||||
- name: List files (Debug)
|
||||
run: ls -R
|
||||
|
||||
- name: Ensure .nojekyll exists in root
|
||||
run: |
|
||||
if [ ! -f .nojekyll ]; then
|
||||
echo "Creating .nojekyll file"
|
||||
touch .nojekyll
|
||||
else
|
||||
echo ".nojekyll already exists"
|
||||
fi
|
||||
ls -la .nojekyll
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
# Upload entire repository so Docsify can access 'lib/' and other root files
|
||||
path: '.'
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
@@ -1,398 +1,60 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.tlog
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||
*.vbp
|
||||
|
||||
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||
*.dsw
|
||||
*.dsp
|
||||
|
||||
# Visual Studio 6 technical files
|
||||
*.ncb
|
||||
*.aps
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# Visual Studio History (VSHistory) files
|
||||
.vshistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# VS Code files for those working on multiple tools
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Windows Installer files from build outputs
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# JetBrains Rider
|
||||
*.sln.iml
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
!lib/numerics/log/
|
||||
|
||||
# Visual Studio cache/options
|
||||
.vs/
|
||||
.vscode/
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
*.snupkg
|
||||
**/packages/*
|
||||
!**/packages/build/
|
||||
|
||||
# Test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
*.trx
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NDepend
|
||||
ndepend/NDependOut/
|
||||
ndepend/coverage/
|
||||
|
||||
# BenchmarkDotNet
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# Temporary files and agent workspace
|
||||
temp/
|
||||
.temp/
|
||||
*.tmp
|
||||
*.temp
|
||||
.sarif/
|
||||
_site/
|
||||
docfx/
|
||||
|
||||
#Ignore vscode AI rules
|
||||
.github\instructions\codacy.instructions.md
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"sonarCloudOrganization": "mihakralj-quantalib",
|
||||
"projectKey": "mihakralj_QuanTAlib"
|
||||
}
|
||||
"projectKey": "mihakralj_QuanTAlib",
|
||||
"region": "EU"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"ms-dotnettools.csdevkit",
|
||||
"ms-dotnettools.csharp",
|
||||
"ms-dotnettools.dotnet-interactive-vscode",
|
||||
"bierner.markdown-mermaid",
|
||||
"visualstudioexptteam.vscodeintellicode",
|
||||
"SonarSource.sonarlint-vscode"
|
||||
]
|
||||
}
|
||||
@@ -1,33 +1,33 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Tests",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
"program": "dotnet",
|
||||
"args": [
|
||||
"test",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"--no-build"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"stopAtEntry": false,
|
||||
"console": "internalConsole",
|
||||
"logging": {
|
||||
"moduleLoad": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug Library",
|
||||
"type": "coreclr",
|
||||
"request": "attach",
|
||||
"processId": "${command:pickProcess}",
|
||||
"justMyCode": true,
|
||||
"logging": {
|
||||
"moduleLoad": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Tests",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
"program": "dotnet",
|
||||
"args": [
|
||||
"test",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"--no-build"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"stopAtEntry": false,
|
||||
"console": "internalConsole",
|
||||
"logging": {
|
||||
"moduleLoad": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug Library",
|
||||
"type": "coreclr",
|
||||
"request": "attach",
|
||||
"processId": "${command:pickProcess}",
|
||||
"justMyCode": true,
|
||||
"logging": {
|
||||
"moduleLoad": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,23 +1,206 @@
|
||||
{
|
||||
"sonarlint.connectedMode.connections.sonarcloud": [
|
||||
{
|
||||
"organizationKey": "mihakralj",
|
||||
"token": "6df7cd62a17dc4e1c5532df1da2f49d5a977dd50",
|
||||
"connectionId": "mihakralj"
|
||||
}
|
||||
],
|
||||
"sarif-viewer.connectToGithubCodeScanning": "on",
|
||||
"omnisharp.useModernNet": true,
|
||||
"sonarlint.connectedMode.project": {
|
||||
"connectionId": "mihakralj",
|
||||
"projectKey": "mihakralj_QuanTAlib"
|
||||
},
|
||||
"dotnet.backgroundAnalysis.analyzerDiagnosticsScope": "fullSolution",
|
||||
"dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
|
||||
"dotnetAcquisitionExtension.enableTelemetry": false,
|
||||
"dotnet-test-explorer.testProjectPath": "Tests",
|
||||
"dotnet-test-explorer.autoWatch": true,
|
||||
"dotnet-test-explorer.showCodeLens": true,
|
||||
"dotnet-test-explorer.testArguments": "/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=./TestResults/coverage.cobertura.xml"
|
||||
// ???????????????????????????????????????????????????????????????????
|
||||
// GitHub Copilot Settings for QuanTAlib Workspace
|
||||
// Optimized for high-performance financial library development
|
||||
// ???????????????????????????????????????????????????????????????????
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Copilot Core Settings
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// Enable Copilot completions (suggestions appear automatically)
|
||||
"github.copilot.editor.enableAutoCompletions": true,
|
||||
|
||||
// Enable Copilot for all file types
|
||||
"github.copilot.enable": {
|
||||
"*": true,
|
||||
"plaintext": false,
|
||||
"markdown": true,
|
||||
"scminput": false
|
||||
},
|
||||
|
||||
// Show inline suggestions
|
||||
"editor.inlineSuggest.enabled": true,
|
||||
|
||||
// Always show the inline suggestion toolbar
|
||||
"editor.inlineSuggest.showToolbar": "always",
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Copilot Chat Settings (Manual Review Required)
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// DO NOT auto-apply chat edits - require manual review for quality control
|
||||
"chat.editing.autoApply": "off",
|
||||
|
||||
// Confirm before removing edit requests
|
||||
"chat.editing.confirmEditRequestRemoval": true,
|
||||
|
||||
// Show chat panel on the side
|
||||
"chat.editor.wordWrap": "on",
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Editor Settings for Productivity
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// Enable quick suggestions in all contexts
|
||||
"editor.quickSuggestions": {
|
||||
"other": true,
|
||||
"comments": true,
|
||||
"strings": true
|
||||
},
|
||||
|
||||
// Show suggestions on trigger characters
|
||||
"editor.suggestOnTriggerCharacters": true,
|
||||
|
||||
// Accept suggestion on commit character (like dot, parenthesis)
|
||||
"editor.acceptSuggestionOnCommitCharacter": true,
|
||||
|
||||
// Faster suggestion appearance
|
||||
"editor.quickSuggestionsDelay": 0,
|
||||
|
||||
// Show snippet suggestions with other suggestions
|
||||
"editor.snippetSuggestions": "inline",
|
||||
|
||||
// Tab key behavior
|
||||
"editor.tabCompletion": "on",
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// C# Specific Settings
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
"[csharp]": {
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnPaste": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"editor.quickSuggestions": {
|
||||
"other": true,
|
||||
"comments": true,
|
||||
"strings": true
|
||||
}
|
||||
},
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Performance & Quality Control
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// Save automatically (helps with Copilot context)
|
||||
"files.autoSave": "afterDelay",
|
||||
"files.autoSaveDelay": 1000,
|
||||
|
||||
// Show whitespace (important for performance-critical code)
|
||||
"editor.renderWhitespace": "boundary",
|
||||
|
||||
// Show inline parameter hints
|
||||
"editor.inlayHints.enabled": "on",
|
||||
|
||||
// Highlight matching brackets
|
||||
"editor.bracketPairColorization.enabled": true,
|
||||
"editor.guides.bracketPairs": true,
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Git Integration
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// Auto-fetch git changes
|
||||
"git.autofetch": true,
|
||||
|
||||
// Confirm before synchronizing
|
||||
"git.confirmSync": false,
|
||||
|
||||
// Show inline blame
|
||||
"git.decorations.enabled": true,
|
||||
|
||||
"terminal.integrated.shellIntegration.enabled": true,
|
||||
"terminal.integrated.suggest.enabled": true,
|
||||
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// File Exclusions (Reduce Noise)
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
"files.exclude": {
|
||||
"**/bin": true,
|
||||
"**/obj": true,
|
||||
"**/.vs": true,
|
||||
"**/node_modules": true,
|
||||
"**/.git": false
|
||||
},
|
||||
|
||||
"search.exclude": {
|
||||
"**/bin": true,
|
||||
"**/obj": true,
|
||||
"**/node_modules": true,
|
||||
"**/.vs": true,
|
||||
"**/coverage": true
|
||||
},
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// .NET Specific Settings
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
"omnisharp.enableEditorConfigSupport": true,
|
||||
"omnisharp.enableRoslynAnalyzers": true,
|
||||
"dotnet.backgroundAnalysis.enabled": true,
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Testing Integration
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
"dotnet.defaultSolution": "QuanTAlib.sln",
|
||||
"dotnet.testController.enabled": true,
|
||||
"dotnet.unitTests.runSettingsPath": ".config/coverage.runsettings",
|
||||
"dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
|
||||
"dotnet.server.useOmnisharp": false,
|
||||
|
||||
"sonarlint.connectedMode.project": {
|
||||
"connectionId": "mihakralj-quantalib",
|
||||
"projectKey": "mihakralj_QuanTAlib"
|
||||
},
|
||||
"coderabbit.agentType": "Cline",
|
||||
"qodana.pathPrefix": "",
|
||||
"qodana.args": ["--config", ".qodana/qodana.yaml"],
|
||||
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
// Terminal Settings
|
||||
// ?????????????????????????????????????????????????????????????????
|
||||
|
||||
// Set PowerShell 7 as the default terminal on Windows
|
||||
"terminal.integrated.defaultProfile.windows": "PowerShell",
|
||||
|
||||
// Terminal profiles for Windows
|
||||
"terminal.integrated.profiles.windows": {
|
||||
"PowerShell": {
|
||||
"source": "PowerShell",
|
||||
"icon": "terminal-powershell"
|
||||
},
|
||||
"Git Bash": {
|
||||
"path": "C:\\Program Files\\Git\\bin\\bash.exe",
|
||||
"icon": "terminal-bash"
|
||||
}
|
||||
},
|
||||
"qodana.projectId": "KbxmN",
|
||||
"github.copilot.mcpServers": {
|
||||
"code-to-tree": {
|
||||
"command": "C:\\github\\code-to-tree.exe"
|
||||
}
|
||||
}
|
||||
|
||||
// ???????????????????????????????????????????????????????????????????
|
||||
// Keyboard Shortcuts Reference
|
||||
// ???????????????????????????????????????????????????????????????????
|
||||
// Tab - Accept inline suggestion
|
||||
// Ctrl+? - Accept next word
|
||||
// Ctrl+Enter - Accept line
|
||||
// Esc - Dismiss suggestion
|
||||
// Alt+] - Next suggestion
|
||||
// Alt+[ - Previous suggestion
|
||||
// Ctrl+I - Open Copilot Chat
|
||||
//
|
||||
// Quality Control Reminders:
|
||||
// ? Review all Copilot suggestions for optimization patterns
|
||||
// ? Run tests after accepting: dotnet test
|
||||
// ? Check performance impact with benchmarks
|
||||
// ? Validate against reference implementations
|
||||
}
|
||||
|
||||
@@ -1,62 +1,61 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile",
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "test",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"test",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"--no-build",
|
||||
"--verbosity:normal"
|
||||
],
|
||||
"problemMatcher": "$msCompile",
|
||||
"group": {
|
||||
"kind": "test",
|
||||
"isDefault": true
|
||||
},
|
||||
"dependsOn": ["build"]
|
||||
},
|
||||
{
|
||||
"label": "test with coverage",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"test",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"/p:CollectCoverage=true",
|
||||
"/p:CoverletOutputFormat=lcov",
|
||||
"/p:CoverletOutput=./lcov.info",
|
||||
"--no-build"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "clean",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"clean",
|
||||
"${workspaceFolder}/QuanTAlib.sln"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Build & Audit (Roslyn + JetBrains)",
|
||||
"dependsOrder": "sequence",
|
||||
"dependsOn": ["Create .sarif Dir", "Build: QuanTAlib", "JetBrains: Inspect"],
|
||||
"group": { "kind": "build", "isDefault": true }
|
||||
},
|
||||
{
|
||||
"label": "Create .sarif Dir",
|
||||
"type": "shell",
|
||||
"command": "mkdir -p .sarif",
|
||||
"windows": {
|
||||
"command": "powershell",
|
||||
"args": ["-Command", "if (!(Test-Path .sarif)) { New-Item -Path .sarif -ItemType Directory }"]
|
||||
},
|
||||
"presentation": { "reveal": "silent" }
|
||||
},
|
||||
{
|
||||
"label": "Build: QuanTAlib",
|
||||
"type": "process",
|
||||
"command": "dotnet",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/QuanTAlib.sln",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "JetBrains: Inspect",
|
||||
"type": "shell",
|
||||
"command": "jb inspectcode QuanTAlib.sln --output=.sarif/jetbrains.sarif --format=Sarif",
|
||||
"presentation": { "reveal": "always" },
|
||||
"problemMatcher": [],
|
||||
"postLines": ["Analysis complete. Open .sarif/jetbrains.sarif to view results."]
|
||||
},
|
||||
{
|
||||
"label": "JetBrains: Cleanup",
|
||||
"type": "shell",
|
||||
"command": "jb cleanupcode QuanTAlib.sln",
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "test-net10",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"test",
|
||||
"${workspaceFolder}/lib/QuanTAlib.Tests.csproj",
|
||||
"--framework",
|
||||
"net10.0"
|
||||
],
|
||||
"problemMatcher": "$msCompile",
|
||||
"group": { "kind": "test", "isDefault": true },
|
||||
"presentation": { "reveal": "always", "panel": "new" }
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<LangVersion>preview</LangVersion>
|
||||
<NoWarn>$(NoWarn);NU1903;NU5104;NETSDK1057</NoWarn>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
@@ -12,50 +11,92 @@
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||
<OutputPath>bin\$(Configuration)\</OutputPath>
|
||||
<BaseIntermediateOutputPath>obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
|
||||
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
||||
<DebugType>full</DebugType>
|
||||
<PublishRepositoryUrl>true</PublishRepositoryUrl>
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<IsLocalBuild Condition="'$(GITHUB_ACTIONS)' == ''">true</IsLocalBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<PublishTrimmed>true</PublishTrimmed>
|
||||
<TrimMode>link</TrimMode>
|
||||
<PublishAot>true</PublishAot>
|
||||
<PublishReadyToRun>true</PublishReadyToRun>
|
||||
<TieredCompilation>true</TieredCompilation>
|
||||
<DebugType>portable</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
|
||||
<PublishSingleFile>true</PublishSingleFile>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<Deterministic>true</Deterministic>
|
||||
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
|
||||
<EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>
|
||||
<EventSourceSupport>false</EventSourceSupport>
|
||||
<HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>
|
||||
<InvariantGlobalization>true</InvariantGlobalization>
|
||||
<MetadataUpdaterSupport>false</MetadataUpdaterSupport>
|
||||
<UseSystemResourceKeys>true</UseSystemResourceKeys>
|
||||
|
||||
|
||||
<!-- AOT and Trim compatibility analyzers (build-time validation) -->
|
||||
<IsAotCompatible>true</IsAotCompatible>
|
||||
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<NoWarn>S1944,S2053,S2222,S2259,S2583,S2589,S3329,S3655,S3900,S3949,S3966,S4158,S4347,S5773,S6781</NoWarn>
|
||||
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
||||
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
||||
<TreatWarningsAsErrors Condition="'$(Configuration)' == 'Release'">true</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- SARIF 2.1 output for Roslyn analyzers - all projects -->
|
||||
<PropertyGroup>
|
||||
<SarifOutputDir>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), 'QuanTAlib.sln'))\.sarif</SarifOutputDir>
|
||||
<ErrorLog>$(SarifOutputDir)\$(MSBuildProjectName).sarif,version=2.1</ErrorLog>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target Name="CreateSarifDir" BeforeTargets="CoreCompile">
|
||||
<MakeDir Directories="$(SarifOutputDir)" Condition="!Exists('$(SarifOutputDir)')" />
|
||||
</Target>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>portable</DebugType>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<Deterministic>true</Deterministic>
|
||||
|
||||
<!-- Trim mode for library compatibility validation -->
|
||||
<TrimMode>link</TrimMode>
|
||||
|
||||
<!-- Runtime feature switches (reduce size when library is trimmed by consumer) -->
|
||||
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
|
||||
<EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>
|
||||
<InvariantGlobalization>true</InvariantGlobalization>
|
||||
|
||||
<!-- Suppress reflection-based serialization (faster startup, smaller footprint) -->
|
||||
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- S3604: "Remove member initializer" - null! is intentional for nullable reference types in Quantower adapters -->
|
||||
<NoWarn>$(NoWarn);S1144;S1944;S2053;S2245;S2259;S2583;S2589;S3329;S3604;S3655;S3776;S3949;S3966;S4158;S4347;S5773;S6781;MA0048;MA0051;MA0076;RCS1123;RCS1159;IDE0007</NoWarn>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Code Coverage Configuration (for NDepend integration) -->
|
||||
<PropertyGroup Condition="'$(IsTestProject)' == 'true'">
|
||||
<CollectCoverage>true</CollectCoverage>
|
||||
<CoverletOutputFormat>opencover</CoverletOutputFormat>
|
||||
<CoverletOutput>$(MSBuildProjectDirectory)/TestResults/</CoverletOutput>
|
||||
<ExcludeByFile>**/*.Designer.cs,**/*.g.cs,**/*.g.i.cs</ExcludeByFile>
|
||||
<Exclude>[xunit.*]*,[*.Tests]*</Exclude>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All"/>
|
||||
<PackageReference Include="Microsoft.DotNet.Interactive.Formatting" Version="1.0.0-beta.21459.1" />
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All"/>
|
||||
<PackageReference Include="GitVersion.MsBuild" Version="6.5.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="JetBrains.Annotations" Version="2025.2.4" />
|
||||
<PackageReference Include="Roslynator.Analyzers" Version="4.12.9">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="2.0.267">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="10.*">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(IsLocalBuild)' == 'true' AND $([MSBuild]::IsOSPlatform('Windows'))">
|
||||
<QuantowerRoot>D:\Quantower</QuantowerRoot>
|
||||
<QuantowerPath>$([System.IO.Directory]::GetDirectories("$(QuantowerRoot)\TradingPlatform", "v1*")[0])</QuantowerPath>
|
||||
<QuantowerRoot Condition="'$(QuantowerRoot)' == ''">Z:\Quantower</QuantowerRoot>
|
||||
<QuantowerPath Condition="Exists('$(QuantowerRoot)\TradingPlatform')">$([System.IO.Directory]::GetDirectories("$(QuantowerRoot)\TradingPlatform", "v1*")[0])</QuantowerPath>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -1,39 +1,32 @@
|
||||
workflow: GitHubFlow/v1
|
||||
assembly-versioning-scheme: MajorMinorPatch
|
||||
assembly-file-versioning-scheme: MajorMinorPatch
|
||||
major-version-bump-message: '\+semver:\s?(breaking|major)'
|
||||
minor-version-bump-message: '\+semver:\s?(feature|minor)'
|
||||
patch-version-bump-message: '\+semver:\s?(fix|patch)'
|
||||
no-bump-message: '\+semver:\s?(none|skip)'
|
||||
tag-prefix: '[vV]'
|
||||
semantic-version-format: Strict
|
||||
|
||||
major-version-bump-message: '(\+semver:\s?(breaking|major)|(breaking|major)(\(.*\))?:)'
|
||||
minor-version-bump-message: '(\+semver:\s?(feature|minor)|(feat|feature)(\(.*\))?:)'
|
||||
patch-version-bump-message: '(\+semver:\s?(fix|patch)|(fix|patch)(\(.*\))?:)'
|
||||
no-bump-message: '\+semver:\s?(none|skip)'
|
||||
branches:
|
||||
main:
|
||||
label: ''
|
||||
regex: ^main$
|
||||
mode: ContinuousDeployment
|
||||
label: ''
|
||||
increment: Patch
|
||||
prevent-increment:
|
||||
of-merged-branch: true
|
||||
track-merge-target: false
|
||||
track-merge-message: true
|
||||
is-release-branch: true
|
||||
is-main-branch: true
|
||||
pre-release-weight: 0
|
||||
|
||||
|
||||
dev:
|
||||
label: beta
|
||||
regex: ^dev(elop)?(ment)?$
|
||||
develop:
|
||||
mode: ContinuousDelivery
|
||||
label: alpha
|
||||
increment: Patch
|
||||
prevent-increment:
|
||||
when-current-commit-tagged: false
|
||||
track-merge-target: true
|
||||
is-release-branch: false
|
||||
source-branches: ['main']
|
||||
track-merge-message: true
|
||||
regex: ^dev(elop)?(ment)?$|.*-dev$
|
||||
source-branches:
|
||||
- main
|
||||
pre-release-weight: 30000
|
||||
|
||||
ignore:
|
||||
sha: []
|
||||
merge-message-formats: {}
|
||||
|
||||
@@ -1,201 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
@@ -1,86 +1,223 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "quantalib", "lib\quantalib.csproj", "{1E050FA4-630E-4801-9DE9-D2536DACA9B0}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "quantower", "quantower", "{1B9AC248-76F8-44DD-958D-F1DC08EE1E87}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Statistics", "quantower\Statistics\_Statistics.csproj", "{2E9427C7-144F-488E-A29D-789ACC1C32AE}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Averages", "quantower\Averages\_Averages.csproj", "{6BE10C39-4127-446C-818B-7976FCDD51D5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volatility", "quantower\Volatility\_Volatility.csproj", "{B7DC44F7-D3A3-4C70-9025-513E0182B646}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oscillators", "quantower\Oscillators\_Oscillators.csproj", "{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volume", "quantower\Volume\_Volume.csproj", "{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Momentum", "quantower\Momentum\_Momentum.csproj", "{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Experiments", "quantower\Experiments\_Experiments.csproj", "{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntheticVendor", "SyntheticVendor\SyntheticVendor.csproj", "{1CF111D9-33E6-4A11-8FEC-F23300A78D15}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{2D97C971-20BF-40DB-94AA-3279F787D3CB}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{1E050FA4-630E-4801-9DE9-D2536DACA9B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1E050FA4-630E-4801-9DE9-D2536DACA9B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1E050FA4-630E-4801-9DE9-D2536DACA9B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1E050FA4-630E-4801-9DE9-D2536DACA9B0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2E9427C7-144F-488E-A29D-789ACC1C32AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2E9427C7-144F-488E-A29D-789ACC1C32AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2E9427C7-144F-488E-A29D-789ACC1C32AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2E9427C7-144F-488E-A29D-789ACC1C32AE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6BE10C39-4127-446C-818B-7976FCDD51D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6BE10C39-4127-446C-818B-7976FCDD51D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6BE10C39-4127-446C-818B-7976FCDD51D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6BE10C39-4127-446C-818B-7976FCDD51D5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B7DC44F7-D3A3-4C70-9025-513E0182B646}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B7DC44F7-D3A3-4C70-9025-513E0182B646}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B7DC44F7-D3A3-4C70-9025-513E0182B646}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B7DC44F7-D3A3-4C70-9025-513E0182B646}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1CF111D9-33E6-4A11-8FEC-F23300A78D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1CF111D9-33E6-4A11-8FEC-F23300A78D15}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1CF111D9-33E6-4A11-8FEC-F23300A78D15}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1CF111D9-33E6-4A11-8FEC-F23300A78D15}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2D97C971-20BF-40DB-94AA-3279F787D3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2D97C971-20BF-40DB-94AA-3279F787D3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2D97C971-20BF-40DB-94AA-3279F787D3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2D97C971-20BF-40DB-94AA-3279F787D3CB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{2E9427C7-144F-488E-A29D-789ACC1C32AE} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{6BE10C39-4127-446C-818B-7976FCDD51D5} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{B7DC44F7-D3A3-4C70-9025-513E0182B646} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{C4D8F5D0-E6A7-4B7D-B8E9-F55C3F8D9D01} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{D5E9F6D1-B8A8-4C7E-9FA0-F66C3F8D9D02} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{E6F0F7D2-C9B9-4D8F-0FA1-F77C4F9D9D03} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
{F7F1F8D3-DAC0-4E9F-1FB2-F88D5F0E0E04} = {1B9AC248-76F8-44DD-958D-F1DC08EE1E87}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 18
|
||||
VisualStudioVersion = 18.3.11408.92 d18.3
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "quantalib", "lib\quantalib.csproj", "{F455234B-2A3C-140A-17C3-683D7820A733}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{3A8DF596-E814-FECC-DD4B-D8EF8AAC1A0D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuanTAlib.Tests", "lib\QuanTAlib.Tests.csproj", "{953F0406-DD9B-406E-993D-6D988D5F5423}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "quantower", "quantower", "{6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Forecasts", "quantower\Forecasts.csproj", "{AFF5F17D-5D00-401B-9351-D8DE26093AE6}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Filters", "quantower\Filters.csproj", "{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oscillators", "quantower\Oscillators.csproj", "{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dynamics", "quantower\Dynamics.csproj", "{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Momentum", "quantower\Momentum.csproj", "{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Quantower.Tests", "quantower\Quantower.Tests.csproj", "{A4015273-AFA7-4A22-B810-874E61F5DBBF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Statistics", "quantower\Statistics.csproj", "{8598E1B8-2302-4D63-86E4-F73AC769EFFA}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trends_FIR", "quantower\Trends_FIR.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trends_IIR", "quantower\Trends_IIR.csproj", "{B2C3D4E5-F678-90AB-CDEF-123456789ABC}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volatility", "quantower\Volatility.csproj", "{028CB6FB-3745-4F07-B5B8-295F81E0C452}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volume", "quantower\Volume.csproj", "{DD11E394-21DE-4D46-96DC-22E98FA682E7}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|x64.Build.0 = Release|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F455234B-2A3C-140A-17C3-683D7820A733}.Release|x86.Build.0 = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|x64.Build.0 = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423}.Release|x86.Build.0 = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6}.Release|x86.Build.0 = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|x64.Build.0 = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF}.Release|x86.Build.0 = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|x64.Build.0 = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC}.Release|x86.Build.0 = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|x64.Build.0 = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452}.Release|x86.Build.0 = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|x64.Build.0 = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{953F0406-DD9B-406E-993D-6D988D5F5423} = {3A8DF596-E814-FECC-DD4B-D8EF8AAC1A0D}
|
||||
{AFF5F17D-5D00-401B-9351-D8DE26093AE6} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{BF4691B3-5B5A-47B7-B98B-7BB6A81A4227} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{B182FFFB-ECD4-4866-BD52-FECCBDF56A56} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{D94918A4-D5AA-4F7C-AE4D-4A1AE7FBE0D0} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{C47D8DF6-4C75-403C-B9C6-A807ABE5B983} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{A4015273-AFA7-4A22-B810-874E61F5DBBF} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{8598E1B8-2302-4D63-86E4-F73AC769EFFA} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{A1B2C3D4-E5F6-7890-ABCD-EF1234567890} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{B2C3D4E5-F678-90AB-CDEF-123456789ABC} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{028CB6FB-3745-4F07-B5B8-295F81E0C452} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
{DD11E394-21DE-4D46-96DC-22E98FA682E7} = {6CF592EE-4302-E72F-3CB4-AB1D314DD5A8}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {E6DB434C-508E-4231-B8A6-5EDD7FF87E22}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,107 @@
|
||||
[](https://app.codacy.com/gh/mihakralj/QuanTAlib/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
||||
[](https://codecov.io/gh/mihakralj/QuanTAlib)
|
||||
[](https://sonarcloud.io/summary/new_code?id=mihakralj_QuanTAlib)
|
||||
[](https://www.codefactor.io/repository/github/mihakralj/quantalib/overview/main)
|
||||
[](https://www.nuget.org/packages/QuanTAlib/)
|
||||

|
||||
[](https://www.nuget.org/packages/QuanTAlib/)
|
||||
[](https://dotnet.microsoft.com/en-us/download/dotnet)
|
||||
|
||||
Static code analysis provided by [ndepend](https://www.ndepend.com/):
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
[](ndepend/ndependout/ndependreport.html)
|
||||
|
||||
# QuanTAlib - Quantitative Technical Indicators Without Compromises
|
||||
|
||||
TA libraries face a fundamental choice: accept approximations for simplicity OR enforce math rigor. QuanTAlib chooses rigor.
|
||||
|
||||
**Quan**titative **TA** **lib**rary (QuanTAlib) is a C# library built on the premise that you shouldn't have to choose. Modern CPUs process 4-8 FLOPS per cycle via SIMD. Modern .NET exposes memory layouts making hardware acceleration trivial. QuanTAlib exploits both. **Result:** mathematically rigorous indicators at speeds making real-time multi-symbol analysis practical on ordinary hardware.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Zero Allocation**: Hot paths are allocation-free. No GC pauses during trading.
|
||||
- **SIMD Accelerated**: Uses AVX2/AVX-512 for 8x throughput on modern CPUs.
|
||||
- **O(1) Streaming**: Constant time updates regardless of lookback period.
|
||||
- **Platform Agnostic**: Runs on .NET 8/9/10, compatible with Quantower, NinjaTrader, QuantConnect.
|
||||
- **Mathematically Rigorous**: Validated against original research papers and established libraries.
|
||||
|
||||
## Indicators
|
||||
|
||||
| Category | What It Measures | Representative Indicators |
|
||||
| -------- | ---------------- | ------------------------- |
|
||||
| [**Trends (FIR)**](lib/trends_FIR/_index.md) | Finite Impulse Response moving averages | SMA, WMA, HMA, ALMA, TRIMA, LSMA, EPMA |
|
||||
| [**Trends (IIR)**](lib/trends_IIR/_index.md) | Infinite Impulse Response moving averages | EMA, DEMA, TEMA, T3, JMA, KAMA, VIDYA |
|
||||
| [**Filters**](lib/filters/_index.md) | Signal processing and noise reduction filters | Bessel, Butterworth, Gaussian, Savitzky-Golay, Ehlers Super Smoother |
|
||||
| [**Oscillators**](lib/oscillators/_index.md) | Indicators that fluctuate around a center line | RSI, MACD, Stochastic, AO, APO, CCI, Ultimate Oscillator |
|
||||
| [**Dynamics**](lib/dynamics/_index.md) | Trend strength and direction indicators | ADX, Aroon, SuperTrend, Vortex, Chop, Ichimoku |
|
||||
| [**Momentum**](lib/momentum/_index.md) | Speed and magnitude of price changes | Momentum, ROC, Velocity, RSX, Qstick, KDJ |
|
||||
| [**Volatility**](lib/volatility/_index.md) | Size and variability of price movements | ATR, Bollinger Band Width, Historical Volatility, True Range |
|
||||
| [**Volume**](lib/volume/_index.md) | Trading activity and price-volume relationships | OBV, VWAP, MFI, ADL, CMF, TVI, Force Index |
|
||||
| [**Statistics**](lib/statistics/_index.md) | Statistical measures and tests | Correlation, Variance, StdDev, Skewness, Kurtosis, Z-Score |
|
||||
| [**Channels**](lib/channels/_index.md) | Price boundaries and range definitions | Bollinger Bands, Keltner Channels, Donchian Channels |
|
||||
| [**Cycles**](lib/cycles/_index.md) | Cycle analysis and signal processing | Hilbert Transform, Homodyne, Phasor, Ehlers Sine Wave |
|
||||
| [**Reversals**](lib/reversals/_index.md) | Pattern recognition and reversal detection | Pivot Points, Fractals, Swings, Pivot Components |
|
||||
| [**Forecasts**](lib/forecasts/_index.md) | Predictive indicators and projections | Time Series Forecast, AFIRMA, Chande Forecast Oscillator |
|
||||
| [**Errors**](lib/errors/_index.md) | Error metrics and loss functions | RMSE, MAE, MAPE, SMAPE, MASE, R-Squared |
|
||||
| [**Numerics**](lib/numerics/_index.md) | Mathematical transformations | Log, Exp, Sqrt, Tanh, ReLU, Sigmoid |
|
||||
|
||||
## Quick Start
|
||||
|
||||
Install from NuGet:
|
||||
|
||||
```bash
|
||||
dotnet add package QuanTAlib
|
||||
```
|
||||
|
||||
Calculate an SMA in real-time:
|
||||
|
||||
```csharp
|
||||
using QuanTAlib;
|
||||
|
||||
var sma = new Sma(period: 14);
|
||||
double price = 100.0;
|
||||
|
||||
// Update with new price
|
||||
var result = sma.Update(new TValue(DateTime.UtcNow, price));
|
||||
|
||||
if (result.IsHot)
|
||||
{
|
||||
Console.WriteLine($"SMA: {result.Value}");
|
||||
}
|
||||
```
|
||||
|
||||
## Performance Snapshot
|
||||
|
||||
QuanTAlib is designed for speed. Here is how it compares calculating a 500,000 bar SMA against other libraries:
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| ------- | --------- | ----------- | -------------- |
|
||||
| **QuanTAlib (Span)** | **318.3 μs** | **0 B** | **1.00x (baseline)** |
|
||||
| TA-Lib | 356.4 μs | 34 B | 1.12x slower |
|
||||
| Tulip Indicators | 359.3 μs | 0 B | 1.13x slower |
|
||||
| Skender Indicators | 71,277 μs | 50.8 MB | 224x slower |
|
||||
|
||||
*See [Benchmarks](docs/benchmarks.md) for full details and methodology.*
|
||||
|
||||
## Documentation
|
||||
|
||||
### Core Concepts
|
||||
|
||||
- [**Architecture**](docs/architecture.md): Learn about SoA layout, SIMD, and design philosophy.
|
||||
- [**API Reference**](docs/api.md): Deep dive into the Tri-Modal Architecture (Batch, Streaming, Priming).
|
||||
- [**Indicators**](docs/indicators.md): Full catalog of available indicators and their mathematical families.
|
||||
- [**Usage Guides**](docs/usage.md): Detailed patterns for Span, Streaming, Batch, and Eventing modes.
|
||||
- [**Integration**](docs/integration.md): Setup guides for Quantower, NinjaTrader, and QuantConnect.
|
||||
|
||||
### Analysis & Validation
|
||||
|
||||
- [**Benchmarks**](docs/benchmarks.md): Detailed performance evidence and test methodology.
|
||||
- [**Error Metrics**](docs/errors.md): Implementation details for 20+ error metrics and loss functions.
|
||||
- [**Trend Comparison**](docs/trendcomparison.md): Comparative analysis of lag, smoothness, and accuracy.
|
||||
- [**MA Qualities**](docs/ma-qualities.md): Theoretical framework for evaluating moving averages.
|
||||
- [**Validation**](docs/validation.md): Verification matrices against TA-Lib, Skender, and other libraries.
|
||||
- [**Glossary**](docs/glossary.md): Definitions of core QuanTAlib concepts, types, and terminology.
|
||||
@@ -1,16 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<AlgoType>Vendor</AlgoType>
|
||||
<AssemblyVersion>0.0.0.0</AssemblyVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="TradingPlatform.BusinessLayer">
|
||||
<HintPath>..\.github\TradingPlatform.BusinessLayer.dll</HintPath>
|
||||
</Reference>
|
||||
<None Include="..\.github\TradingPlatform.BusinessLayer.xml">
|
||||
<Link>TradingPlatform.BusinessLayer.xml</Link>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,55 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<RootNamespace>QuanTAlib.Tests</RootNamespace>
|
||||
<AssemblyName>QuanTAlib.Tests</AssemblyName>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.msbuild" Version="6.0.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="xunit" Version="2.9.2" />
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.0-pre.42">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="xunit.runner.console" Version="2.9.2">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
||||
|
||||
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
|
||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
|
||||
|
||||
<PackageReference Include="Skender.Stock.Indicators" Version="2.5.0" />
|
||||
<PackageReference Include="TALib.NETCore" Version="0.4.4" />
|
||||
<PackageReference Include="Tulip.NETCore" Version="0.8.0.1" />
|
||||
<PackageReference Include="Trady.Analysis" Version="3.2.8" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="TradingPlatform.BusinessLayer">
|
||||
<HintPath>..\.github\TradingPlatform.BusinessLayer.dll</HintPath>
|
||||
</Reference>
|
||||
<None Include="..\.github\TradingPlatform.BusinessLayer.xml">
|
||||
<Link>TradingPlatform.BusinessLayer.xml</Link>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\lib\*.csproj" />
|
||||
<ProjectReference Include="..\quantower\Volatility\_Volatility.csproj" Aliases="volatility" />
|
||||
<ProjectReference Include="..\quantower\Averages\_Averages.csproj" Aliases="averages" />
|
||||
<ProjectReference Include="..\quantower\Statistics\_Statistics.csproj" Aliases="statistics" />
|
||||
<ProjectReference Include="..\quantower\Momentum\_Momentum.csproj" Aliases="momentum" />
|
||||
<ProjectReference Include="..\quantower\Oscillators\_Oscillators.csproj" Aliases="oscillators" />
|
||||
<ProjectReference Include="..\quantower\Volume\_Volume.csproj" Aliases="volume" />
|
||||
<ProjectReference Include="..\quantower\Experiments\_Experiments.csproj" Aliases="experiments" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,91 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public abstract class UpdateTestBase
|
||||
{
|
||||
protected readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();
|
||||
protected const int RandomUpdates = 100;
|
||||
protected const double ReferenceValue = 100.0;
|
||||
protected const int precision = 8;
|
||||
|
||||
protected double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return ((double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue * 200) - 100; // Range: -100 to 100
|
||||
}
|
||||
|
||||
protected TBar GetRandomBar(bool IsNew)
|
||||
{
|
||||
double open = GetRandomDouble();
|
||||
double high = open + Math.Abs(GetRandomDouble());
|
||||
double low = open - Math.Abs(GetRandomDouble());
|
||||
double close = low + ((high - low) * GetRandomDouble());
|
||||
return new TBar(DateTime.Now, open, high, low, close, 1000, IsNew);
|
||||
}
|
||||
|
||||
protected void TestTValueUpdate<T>(T indicator, Func<TValue, TValue> calc) where T : class
|
||||
{
|
||||
var initialValue = calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
var finalValue = calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue.Value, finalValue.Value, precision);
|
||||
}
|
||||
|
||||
protected void TestTBarUpdate<T>(T indicator, Func<TBar, TValue> calc) where T : class
|
||||
{
|
||||
TBar r = GetRandomBar(true);
|
||||
var initialValue = calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
var finalValue = calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue.Value, finalValue.Value, precision);
|
||||
}
|
||||
|
||||
protected void TestDualTValueUpdate<T>(T indicator, Func<TValue, TValue, TValue> calc) where T : class
|
||||
{
|
||||
var initialValue = calc(
|
||||
new TValue(DateTime.Now, ReferenceValue, IsNew: true),
|
||||
new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
calc(
|
||||
new TValue(DateTime.Now, GetRandomDouble(), IsNew: false),
|
||||
new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
var finalValue = calc(
|
||||
new TValue(DateTime.Now, ReferenceValue, IsNew: false),
|
||||
new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue.Value, finalValue.Value, precision);
|
||||
}
|
||||
|
||||
protected void TestDualTBarUpdate<T>(T indicator, Func<TBar, TBar, TValue> calc) where T : class
|
||||
{
|
||||
TBar bar1 = GetRandomBar(true);
|
||||
TBar bar2 = GetRandomBar(true);
|
||||
var initialValue = calc(bar1, bar2);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
calc(GetRandomBar(false), GetRandomBar(false));
|
||||
}
|
||||
var finalValue = calc(
|
||||
new TBar(bar1.Time, bar1.Open, bar1.High, bar1.Low, bar1.Close, bar1.Volume, false),
|
||||
new TBar(bar2.Time, bar2.Open, bar2.High, bar2.Low, bar2.Close, bar2.Volume, false));
|
||||
|
||||
Assert.Equal(initialValue.Value, finalValue.Value, precision);
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
using Xunit;
|
||||
using Trady.Analysis.Indicator;
|
||||
using Trady.Core;
|
||||
using Trady.Core.Infrastructure;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
#pragma warning disable S1944, S2053, S2222, S2259, S2583, S2589, S3329, S3655, S3900, S3949, S3966, S4158, S4347, S5773, S6781
|
||||
|
||||
namespace QuanTAlib;
|
||||
|
||||
public class TradyTests
|
||||
{
|
||||
private readonly TBarSeries bars;
|
||||
private readonly GbmFeed feed;
|
||||
private readonly RandomNumberGenerator rng;
|
||||
private readonly double range;
|
||||
private readonly int iterations;
|
||||
private readonly int skip;
|
||||
private readonly IEnumerable<IOhlcv> Candles;
|
||||
|
||||
public TradyTests()
|
||||
{
|
||||
rng = RandomNumberGenerator.Create();
|
||||
feed = new(sigma: 0.5, mu: 0.0);
|
||||
bars = new(feed);
|
||||
range = 1e-9;
|
||||
feed.Add(10000);
|
||||
iterations = 3;
|
||||
skip = 500;
|
||||
Candles = bars.Select(bar => new Candle(
|
||||
bar.Time,
|
||||
(decimal)bar.Open,
|
||||
(decimal)bar.High,
|
||||
(decimal)bar.Low,
|
||||
(decimal)bar.Close,
|
||||
(decimal)bar.Volume
|
||||
)).ToList();
|
||||
}
|
||||
|
||||
private int GetRandomNumber(int minValue, int maxValue)
|
||||
{
|
||||
byte[] randomBytes = new byte[4];
|
||||
rng.GetBytes(randomBytes);
|
||||
int randomInt = BitConverter.ToInt32(randomBytes, 0);
|
||||
return Math.Abs(randomInt % (maxValue - minValue)) + minValue;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Sma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
|
||||
var Trady = new SimpleMovingAverage(Candles, period)
|
||||
.Compute()
|
||||
.Select(result => new
|
||||
{
|
||||
Date = result.DateTime,
|
||||
Value = result.Tick.HasValue ? (double)result.Tick.Value : double.NaN
|
||||
})
|
||||
.ToList();
|
||||
|
||||
Assert.Equal(QL.Length, Trady.Count);
|
||||
for (int i = QL.Length - 1; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i].Value;
|
||||
double Tr_item = Trady[i].Value;
|
||||
Assert.InRange(Tr_item - QL_item, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Ema ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
|
||||
var Trady = new ExponentialMovingAverage(Candles, period)
|
||||
.Compute()
|
||||
.Select(result => new
|
||||
{
|
||||
Date = result.DateTime,
|
||||
Value = result.Tick.HasValue ? (double)result.Tick.Value : double.NaN
|
||||
})
|
||||
.ToList();
|
||||
|
||||
Assert.Equal(QL.Length, Trady.Count);
|
||||
for (int i = QL.Length - 1; i > skip * 2; i--)
|
||||
{
|
||||
double QL_item = QL[i].Value;
|
||||
double Tr_item = Trady[i].Value;
|
||||
Assert.InRange(Tr_item - QL_item, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
using Xunit;
|
||||
using Tulip;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
#pragma warning disable S1944, S2053, S2222, S2259, S2583, S2589, S3329, S3655, S3900, S3949, S3966, S4158, S4347, S5773, S6781
|
||||
|
||||
namespace QuanTAlib;
|
||||
|
||||
public class TulipTests
|
||||
{
|
||||
private readonly GbmFeed feed;
|
||||
private readonly RandomNumberGenerator rng;
|
||||
private readonly double range;
|
||||
private readonly int iterations;
|
||||
private readonly double[] data;
|
||||
private readonly double[] outdata;
|
||||
private readonly int skip;
|
||||
|
||||
public TulipTests()
|
||||
{
|
||||
rng = RandomNumberGenerator.Create();
|
||||
feed = new(sigma: 0.5, mu: 0.0);
|
||||
range = 1e-9;
|
||||
feed.Add(10000);
|
||||
iterations = 3;
|
||||
skip = 500;
|
||||
data = feed.Close.v.ToArray();
|
||||
outdata = new double[data.Count()];
|
||||
}
|
||||
|
||||
private int GetRandomNumber(int minValue, int maxValue)
|
||||
{
|
||||
byte[] randomBytes = new byte[4];
|
||||
rng.GetBytes(randomBytes);
|
||||
int randomInt = BitConverter.ToInt32(randomBytes, 0);
|
||||
return Math.Abs(randomInt % (maxValue - minValue)) + minValue;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Sma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
|
||||
double[][] arrin = [data];
|
||||
double[][] arrout = [outdata];
|
||||
Tulip.Indicators.sma.Run(inputs: arrin, options: [period], outputs: arrout);
|
||||
Assert.Equal(QL.Length, arrout[0].Length);
|
||||
for (int i = QL.Length - 1; i > skip; i--)
|
||||
{
|
||||
double QL_item = QL[i].Value;
|
||||
double TU = i < period - 1 ? double.NaN : arrout[0][i - period + 1];
|
||||
Assert.InRange(TU - QL_item, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 35);
|
||||
Ema ma = new(period, useSma: false);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
|
||||
double[][] arrin = [data];
|
||||
double[][] arrout = [outdata];
|
||||
Tulip.Indicators.ema.Run(inputs: arrin, options: [period], outputs: arrout);
|
||||
|
||||
Assert.Equal(QL.Length, arrout[0].Length);
|
||||
for (int i = QL.Length - 1; i > skip * 2; i--) //Initial Tulip Ema value is (wrongly) set to the first input value - therefore large skip
|
||||
{
|
||||
double QL_item = QL[i].Value;
|
||||
double TU = arrout[0][i];
|
||||
Assert.True(Math.Abs(TU - QL_item) <= range, $"Assertion failed at index {i} for period {period}: TU = {TU}, QL_item = {QL_item}, delta = {TU - QL_item}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,251 +0,0 @@
|
||||
using Xunit;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class CoreTests
|
||||
{
|
||||
#region CircularBuffer Tests
|
||||
|
||||
[Fact]
|
||||
public void CircularBuffer_BasicOperations()
|
||||
{
|
||||
var buffer = new CircularBuffer(5);
|
||||
|
||||
// Test initial state
|
||||
Assert.Equal(5, buffer.Capacity);
|
||||
Assert.Equal(0, buffer.Count);
|
||||
|
||||
// Test adding items
|
||||
buffer.Add(1.0);
|
||||
buffer.Add(2.0);
|
||||
Assert.Equal(2, buffer.Count);
|
||||
Assert.Equal(1.0, buffer[0]);
|
||||
Assert.Equal(2.0, buffer[^1]);
|
||||
|
||||
// Test overflow behavior
|
||||
buffer.Add(3.0);
|
||||
buffer.Add(4.0);
|
||||
buffer.Add(5.0);
|
||||
buffer.Add(6.0); // Should remove oldest item (1.0)
|
||||
Assert.Equal(5, buffer.Count);
|
||||
Assert.Equal(2.0, buffer[0]);
|
||||
Assert.Equal(6.0, buffer[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CircularBuffer_UpdateBehavior()
|
||||
{
|
||||
var buffer = new CircularBuffer(3);
|
||||
|
||||
// Add new values
|
||||
buffer.Add(1.0, isNew: true);
|
||||
buffer.Add(2.0, isNew: true);
|
||||
Assert.Equal(2, buffer.Count);
|
||||
|
||||
// Update last value
|
||||
buffer.Add(2.5, isNew: false);
|
||||
Assert.Equal(2, buffer.Count);
|
||||
Assert.Equal(2.5, buffer[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CircularBuffer_MinMaxSumAverage()
|
||||
{
|
||||
var buffer = new CircularBuffer(5);
|
||||
|
||||
buffer.Add(1.0);
|
||||
buffer.Add(2.0);
|
||||
buffer.Add(3.0);
|
||||
buffer.Add(4.0);
|
||||
buffer.Add(5.0);
|
||||
|
||||
Assert.Equal(1.0, buffer.Min());
|
||||
Assert.Equal(5.0, buffer.Max());
|
||||
Assert.Equal(15.0, buffer.Sum());
|
||||
Assert.Equal(3.0, buffer.Average());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CircularBuffer_Enumeration()
|
||||
{
|
||||
var buffer = new CircularBuffer(3);
|
||||
|
||||
buffer.Add(1.0);
|
||||
buffer.Add(2.0);
|
||||
buffer.Add(3.0);
|
||||
|
||||
var list = buffer.ToList();
|
||||
Assert.Equal(3, list.Count);
|
||||
Assert.Equal(1.0, list[0]);
|
||||
Assert.Equal(3.0, list[2]);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region TBar Tests
|
||||
|
||||
[Fact]
|
||||
public void TBar_Construction()
|
||||
{
|
||||
// Default constructor
|
||||
var bar1 = new TBar();
|
||||
Assert.Equal(0, bar1.Open);
|
||||
Assert.True(bar1.IsNew);
|
||||
|
||||
// Value constructor
|
||||
var bar2 = new TBar(10.0);
|
||||
Assert.Equal(10.0, bar2.Open);
|
||||
Assert.Equal(10.0, bar2.High);
|
||||
Assert.Equal(10.0, bar2.Low);
|
||||
Assert.Equal(10.0, bar2.Close);
|
||||
|
||||
// Full constructor
|
||||
var time = DateTime.Now;
|
||||
var bar3 = new TBar(time, 10.0, 12.0, 9.0, 11.0, 1000.0, false);
|
||||
Assert.Equal(time, bar3.Time);
|
||||
Assert.Equal(10.0, bar3.Open);
|
||||
Assert.Equal(12.0, bar3.High);
|
||||
Assert.Equal(9.0, bar3.Low);
|
||||
Assert.Equal(11.0, bar3.Close);
|
||||
Assert.Equal(1000.0, bar3.Volume);
|
||||
Assert.False(bar3.IsNew);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TBar_DerivedValues()
|
||||
{
|
||||
var bar = new TBar(DateTime.Now, 10.0, 20.0, 5.0, 15.0, 1000.0);
|
||||
|
||||
Assert.Equal(12.5, bar.HL2); // (20 + 5) / 2
|
||||
Assert.Equal(12.5, bar.OC2); // (10 + 15) / 2
|
||||
Assert.Equal(11.67, bar.OHL3, 2); // (10 + 20 + 5) / 3
|
||||
Assert.Equal(13.33, bar.HLC3, 2); // (20 + 5 + 15) / 3
|
||||
Assert.Equal(12.5, bar.OHLC4); // (10 + 20 + 5 + 15) / 4
|
||||
Assert.Equal(13.75, bar.HLCC4); // (20 + 5 + 15 + 15) / 4
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TBarSeries_Operations()
|
||||
{
|
||||
var series = new TBarSeries();
|
||||
var time = DateTime.Now;
|
||||
var bar1 = new TBar(time, 10.0, 12.0, 9.0, 11.0, 1000.0);
|
||||
var bar2 = new TBar(time.AddMinutes(1), 11.0, 13.0, 10.0, 12.0, 1100.0);
|
||||
|
||||
// Test adding bars
|
||||
series.Add(bar1);
|
||||
series.Add(bar2);
|
||||
Assert.Equal(2, series.Count);
|
||||
|
||||
// Test updating last bar
|
||||
var bar2Update = new TBar(bar2.Time, 11.0, 13.5, 9.5, 12.5, 1200.0, false);
|
||||
series.Add(bar2Update);
|
||||
Assert.Equal(2, series.Count);
|
||||
Assert.Equal(12.5, series.Last.Close);
|
||||
|
||||
// Test derived series
|
||||
Assert.Equal(11.0, series.Open.Last.Value);
|
||||
Assert.Equal(13.5, series.High.Last.Value);
|
||||
Assert.Equal(9.5, series.Low.Last.Value);
|
||||
Assert.Equal(12.5, series.Close.Last.Value);
|
||||
Assert.Equal(1200.0, series.Volume.Last.Value);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region TValue Tests
|
||||
|
||||
[Fact]
|
||||
public void TValue_Construction()
|
||||
{
|
||||
// Default constructor
|
||||
var value1 = new TValue();
|
||||
Assert.Equal(0, value1.Value);
|
||||
Assert.True(value1.IsNew);
|
||||
Assert.True(value1.IsHot);
|
||||
|
||||
// Value constructor
|
||||
var value2 = new TValue(10.0);
|
||||
Assert.Equal(10.0, value2.Value);
|
||||
|
||||
// Full constructor
|
||||
var time = DateTime.Now;
|
||||
var value3 = new TValue(time, 10.0, false, false);
|
||||
Assert.Equal(time, value3.Time);
|
||||
Assert.Equal(10.0, value3.Value);
|
||||
Assert.False(value3.IsNew);
|
||||
Assert.False(value3.IsHot);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TValue_Conversions()
|
||||
{
|
||||
var value = new TValue(10.0);
|
||||
|
||||
// Test implicit conversions
|
||||
double d = value;
|
||||
Assert.Equal(10.0, d);
|
||||
|
||||
DateTime time = value;
|
||||
Assert.Equal(value.Time, time);
|
||||
|
||||
// Test implicit conversion from double
|
||||
TValue newValue = 20.0;
|
||||
Assert.Equal(20.0, newValue.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TSeries_Operations()
|
||||
{
|
||||
var series = new TSeries();
|
||||
var time = DateTime.Now;
|
||||
|
||||
// Test adding values
|
||||
series.Add(time, 10.0);
|
||||
series.Add(time.AddMinutes(1), 20.0);
|
||||
Assert.Equal(2, series.Count);
|
||||
|
||||
// Test updating last value
|
||||
series.Add(new TValue(time.AddMinutes(1), 25.0, false));
|
||||
Assert.Equal(2, series.Count);
|
||||
Assert.Equal(25.0, series.Last.Value);
|
||||
|
||||
// Test adding range of values
|
||||
var values = new[] { 30.0, 40.0, 50.0 };
|
||||
foreach (var value in values)
|
||||
{
|
||||
series.Add(time.AddMinutes(series.Count + 1), value);
|
||||
}
|
||||
Assert.Equal(5, series.Count);
|
||||
|
||||
// Test conversions
|
||||
var doubleList = (List<double>)series;
|
||||
Assert.Equal(5, doubleList.Count);
|
||||
Assert.Equal(50.0, doubleList[^1]);
|
||||
|
||||
var doubleArray = (double[])series;
|
||||
Assert.Equal(5, doubleArray.Length);
|
||||
Assert.Equal(50.0, doubleArray[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TSeries_EventHandling()
|
||||
{
|
||||
var series = new TSeries();
|
||||
var receivedValues = new List<double>();
|
||||
var time = DateTime.Now;
|
||||
|
||||
series.Pub += (object sender, in ValueEventArgs args) => receivedValues.Add(args.Tick.Value);
|
||||
|
||||
series.Add(time, 10.0);
|
||||
series.Add(time.AddMinutes(1), 20.0);
|
||||
series.Add(time.AddMinutes(2), 30.0);
|
||||
|
||||
Assert.Equal(3, receivedValues.Count);
|
||||
Assert.Equal(10.0, receivedValues[0]);
|
||||
Assert.Equal(20.0, receivedValues[1]);
|
||||
Assert.Equal(30.0, receivedValues[2]);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -1,184 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
using System.Reflection;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class EventingTests
|
||||
{
|
||||
private const int TestDataPoints = 200;
|
||||
private const int DefaultPeriod = 10;
|
||||
private const double Tolerance = 1e-9;
|
||||
|
||||
private static readonly (string Name, object[] DirectParams, object[] EventParams)[] ValueIndicators = new[]
|
||||
{
|
||||
("Afirma", new object[] { DefaultPeriod, DefaultPeriod, Afirma.WindowType.BlackmanHarris }, new object[] { new TSeries(), DefaultPeriod, DefaultPeriod, Afirma.WindowType.BlackmanHarris }),
|
||||
("Alma", new object[] { DefaultPeriod, 0.85, 6.0 }, new object[] { new TSeries(), DefaultPeriod, 0.85, 6.0 }),
|
||||
("Convolution", new object[] { new double[] {1,2,3,2,1} }, new object[] { new TSeries(), new double[] {1,2,3,2,1} }),
|
||||
("Dema", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Dsma", new object[] { DefaultPeriod, 0.9 }, new object[] { new TSeries(), DefaultPeriod, 0.9 }),
|
||||
("Dwma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Ema", new object[] { DefaultPeriod, true }, new object[] { new TSeries(), DefaultPeriod, true }),
|
||||
("Epma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Pwma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Fisher", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Frama", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Fwma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Gma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Hma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Htit", System.Array.Empty<object>(), new object[] { new TSeries() }),
|
||||
("Hwma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Jma", new object[] { DefaultPeriod, 0, 0.45, 10 }, new object[] { new TSeries(), DefaultPeriod, 0, 0.45, 10 }),
|
||||
("Kama", new object[] { DefaultPeriod, 2, 30 }, new object[] { new TSeries(), DefaultPeriod, 2, 30 }),
|
||||
("Ltma", new object[] { 0.2 }, new object[] { new TSeries(), 0.2 }),
|
||||
("Maaf", new object[] { 39, 0.002 }, new object[] { new TSeries(), 39, 0.002 }),
|
||||
("Mama", new object[] { 0.5, 0.05 }, new object[] { new TSeries(), 0.5, 0.05 }),
|
||||
("Mgdi", new object[] { DefaultPeriod, 0.6 }, new object[] { new TSeries(), DefaultPeriod, 0.6 }),
|
||||
("Mma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Qema", new object[] { 0.2, 0.2, 0.2, 0.2 }, new object[] { new TSeries(), 0.2, 0.2, 0.2, 0.2 }),
|
||||
("Rema", new object[] { DefaultPeriod, 0.5 }, new object[] { new TSeries(), DefaultPeriod, 0.5 }),
|
||||
("Rma", new object[] { DefaultPeriod, true }, new object[] { new TSeries(), DefaultPeriod, true }),
|
||||
("Sma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Wma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Tema", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Zlema", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Sinema", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Smma", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("T3", new object[] { DefaultPeriod, 0.7, true }, new object[] { new TSeries(), DefaultPeriod, 0.7, true }),
|
||||
("Trima", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Vidya", new object[] { DefaultPeriod, 0, 0.2 }, new object[] { new TSeries(), DefaultPeriod, 0, 0.2 }),
|
||||
("Apo", new object[] { 12, 26 }, new object[] { new TSeries(), 12, 26 }),
|
||||
("Macd", new object[] { 12, 26, 9 }, new object[] { new TSeries(), 12, 26, 9 }),
|
||||
("Rsi", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rsx", new object[] { DefaultPeriod, 0, 0.55 }, new object[] { new TSeries(), DefaultPeriod, 0, 0.55 }),
|
||||
("Cmo", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Cog", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Curvature", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Entropy", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Kurtosis", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Max", new object[] { DefaultPeriod, 0.0 }, new object[] { new TSeries(), DefaultPeriod, 0.0 }),
|
||||
("Median", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Min", new object[] { DefaultPeriod, 0.0 }, new object[] { new TSeries(), DefaultPeriod, 0.0 }),
|
||||
("Mode", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Percentile", new object[] { DefaultPeriod, 0.5 }, new object[] { new TSeries(), DefaultPeriod, 0.5 }),
|
||||
("Skew", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Slope", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Stddev", new object[] { DefaultPeriod, false }, new object[] { new TSeries(), DefaultPeriod, false }),
|
||||
("Variance", new object[] { DefaultPeriod, false }, new object[] { new TSeries(), DefaultPeriod, false }),
|
||||
("Zscore", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Beta", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Corr", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Hv", new object[] { DefaultPeriod, false }, new object[] { new TSeries(), DefaultPeriod, false }),
|
||||
("Jvolty", new object[] { DefaultPeriod, 0 }, new object[] { new TSeries(), DefaultPeriod, 0 }),
|
||||
("Rv", new object[] { DefaultPeriod, false }, new object[] { new TSeries(), DefaultPeriod, false }),
|
||||
("Rvi", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mae", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mapd", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mape", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mase", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mda", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Me", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mpe", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Mse", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Msle", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rae", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rmse", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rmsle", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rse", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Smape", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Rsquared", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod }),
|
||||
("Huber", new object[] { DefaultPeriod, 1.0 }, new object[] { new TSeries(), DefaultPeriod, 1.0 }),
|
||||
("Cti", new object[] { DefaultPeriod }, new object[] { new TSeries(), DefaultPeriod })
|
||||
};
|
||||
|
||||
private static readonly (string Name, object[] DirectParams, object[] EventParams)[] BarIndicators = new[]
|
||||
{
|
||||
("Adl", System.Array.Empty<object>(), new object[] { new TBarSeries() }),
|
||||
("Adosc", new object[] { 3, 10 }, new object[] { new TBarSeries(), 3, 10 }),
|
||||
("Aobv", System.Array.Empty<object>(), new object[] { new TBarSeries() }),
|
||||
("Cmf", new object[] { 20 }, new object[] { new TBarSeries(), 20 }),
|
||||
("Eom", new object[] { 14 }, new object[] { new TBarSeries(), 14 }),
|
||||
("Kvo", new object[] { 34, 55 }, new object[] { new TBarSeries(), 34, 55 }),
|
||||
("Atr", new object[] { 14 }, new object[] { new TBarSeries(), 14 }),
|
||||
("Chop", new object[] { 14 }, new object[] { new TBarSeries(), 14 }),
|
||||
("Dosc", System.Array.Empty<object>(), new object[] { new TBarSeries() })
|
||||
};
|
||||
|
||||
public static IEnumerable<object[]> GetValueIndicatorData()
|
||||
=> ValueIndicators.Select(x => new object[] { x.Name, x.DirectParams, x.EventParams });
|
||||
|
||||
public static IEnumerable<object[]> GetBarIndicatorData()
|
||||
=> BarIndicators.Select(x => new object[] { x.Name, x.DirectParams, x.EventParams });
|
||||
|
||||
private static double GetRandomDouble(RandomNumberGenerator rng)
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return (double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue;
|
||||
}
|
||||
|
||||
private static TBar GenerateRandomBar(RandomNumberGenerator rng, double baseValue)
|
||||
{
|
||||
return new TBar(
|
||||
DateTime.Now,
|
||||
baseValue,
|
||||
baseValue + Math.Abs(GetRandomDouble(rng) * 10),
|
||||
baseValue - Math.Abs(GetRandomDouble(rng) * 10),
|
||||
baseValue + (GetRandomDouble(rng) * 5),
|
||||
Math.Abs(GetRandomDouble(rng) * 1000),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GetValueIndicatorData))]
|
||||
public void ValueIndicatorEventTest(string indicatorName, object[] directParams, object[] eventParams)
|
||||
{
|
||||
using var rng = RandomNumberGenerator.Create();
|
||||
var input = (TSeries)eventParams[0];
|
||||
|
||||
// Create indicator instances using reflection
|
||||
var indicatorType = Type.GetType($"QuanTAlib.{indicatorName}, QuanTAlib")!;
|
||||
var directIndicator = (AbstractBase)Activator.CreateInstance(indicatorType, directParams)!;
|
||||
var eventIndicator = (AbstractBase)Activator.CreateInstance(indicatorType, eventParams)!;
|
||||
|
||||
// Generate test data and calculate
|
||||
for (int i = 0; i < TestDataPoints; i++)
|
||||
{
|
||||
double randomValue = GetRandomDouble(rng) * 100;
|
||||
input.Add(randomValue);
|
||||
directIndicator.Calc(randomValue);
|
||||
}
|
||||
|
||||
bool areEqual = (double.IsNaN(directIndicator.Value) && double.IsNaN(eventIndicator.Value)) ||
|
||||
Math.Abs(directIndicator.Value - eventIndicator.Value) < Tolerance;
|
||||
|
||||
Assert.True(areEqual, $"Value indicator {indicatorName} failed: Expected {directIndicator.Value}, Actual {eventIndicator.Value}");
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(GetBarIndicatorData))]
|
||||
public void BarIndicatorEventTest(string indicatorName, object[] directParams, object[] eventParams)
|
||||
{
|
||||
using var rng = RandomNumberGenerator.Create();
|
||||
var barInput = (TBarSeries)eventParams[0];
|
||||
|
||||
// Create indicator instances using reflection
|
||||
var indicatorType = Type.GetType($"QuanTAlib.{indicatorName}, QuanTAlib")!;
|
||||
var directIndicator = (AbstractBase)Activator.CreateInstance(indicatorType, directParams)!;
|
||||
var eventIndicator = (AbstractBase)Activator.CreateInstance(indicatorType, eventParams)!;
|
||||
|
||||
// Generate test data and calculate
|
||||
for (int i = 0; i < TestDataPoints; i++)
|
||||
{
|
||||
var bar = GenerateRandomBar(rng, GetRandomDouble(rng) * 100);
|
||||
barInput.Add(bar);
|
||||
directIndicator.Calc(bar);
|
||||
}
|
||||
|
||||
bool areEqual = (double.IsNaN(directIndicator.Value) && double.IsNaN(eventIndicator.Value)) ||
|
||||
Math.Abs(directIndicator.Value - eventIndicator.Value) < Tolerance;
|
||||
|
||||
Assert.True(areEqual, $"Bar indicator {indicatorName} failed: Expected {directIndicator.Value}, Actual {eventIndicator.Value}");
|
||||
}
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Reflection;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib;
|
||||
|
||||
/// <summary>
|
||||
/// Contains unit tests for bar-based indicators in QuanTAlib.
|
||||
/// </summary>
|
||||
public class BarIndicatorTests
|
||||
{
|
||||
private readonly RandomNumberGenerator rng;
|
||||
private const int SeriesLen = 1000;
|
||||
private const int Corrections = 100;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the BarIndicatorTests class.
|
||||
/// </summary>
|
||||
public BarIndicatorTests()
|
||||
{
|
||||
rng = RandomNumberGenerator.Create();
|
||||
}
|
||||
|
||||
private static readonly ITValue[] indicators = new ITValue[]
|
||||
{
|
||||
new Atr(period: 14),
|
||||
|
||||
// Add other TBar-based indicators here
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Tests if the indicator produces consistent results when processing new and updated bars.
|
||||
/// </summary>
|
||||
/// <param name="indicator">The indicator to test.</param>
|
||||
[Theory]
|
||||
[MemberData(nameof(GetIndicators))]
|
||||
public void IndicatorIsNew(ITValue indicator)
|
||||
{
|
||||
var indicator1 = indicator;
|
||||
var indicator2 = indicator;
|
||||
|
||||
MethodInfo calcMethod = FindCalcMethod(indicator.GetType());
|
||||
if (calcMethod == null)
|
||||
{
|
||||
throw new InvalidOperationException($"Calc method not found for indicator type: {indicator.GetType().Name}");
|
||||
}
|
||||
|
||||
for (int i = 0; i < SeriesLen; i++)
|
||||
{
|
||||
TBar item1 = GenerateRandomBar(isNew: true);
|
||||
InvokeCalc(indicator1, calcMethod, item1);
|
||||
|
||||
for (int j = 0; j < Corrections; j++)
|
||||
{
|
||||
item1 = GenerateRandomBar(isNew: false);
|
||||
InvokeCalc(indicator1, calcMethod, item1);
|
||||
}
|
||||
|
||||
var item2 = new TBar(item1.Time, item1.Open, item1.High, item1.Low, item1.Close, item1.Volume, IsNew: true);
|
||||
InvokeCalc(indicator2, calcMethod, item2);
|
||||
|
||||
Assert.Equal(indicator1.Value, indicator2.Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the appropriate Calc method for the given indicator type.
|
||||
/// </summary>
|
||||
/// <param name="type">The type of the indicator.</param>
|
||||
/// <returns>The MethodInfo for the Calc method.</returns>
|
||||
private static MethodInfo FindCalcMethod(Type type)
|
||||
{
|
||||
while (type != null && type != typeof(object))
|
||||
{
|
||||
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
|
||||
.Where(m => m.Name == "Calc")
|
||||
.ToList();
|
||||
|
||||
if (methods.Count > 0)
|
||||
{
|
||||
// Prefer the method with TBar parameter
|
||||
var method = methods.Find(m =>
|
||||
{
|
||||
var parameters = m.GetParameters();
|
||||
return parameters.Length == 1 && parameters[0].ParameterType == typeof(TBar);
|
||||
});
|
||||
|
||||
// If not found, return the first method
|
||||
return method ?? methods[0];
|
||||
}
|
||||
|
||||
type = type.BaseType!;
|
||||
}
|
||||
return null!;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invokes the Calc method on the given indicator with the provided input.
|
||||
/// </summary>
|
||||
/// <param name="indicator">The indicator instance.</param>
|
||||
/// <param name="calcMethod">The Calc method to invoke.</param>
|
||||
/// <param name="input">The input TBar.</param>
|
||||
private static void InvokeCalc(ITValue indicator, MethodInfo calcMethod, TBar input)
|
||||
{
|
||||
var parameters = calcMethod.GetParameters();
|
||||
if (parameters.Length == 1)
|
||||
{
|
||||
calcMethod.Invoke(indicator, new object[] { input });
|
||||
}
|
||||
else if (parameters.Length == 2)
|
||||
{
|
||||
calcMethod.Invoke(indicator, new object[] { input, double.NaN });
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException($"Invalid number of parameters for Calc method in indicator type: {indicator.GetType().Name}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates a random TBar for testing purposes.
|
||||
/// </summary>
|
||||
/// <param name="isNew">Indicates whether the generated bar should be marked as new.</param>
|
||||
/// <returns>A randomly generated TBar.</returns>
|
||||
private TBar GenerateRandomBar(bool isNew)
|
||||
{
|
||||
double open = (GetRandomDouble() * 200) - 100;
|
||||
double close = (GetRandomDouble() * 200) - 100;
|
||||
double high = Math.Max(open, close) + (GetRandomDouble() * 10);
|
||||
double low = Math.Min(open, close) - (GetRandomDouble() * 10);
|
||||
long volume = GetRandomNumber(0, 10000);
|
||||
|
||||
return new TBar(Time: DateTime.Now, Open: open, High: high, Low: low, Close: close, Volume: volume, IsNew: isNew);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates a random double between 0 and 1.
|
||||
/// </summary>
|
||||
/// <returns>A random double between 0 and 1.</returns>
|
||||
private double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return (double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates a random integer between minValue (inclusive) and maxValue (exclusive).
|
||||
/// </summary>
|
||||
/// <param name="minValue">The minimum value (inclusive).</param>
|
||||
/// <param name="maxValue">The maximum value (exclusive).</param>
|
||||
/// <returns>A random integer between minValue and maxValue.</returns>
|
||||
private int GetRandomNumber(int minValue, int maxValue)
|
||||
{
|
||||
byte[] randomBytes = new byte[4];
|
||||
rng.GetBytes(randomBytes);
|
||||
int randomInt = BitConverter.ToInt32(randomBytes, 0);
|
||||
return Math.Abs(randomInt % (maxValue - minValue)) + minValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides the list of indicators for parameterized tests.
|
||||
/// </summary>
|
||||
/// <returns>An enumerable of object arrays, each containing an indicator instance.</returns>
|
||||
public static IEnumerable<object[]> GetIndicators()
|
||||
{
|
||||
return indicators.Select(indicator => new object[] { indicator });
|
||||
}
|
||||
}
|
||||
@@ -1,167 +0,0 @@
|
||||
extern alias volatility;
|
||||
extern alias averages;
|
||||
extern alias statistics;
|
||||
extern alias momentum;
|
||||
extern alias oscillators;
|
||||
extern alias volume;
|
||||
extern alias experiments;
|
||||
|
||||
using Xunit;
|
||||
using System.Reflection;
|
||||
using TradingPlatform.BusinessLayer;
|
||||
using statistics::QuanTAlib;
|
||||
using averages::QuanTAlib;
|
||||
using volatility::QuanTAlib;
|
||||
using momentum::QuanTAlib;
|
||||
using oscillators::QuanTAlib;
|
||||
using volume::QuanTAlib;
|
||||
using experiments::QuanTAlib;
|
||||
|
||||
namespace QuanTAlib
|
||||
{
|
||||
public class QuantowerTests
|
||||
{
|
||||
private static void TestIndicator<T>(string fieldName = "ma") where T : Indicator, new()
|
||||
{
|
||||
var indicator = new T();
|
||||
try
|
||||
{
|
||||
var onInitMethod = typeof(T).GetMethod("OnInit", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(onInitMethod);
|
||||
onInitMethod.Invoke(indicator, null);
|
||||
var onUpdateMethod = typeof(T).GetMethod("OnUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(onUpdateMethod);
|
||||
|
||||
var field = typeof(T).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(field);
|
||||
var fieldValue = field.GetValue(indicator);
|
||||
Assert.NotNull(fieldValue);
|
||||
|
||||
Assert.NotNull(indicator.ShortName);
|
||||
Assert.NotEmpty(indicator.ShortName);
|
||||
Assert.NotNull(indicator.Name);
|
||||
Assert.NotEmpty(indicator.Name);
|
||||
Assert.NotNull(indicator.Description);
|
||||
Assert.NotEmpty(indicator.Description);
|
||||
Assert.IsAssignableFrom<Indicator>(indicator);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Xunit.Sdk.XunitException($"Test failed for {typeof(T).Name}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static void TestIndicatorMultipleFields<T>(string[] fieldNames) where T : Indicator, new()
|
||||
{
|
||||
var indicator = new T();
|
||||
try
|
||||
{
|
||||
var onInitMethod = typeof(T).GetMethod("OnInit", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(onInitMethod);
|
||||
onInitMethod.Invoke(indicator, null);
|
||||
var onUpdateMethod = typeof(T).GetMethod("OnUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(onUpdateMethod);
|
||||
|
||||
foreach (var fieldName in fieldNames)
|
||||
{
|
||||
var field = typeof(T).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
Assert.NotNull(field);
|
||||
var fieldValue = field.GetValue(indicator);
|
||||
Assert.NotNull(fieldValue);
|
||||
}
|
||||
|
||||
Assert.NotNull(indicator.ShortName);
|
||||
Assert.NotEmpty(indicator.ShortName);
|
||||
Assert.NotNull(indicator.Name);
|
||||
Assert.NotEmpty(indicator.Name);
|
||||
Assert.NotNull(indicator.Description);
|
||||
Assert.NotEmpty(indicator.Description);
|
||||
Assert.IsAssignableFrom<Indicator>(indicator);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Xunit.Sdk.XunitException($"Test failed for {typeof(T).Name}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// Averages Indicators
|
||||
[Fact] public void Afirma() => TestIndicator<AfirmaIndicator>();
|
||||
[Fact] public void Alma() => TestIndicator<AlmaIndicator>();
|
||||
[Fact] public void Dema() => TestIndicator<DemaIndicator>();
|
||||
[Fact] public void Dsma() => TestIndicator<DsmaIndicator>();
|
||||
[Fact] public void Dwma() => TestIndicator<DwmaIndicator>();
|
||||
[Fact] public void Ema() => TestIndicator<EmaIndicator>();
|
||||
[Fact] public void Epma() => TestIndicator<EpmaIndicator>();
|
||||
[Fact] public void Frama() => TestIndicator<FramaIndicator>();
|
||||
[Fact] public void Fwma() => TestIndicator<FwmaIndicator>();
|
||||
[Fact] public void Gma() => TestIndicator<GmaIndicator>();
|
||||
[Fact] public void Hma() => TestIndicator<HmaIndicator>();
|
||||
[Fact] public void Htit() => TestIndicator<HtitIndicator>();
|
||||
[Fact] public void Hwma() => TestIndicator<HwmaIndicator>();
|
||||
[Fact] public void Jma() => TestIndicator<JmaIndicator>();
|
||||
[Fact] public void Kama() => TestIndicator<KamaIndicator>();
|
||||
[Fact] public void Ltma() => TestIndicator<LtmaIndicator>();
|
||||
[Fact] public void Maaf() => TestIndicator<MaafIndicator>();
|
||||
[Fact] public void Mama() => TestIndicator<MamaIndicator>();
|
||||
[Fact] public void Mgdi() => TestIndicator<MgdiIndicator>();
|
||||
[Fact] public void Mma() => TestIndicator<MmaIndicator>();
|
||||
[Fact] public void Pwma() => TestIndicator<PwmaIndicator>();
|
||||
[Fact] public void Qema() => TestIndicator<QemaIndicator>();
|
||||
[Fact] public void Rema() => TestIndicator<RemaIndicator>();
|
||||
[Fact] public void Rma() => TestIndicator<RmaIndicator>();
|
||||
[Fact] public void Sinema() => TestIndicator<SinemaIndicator>();
|
||||
[Fact] public void Sma() => TestIndicator<SmaIndicator>();
|
||||
[Fact] public void Smma() => TestIndicator<SmmaIndicator>();
|
||||
[Fact] public void T3() => TestIndicator<T3Indicator>();
|
||||
[Fact] public void Tema() => TestIndicator<TemaIndicator>();
|
||||
[Fact] public void Trima() => TestIndicator<TrimaIndicator>();
|
||||
[Fact] public void Vidya() => TestIndicator<VidyaIndicator>();
|
||||
[Fact] public void Wma() => TestIndicator<WmaIndicator>();
|
||||
[Fact] public void Zlema() => TestIndicator<ZlemaIndicator>();
|
||||
|
||||
// Statistics Indicators
|
||||
[Fact] public void Curvature() => TestIndicator<CurvatureIndicator>("curvature");
|
||||
[Fact] public void Entropy() => TestIndicator<EntropyIndicator>("entropy");
|
||||
[Fact] public void Kurtosis() => TestIndicator<KurtosisIndicator>("kurtosis");
|
||||
[Fact] public void Max() => TestIndicator<MaxIndicator>("ma");
|
||||
[Fact] public void Median() => TestIndicator<MedianIndicator>("med");
|
||||
[Fact] public void Min() => TestIndicator<MinIndicator>("mi");
|
||||
[Fact] public void Mode() => TestIndicator<ModeIndicator>("mode");
|
||||
[Fact] public void Percentile() => TestIndicator<PercentileIndicator>("percentile");
|
||||
[Fact] public void Skew() => TestIndicator<SkewIndicator>("skew");
|
||||
[Fact] public void Slope() => TestIndicator<SlopeIndicator>("slope");
|
||||
[Fact] public void Stddev() => TestIndicator<StddevIndicator>("stddev");
|
||||
[Fact] public void Variance() => TestIndicator<VarianceIndicator>("variance");
|
||||
[Fact] public void Zscore() => TestIndicator<ZscoreIndicator>("zScore");
|
||||
|
||||
// Volatility Indicators
|
||||
[Fact] public void Atr() => TestIndicator<AtrIndicator>("atr");
|
||||
[Fact] public void Cmo() => TestIndicator<CmoIndicator>("cmo");
|
||||
[Fact] public void Cvi() => TestIndicator<CviIndicator>("cvi");
|
||||
[Fact] public void Historical() => TestIndicator<HistoricalIndicator>("historical");
|
||||
[Fact] public void Jbands() => TestIndicatorMultipleFields<JbandsIndicator>(new[] { "jmaUp", "jmaLo" });
|
||||
[Fact] public void Jvolty() => TestIndicator<JvoltyIndicator>("jma");
|
||||
[Fact] public void Realized() => TestIndicator<RealizedIndicator>("realized");
|
||||
[Fact] public void Rvi() => TestIndicator<RviIndicator>("rvi");
|
||||
|
||||
// Momentum Indicators
|
||||
[Fact] public void Adx() => TestIndicator<momentum::QuanTAlib.AdxIndicator>("adx");
|
||||
[Fact] public void Adxr() => TestIndicator<momentum::QuanTAlib.AdxrIndicator>("adxr");
|
||||
[Fact] public void Apo() => TestIndicator<momentum::QuanTAlib.ApoIndicator>("apo");
|
||||
[Fact] public void Dmi() => TestIndicator<momentum::QuanTAlib.DmiIndicator>("dmi");
|
||||
[Fact] public void Dmx() => TestIndicator<momentum::QuanTAlib.DmxIndicator>("dmx");
|
||||
[Fact] public void Dpo() => TestIndicator<momentum::QuanTAlib.DpoIndicator>("dpo");
|
||||
[Fact] public void Macd() => TestIndicator<momentum::QuanTAlib.MacdIndicator>("macd");
|
||||
[Fact] public void Mom() => TestIndicator<momentum::QuanTAlib.MomIndicator>("Series");
|
||||
[Fact] public void Pmo() => TestIndicator<momentum::QuanTAlib.PmoIndicator>("Series");
|
||||
[Fact] public void Po() => TestIndicator<momentum::QuanTAlib.PoIndicator>("Series");
|
||||
[Fact] public void Ppo() => TestIndicator<momentum::QuanTAlib.PpoIndicator>("Series");
|
||||
[Fact] public void Roc() => TestIndicator<momentum::QuanTAlib.RocIndicator>("Series");
|
||||
[Fact] public void Trix() => TestIndicator<momentum::QuanTAlib.TrixIndicator>("Series");
|
||||
[Fact] public void Vel() => TestIndicator<momentum::QuanTAlib.VelIndicator>("Series");
|
||||
[Fact] public void Vortex() => TestIndicatorMultipleFields<momentum::QuanTAlib.VortexIndicator>(new[] { "PlusLine", "MinusLine" });
|
||||
|
||||
// Oscillators Indicators
|
||||
[Fact] public void Cti() => TestIndicator<oscillators::QuanTAlib.CtiIndicator>("Series");
|
||||
}
|
||||
}
|
||||
@@ -1,354 +0,0 @@
|
||||
using Xunit;
|
||||
using Skender.Stock.Indicators;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
#pragma warning disable S1944, S2053, S2222, S2259, S2583, S2589, S3329, S3655, S3900, S3949, S3966, S4158, S4347, S5773, S6781
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class SkenderTests
|
||||
{
|
||||
private readonly TBarSeries bars;
|
||||
private readonly GbmFeed feed;
|
||||
private readonly RandomNumberGenerator rng;
|
||||
private readonly double range;
|
||||
private int period;
|
||||
private readonly int iterations = 3; // Initialized directly at declaration
|
||||
private readonly IEnumerable<Quote> quotes;
|
||||
|
||||
public SkenderTests()
|
||||
{
|
||||
rng = RandomNumberGenerator.Create();
|
||||
feed = new(sigma: 0.5, mu: 0.0);
|
||||
bars = new(feed);
|
||||
range = 1e-9;
|
||||
feed.Add(10000);
|
||||
quotes = bars.Select(q => new Quote
|
||||
{
|
||||
Date = q.Time,
|
||||
Open = (decimal)q.Open,
|
||||
High = (decimal)q.High,
|
||||
Low = (decimal)q.Low,
|
||||
Close = (decimal)q.Close,
|
||||
Volume = (decimal)q.Volume
|
||||
});
|
||||
}
|
||||
|
||||
private int GetRandomNumber(int minValue, int maxValue)
|
||||
{
|
||||
byte[] randomBytes = new byte[4];
|
||||
rng.GetBytes(randomBytes);
|
||||
int randomInt = BitConverter.ToInt32(randomBytes, 0);
|
||||
return Math.Abs(randomInt % (maxValue - minValue)) + minValue;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Sma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetSma(lookbackPeriods: period).Select(i => i.Sma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMAEMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Ema ma = new(period, useSma: true);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetEma(lookbackPeriods: period).Select(i => i.Ema.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Ema ma = new(period, useSma: false);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetEma(lookbackPeriods: period).Select(i => i.Ema.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > QL.Length - 500; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DEMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Dema ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetDema(lookbackPeriods: period).Select(i => i.Dema.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > QL.Length - 500; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TEMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Tema ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetTema(lookbackPeriods: period).Select(i => i.Tema.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > QL.Length - 500; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMAConvolution()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
double[] kernel = Enumerable.Repeat(1.0, period).ToArray();
|
||||
Convolution ma = new(kernel);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetSma(lookbackPeriods: period).Select(i => i.Sma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Wma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetWma(lookbackPeriods: period).Select(i => i.Wma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period + 2; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Hma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetHma(lookbackPeriods: period).Select(i => i.Hma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period + 5; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EPMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Epma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetEpma(lookbackPeriods: period).Select(i => i.Epma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period + 5; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ALMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Alma ma = new(period, offset: 0.85, sigma: 6);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetAlma(lookbackPeriods: period).Select(i => i.Alma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void T3()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
T3 ma = new(period, vfactor: 0.7, useSma: false);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetT3(lookbackPeriods: period, volumeFactor: 0.7).Select(i => i.T3.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Smma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetSmma(lookbackPeriods: period).Select(i => i.Smma.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void KAMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Kama ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.GetKama(erPeriods: period).Select(i => i.Kama.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MAMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
Mama ma = new(fastLimit: 0.5, slowLimit: 0.05);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.Select(q => (q.Date, (double)q.Close))
|
||||
.GetMama(fastLimit: 0.5, slowLimit: 0.05)
|
||||
.Select(i => i.Mama.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > 500; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MGDI()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Mgdi ma = new(period: period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
var SK = quotes.Select(q => (q.Date, (double)q.Close))
|
||||
.GetDynamic(lookbackPeriods: period)
|
||||
.Select(i => i.Dynamic.Null2NaN()!);
|
||||
Assert.Equal(QL.Length, SK.Count());
|
||||
for (int i = QL.Length - 1; i > period + 5; i--)
|
||||
{
|
||||
Assert.InRange(SK.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ATR()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
period = GetRandomNumber(5, 55);
|
||||
Atr ma = new(period: period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in bars) { QL.Add(ma.Calc(item)); }
|
||||
|
||||
var atrValues = quotes.GetAtr(lookbackPeriods: period).Select(i => i.Atr.Null2NaN()!);
|
||||
const int AdditionalPeriods = 500;
|
||||
|
||||
for (int i = QL.Length - 1; i > 1000 + AdditionalPeriods; i--)
|
||||
{
|
||||
Assert.InRange(atrValues.ElementAt(i) - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
using Xunit;
|
||||
using TALib;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib;
|
||||
|
||||
public class TAlibTests
|
||||
{
|
||||
private readonly GbmFeed feed;
|
||||
private readonly RandomNumberGenerator rng;
|
||||
private readonly double range;
|
||||
private readonly int iterations;
|
||||
private readonly double[] data;
|
||||
private readonly double[] TALIB;
|
||||
|
||||
public TAlibTests()
|
||||
{
|
||||
rng = RandomNumberGenerator.Create();
|
||||
feed = new(sigma: 0.5, mu: 0.0);
|
||||
range = 1e-9;
|
||||
feed.Add(10000);
|
||||
iterations = 3;
|
||||
data = feed.Close.v.ToArray();
|
||||
TALIB = new double[data.Count()];
|
||||
}
|
||||
|
||||
private int GetRandomNumber(int minValue, int maxValue)
|
||||
{
|
||||
byte[] randomBytes = new byte[4];
|
||||
rng.GetBytes(randomBytes);
|
||||
int randomInt = BitConverter.ToInt32(randomBytes, 0);
|
||||
return Math.Abs(randomInt % (maxValue - minValue)) + minValue;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Sma ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
Core.Sma(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period);
|
||||
Assert.Equal(QL.Length, TALIB.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Ema ma = new(period, useSma: true);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
Core.Ema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period);
|
||||
Assert.Equal(QL.Length, TALIB.Count());
|
||||
for (int i = QL.Length - 1; i > period; i--)
|
||||
{
|
||||
Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DEMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Dema ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
Core.Dema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period);
|
||||
Assert.Equal(QL.Length, TALIB.Length);
|
||||
for (int i = QL.Length - 1; i > period * 20; i--)
|
||||
{
|
||||
Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TEMA()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
Tema ma = new(period);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
Core.Tema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period);
|
||||
Assert.Equal(QL.Length, TALIB.Length);
|
||||
for (int i = QL.Length - 1; i > period * 20; i--)
|
||||
{
|
||||
Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void T3()
|
||||
{
|
||||
for (int run = 0; run < iterations; run++)
|
||||
{
|
||||
int period = GetRandomNumber(5, 55);
|
||||
T3 ma = new(period, vfactor: 0.7, useSma: false);
|
||||
TSeries QL = new();
|
||||
foreach (TBar item in feed)
|
||||
{ QL.Add(ma.Calc(new TValue(item.Time, item.Close))); }
|
||||
Core.T3(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, optInTimePeriod: period, optInVFactor: 0.7);
|
||||
Assert.Equal(QL.Length, TALIB.Length);
|
||||
for (int i = QL.Length - 1; i > period * 20; i--)
|
||||
{
|
||||
Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,529 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class AveragesUpdateTests
|
||||
{
|
||||
private readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();
|
||||
private const int RandomUpdates = 100;
|
||||
private const double ReferenceValue = 100.0;
|
||||
private const int precision = 8;
|
||||
|
||||
private double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return ((double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue * 200) - 100; // Range: -100 to 100
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Afirma_Update()
|
||||
{
|
||||
var indicator = new Afirma(periods: 14, taps: 4, window: Afirma.WindowType.Blackman);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Alma_Update()
|
||||
{
|
||||
var indicator = new Alma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Convolution_Update()
|
||||
{
|
||||
var indicator = new Convolution(new double[] { 1, 2, 3, 2, 1 });
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dema_Update()
|
||||
{
|
||||
var indicator = new Dema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dsma_Update()
|
||||
{
|
||||
var indicator = new Dsma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dwma_Update()
|
||||
{
|
||||
var indicator = new Dwma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ema_Update()
|
||||
{
|
||||
var indicator = new Ema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Epma_Update()
|
||||
{
|
||||
var indicator = new Epma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Frama_Update()
|
||||
{
|
||||
var indicator = new Frama(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Fwma_Update()
|
||||
{
|
||||
var indicator = new Fwma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gma_Update()
|
||||
{
|
||||
var indicator = new Gma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hma_Update()
|
||||
{
|
||||
var indicator = new Hma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Htit_Update()
|
||||
{
|
||||
var indicator = new Htit();
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hwma_Update()
|
||||
{
|
||||
var indicator = new Hwma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Jma_Update()
|
||||
{
|
||||
var indicator = new Jma(period: 14, phase: 0);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Kama_Update()
|
||||
{
|
||||
var indicator = new Kama(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ltma_Update()
|
||||
{
|
||||
var indicator = new Ltma(gamma: 0.2);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Maaf_Update()
|
||||
{
|
||||
var indicator = new Maaf(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mama_Update()
|
||||
{
|
||||
var indicator = new Mama(fastLimit: 0.5, slowLimit: 0.05);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mgdi_Update()
|
||||
{
|
||||
var indicator = new Mgdi(period: 14, kFactor: 0.6);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mma_Update()
|
||||
{
|
||||
var indicator = new Mma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pwma_Update()
|
||||
{
|
||||
var indicator = new Pwma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Qema_Update()
|
||||
{
|
||||
var indicator = new Qema(k1: 0.2, k2: 0.2, k3: 0.2, k4: 0.2);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rema_Update()
|
||||
{
|
||||
var indicator = new Rema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rma_Update()
|
||||
{
|
||||
var indicator = new Rma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sinema_Update()
|
||||
{
|
||||
var indicator = new Sinema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sma_Update()
|
||||
{
|
||||
var indicator = new Sma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Smma_Update()
|
||||
{
|
||||
var indicator = new Smma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void T3_Update()
|
||||
{
|
||||
var indicator = new T3(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tema_Update()
|
||||
{
|
||||
var indicator = new Tema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Trima_Update()
|
||||
{
|
||||
var indicator = new Trima(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vidya_Update()
|
||||
{
|
||||
var indicator = new Vidya(shortPeriod: 14, longPeriod: 30, alpha: 0.2);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Wma_Update()
|
||||
{
|
||||
var indicator = new Wma(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Zlema_Update()
|
||||
{
|
||||
var indicator = new Zlema(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
}
|
||||
@@ -1,259 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class UpdateTests
|
||||
{
|
||||
private readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();
|
||||
private const int RandomUpdates = 100;
|
||||
private const double ReferenceValue = 100.0;
|
||||
private const int precision = 8;
|
||||
|
||||
private double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return ((double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue * 200) - 100; // Range: -100 to 100
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Huberloss_Update()
|
||||
{
|
||||
var indicator = new Huber(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mae_Update()
|
||||
{
|
||||
var indicator = new Mae(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mapd_Update()
|
||||
{
|
||||
var indicator = new Mapd(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mape_Update()
|
||||
{
|
||||
var indicator = new Mape(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mase_Update()
|
||||
{
|
||||
var indicator = new Mase(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mda_Update()
|
||||
{
|
||||
var indicator = new Mda(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Me_Update()
|
||||
{
|
||||
var indicator = new Me(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mpe_Update()
|
||||
{
|
||||
var indicator = new Mpe(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mse_Update()
|
||||
{
|
||||
var indicator = new Mse(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Msle_Update()
|
||||
{
|
||||
var indicator = new Msle(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rae_Update()
|
||||
{
|
||||
var indicator = new Rae(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rmse_Update()
|
||||
{
|
||||
var indicator = new Rmse(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rmsle_Update()
|
||||
{
|
||||
var indicator = new Rmsle(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rse_Update()
|
||||
{
|
||||
var indicator = new Rse(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Smape_Update()
|
||||
{
|
||||
var indicator = new Smape(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rsquared_Update()
|
||||
{
|
||||
var indicator = new Rsquared(period: 14);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
}
|
||||
@@ -1,292 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class MomentumUpdateTests
|
||||
{
|
||||
private readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();
|
||||
private const int RandomUpdates = 100;
|
||||
private const double ReferenceValue = 100.0;
|
||||
private const int precision = 8;
|
||||
|
||||
private double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return ((double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue * 200) - 100; // Range: -100 to 100
|
||||
}
|
||||
|
||||
private TBar GetRandomBar(bool IsNew)
|
||||
{
|
||||
double open = GetRandomDouble();
|
||||
double high = open + Math.Abs(GetRandomDouble());
|
||||
double low = open - Math.Abs(GetRandomDouble());
|
||||
double close = low + ((high - low) * GetRandomDouble());
|
||||
return new TBar(DateTime.Now, open, high, low, close, 1000, IsNew);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Adx_Update()
|
||||
{
|
||||
var indicator = new Adx(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Adxr_Update()
|
||||
{
|
||||
var indicator = new Adxr(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Apo_Update()
|
||||
{
|
||||
var indicator = new Apo(fastPeriod: 12, slowPeriod: 26);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dmi_Update()
|
||||
{
|
||||
var indicator = new Dmi(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dmx_Update()
|
||||
{
|
||||
var indicator = new Dmx(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dpo_Update()
|
||||
{
|
||||
var indicator = new Dpo(period: 20);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Macd_Update()
|
||||
{
|
||||
var indicator = new Macd(fastPeriod: 12, slowPeriod: 26, signalPeriod: 9);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble() + 100, IsNew: false)); // Ensure positive prices
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pmo_Update()
|
||||
{
|
||||
var indicator = new Pmo(period1: 35, period2: 20);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Po_Update()
|
||||
{
|
||||
var indicator = new Po(fastPeriod: 10, slowPeriod: 21);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ppo_Update()
|
||||
{
|
||||
var indicator = new Ppo(fastPeriod: 12, slowPeriod: 26);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Prs_Update()
|
||||
{
|
||||
var indicator = new Prs();
|
||||
indicator.SetBenchmark(ReferenceValue);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.SetBenchmark(GetRandomDouble() + 100); // Ensure positive benchmark
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
|
||||
indicator.SetBenchmark(ReferenceValue);
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Roc_Update()
|
||||
{
|
||||
var indicator = new Roc(period: 12);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble() + 100, IsNew: false)); // Ensure positive prices
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mom_Update()
|
||||
{
|
||||
var indicator = new Mom(period: 10);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Trix_Update()
|
||||
{
|
||||
var indicator = new Trix(period: 18);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble() + 100, IsNew: false)); // Ensure positive prices
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tsi_Update()
|
||||
{
|
||||
var indicator = new Tsi(firstPeriod: 25, secondPeriod: 13);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble() + 100, IsNew: false)); // Ensure positive prices
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vel_Update()
|
||||
{
|
||||
var indicator = new Vel(period: 10);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vortex_Update()
|
||||
{
|
||||
var indicator = new Vortex(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
using Xunit;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class OscillatorsUpdateTests : UpdateTestBase
|
||||
{
|
||||
[Fact]
|
||||
public void Rsi_Update()
|
||||
{
|
||||
var indicator = new Rsi(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rsx_Update()
|
||||
{
|
||||
var indicator = new Rsx(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cmo_Update()
|
||||
{
|
||||
var indicator = new Cmo(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ao_Update()
|
||||
{
|
||||
var indicator = new Ao();
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ac_Update()
|
||||
{
|
||||
var indicator = new Ac();
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Aroon_Update()
|
||||
{
|
||||
var indicator = new Aroon(period: 25);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Bop_Update()
|
||||
{
|
||||
var indicator = new Bop();
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cci_Update()
|
||||
{
|
||||
var indicator = new Cci(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cfo_Update()
|
||||
{
|
||||
var indicator = new Cfo(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Chop_Update()
|
||||
{
|
||||
var indicator = new Chop(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cog_Update()
|
||||
{
|
||||
var indicator = new Cog(period: 10);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Coppock_Update()
|
||||
{
|
||||
var indicator = new Coppock(roc1Period: 14, roc2Period: 11, wmaPeriod: 10);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Crsi_Update()
|
||||
{
|
||||
var indicator = new Crsi(period1: 10, period2: 14, period3: 30);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Smi_Update()
|
||||
{
|
||||
var indicator = new Smi(period: 10, smooth1: 3, smooth2: 3);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Srsi_Update()
|
||||
{
|
||||
var indicator = new Srsi(rsiPeriod: 14, stochPeriod: 14, smoothK: 3, smoothD: 3);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Stc_Update()
|
||||
{
|
||||
var indicator = new Stc(cyclePeriod: 10, fastPeriod: 23, slowPeriod: 50);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Stoch_Update()
|
||||
{
|
||||
var indicator = new Stoch(period: 14, smoothK: 3, smoothD: 3);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tsi_Update()
|
||||
{
|
||||
var indicator = new Tsi(firstPeriod: 25, secondPeriod: 13);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Uo_Update()
|
||||
{
|
||||
var indicator = new Uo(period1: 7, period2: 14, period3: 28);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Willr_Update()
|
||||
{
|
||||
var indicator = new Willr(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dosc_Update()
|
||||
{
|
||||
var indicator = new Dosc();
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Efi_Update()
|
||||
{
|
||||
var indicator = new Efi(period: 13);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Fisher_Update()
|
||||
{
|
||||
var indicator = new Fisher(period: 10);
|
||||
double initialValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: true));
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TValue(DateTime.Now, GetRandomDouble(), IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TValue(DateTime.Now, ReferenceValue, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cti_Update()
|
||||
{
|
||||
var indicator = new Cti(period: 20);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
using Xunit;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class StatisticsUpdateTests : UpdateTestBase
|
||||
{
|
||||
[Fact]
|
||||
public void Beta_Update()
|
||||
{
|
||||
var indicator = new Beta(period: 14);
|
||||
TestDualTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Corr_Update()
|
||||
{
|
||||
var indicator = new Corr(period: 14);
|
||||
TestDualTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Curvature_Update()
|
||||
{
|
||||
var indicator = new Curvature(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Entropy_Update()
|
||||
{
|
||||
var indicator = new Entropy(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hurst_Update()
|
||||
{
|
||||
var indicator = new Hurst(period: 100, minLength: 10);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Kurtosis_Update()
|
||||
{
|
||||
var indicator = new Kurtosis(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Max_Update()
|
||||
{
|
||||
var indicator = new Max(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Median_Update()
|
||||
{
|
||||
var indicator = new Median(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Min_Update()
|
||||
{
|
||||
var indicator = new Min(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mode_Update()
|
||||
{
|
||||
var indicator = new Mode(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Percentile_Update()
|
||||
{
|
||||
var indicator = new Percentile(period: 14, percent: 50);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Skew_Update()
|
||||
{
|
||||
var indicator = new Skew(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Slope_Update()
|
||||
{
|
||||
var indicator = new Slope(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Stddev_Update()
|
||||
{
|
||||
var indicator = new Stddev(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Theil_Update()
|
||||
{
|
||||
var indicator = new Theil(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tsf_Update()
|
||||
{
|
||||
var indicator = new Tsf(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Variance_Update()
|
||||
{
|
||||
var indicator = new Variance(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Zscore_Update()
|
||||
{
|
||||
var indicator = new Zscore(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
}
|
||||
@@ -1,223 +0,0 @@
|
||||
using Xunit;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class VolatilityUpdateTests : UpdateTestBase
|
||||
{
|
||||
[Fact]
|
||||
public void Adr_Update()
|
||||
{
|
||||
var indicator = new Adr(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Atr_Update()
|
||||
{
|
||||
var indicator = new Atr(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Atrs_Update()
|
||||
{
|
||||
var indicator = new Atrs(period: 14, factor: 2.0);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ap_Update()
|
||||
{
|
||||
var indicator = new Ap(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Atrp_Update()
|
||||
{
|
||||
var indicator = new Atrp(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Bband_Update()
|
||||
{
|
||||
var indicator = new Bband(period: 20, multiplier: 2.0);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ccv_Update()
|
||||
{
|
||||
var indicator = new Ccv(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ce_Update()
|
||||
{
|
||||
var indicator = new Ce(period: 22, multiplier: 3.0);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cv_Update()
|
||||
{
|
||||
var indicator = new Cv(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cvi_Update()
|
||||
{
|
||||
var indicator = new Cvi(period: 10, smoothPeriod: 10);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dchn_Update()
|
||||
{
|
||||
var indicator = new Dchn(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ewma_Update()
|
||||
{
|
||||
var indicator = new Ewma(period: 20, lambda: 0.94);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Fcb_Update()
|
||||
{
|
||||
var indicator = new Fcb(period: 20, smoothing: 0.5);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gkv_Update()
|
||||
{
|
||||
var indicator = new Gkv(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Historical_Update()
|
||||
{
|
||||
var indicator = new Hv(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hlv_Update()
|
||||
{
|
||||
var indicator = new Hlv(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Jvolty_Update()
|
||||
{
|
||||
var indicator = new Jvolty(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Natr_Update()
|
||||
{
|
||||
var indicator = new Natr(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pch_Update()
|
||||
{
|
||||
var indicator = new Pch(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pv_Update()
|
||||
{
|
||||
var indicator = new Pv(period: 10);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Realized_Update()
|
||||
{
|
||||
var indicator = new Rv(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rsv_Update()
|
||||
{
|
||||
var indicator = new Rsv(period: 10);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Rvi_Update()
|
||||
{
|
||||
var indicator = new Rvi(period: 14);
|
||||
TestTValueUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sv_Update()
|
||||
{
|
||||
var indicator = new Sv(period: 20, lambda: 0.94);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tr_Update()
|
||||
{
|
||||
var indicator = new Tr();
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Ui_Update()
|
||||
{
|
||||
var indicator = new Ui(period: 14);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vc_Update()
|
||||
{
|
||||
var indicator = new Vc(period: 20, deviations: 2.0);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vov_Update()
|
||||
{
|
||||
var indicator = new Vov(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vr_Update()
|
||||
{
|
||||
var indicator = new Vr(shortPeriod: 10, longPeriod: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vs_Update()
|
||||
{
|
||||
var indicator = new Vs(period: 14, multiplier: 2.0);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Yzv_Update()
|
||||
{
|
||||
var indicator = new Yzv(period: 20);
|
||||
TestTBarUpdate(indicator, indicator.Calc);
|
||||
}
|
||||
}
|
||||
@@ -1,386 +0,0 @@
|
||||
using Xunit;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace QuanTAlib.Tests;
|
||||
|
||||
public class VolumeUpdateTests
|
||||
{
|
||||
private readonly RandomNumberGenerator rng = RandomNumberGenerator.Create();
|
||||
private const int RandomUpdates = 100;
|
||||
private const int precision = 8;
|
||||
|
||||
private double GetRandomDouble()
|
||||
{
|
||||
byte[] bytes = new byte[8];
|
||||
rng.GetBytes(bytes);
|
||||
return ((double)BitConverter.ToUInt64(bytes, 0) / ulong.MaxValue * 200) - 100; // Range: -100 to 100
|
||||
}
|
||||
|
||||
private TBar GetRandomBar(bool IsNew)
|
||||
{
|
||||
double open = GetRandomDouble();
|
||||
double high = open + Math.Abs(GetRandomDouble());
|
||||
double low = open - Math.Abs(GetRandomDouble());
|
||||
double close = low + ((high - low) * GetRandomDouble());
|
||||
double volume = Math.Abs(GetRandomDouble()) * 1000; // Random positive volume
|
||||
return new TBar(DateTime.Now, open, high, low, close, volume, IsNew);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Adl_Update()
|
||||
{
|
||||
var indicator = new Adl();
|
||||
TBar r = GetRandomBar(true);
|
||||
|
||||
// First calculation with IsNew: true
|
||||
double value1 = indicator.Calc(r);
|
||||
|
||||
// Multiple recalculations with IsNew: false should not change the value
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
}
|
||||
|
||||
// Final calculation with IsNew: false should match initial value
|
||||
double value2 = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
Assert.Equal(value1, value2, precision);
|
||||
|
||||
// New calculation with IsNew: true should update the value
|
||||
double value3 = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: true));
|
||||
Assert.NotEqual(value1, value3, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Adosc_Update()
|
||||
{
|
||||
var indicator = new Adosc(shortPeriod: 3, longPeriod: 10);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Aobv_Update()
|
||||
{
|
||||
var indicator = new Aobv();
|
||||
TBar r = GetRandomBar(true);
|
||||
|
||||
// First calculation with IsNew: true
|
||||
double value1 = indicator.Calc(r);
|
||||
|
||||
// Multiple recalculations with IsNew: false should not change the value
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
}
|
||||
|
||||
// Final calculation with IsNew: false should match initial value
|
||||
double value2 = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
Assert.Equal(value1, value2, precision);
|
||||
|
||||
// New calculation with IsNew: true should update the value
|
||||
double value3 = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: true));
|
||||
Assert.NotEqual(value1, value3, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cmf_Update()
|
||||
{
|
||||
var indicator = new Cmf(period: 20);
|
||||
TBar r = GetRandomBar(true);
|
||||
|
||||
// Generate a sequence of bars for warmup
|
||||
var warmupBars = new List<TBar>();
|
||||
for (int i = 0; i < indicator.WarmupPeriod; i++)
|
||||
{
|
||||
var bar = GetRandomBar(IsNew: true);
|
||||
warmupBars.Add(bar);
|
||||
indicator.Calc(bar);
|
||||
}
|
||||
|
||||
// Calculate initial value after warmup
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
// Apply random updates
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
|
||||
// Reset and replay the same sequence
|
||||
indicator.Init();
|
||||
foreach (var bar in warmupBars)
|
||||
{
|
||||
indicator.Calc(bar);
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Eom_Update()
|
||||
{
|
||||
var indicator = new Eom(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Kvo_Update()
|
||||
{
|
||||
var indicator = new Kvo(shortPeriod: 34, longPeriod: 55);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Mfi_Update()
|
||||
{
|
||||
var indicator = new Mfi(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
|
||||
// Generate a sequence of bars for warmup
|
||||
var warmupBars = new List<TBar>();
|
||||
for (int i = 0; i < indicator.WarmupPeriod; i++)
|
||||
{
|
||||
var bar = GetRandomBar(IsNew: true);
|
||||
warmupBars.Add(bar);
|
||||
indicator.Calc(bar);
|
||||
}
|
||||
|
||||
// Calculate initial value after warmup
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
// Apply random updates
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
|
||||
// Reset and replay the same sequence
|
||||
indicator.Init();
|
||||
foreach (var bar in warmupBars)
|
||||
{
|
||||
indicator.Calc(bar);
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Nvi_Update()
|
||||
{
|
||||
var indicator = new Nvi();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Obv_Update()
|
||||
{
|
||||
var indicator = new Obv();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pvi_Update()
|
||||
{
|
||||
var indicator = new Pvi();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pvol_Update()
|
||||
{
|
||||
var indicator = new Pvol();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pvo_Update()
|
||||
{
|
||||
var indicator = new Pvo(shortPeriod: 12, longPeriod: 26);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pvr_Update()
|
||||
{
|
||||
var indicator = new Pvr();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pvt_Update()
|
||||
{
|
||||
var indicator = new Pvt();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Tvi_Update()
|
||||
{
|
||||
var indicator = new Tvi(minTick: 0.5);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vf_Update()
|
||||
{
|
||||
var indicator = new Vf(period: 13);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vp_Update()
|
||||
{
|
||||
var indicator = new Vp(period: 14);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vwap_Update()
|
||||
{
|
||||
var indicator = new Vwap();
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Vwma_Update()
|
||||
{
|
||||
var indicator = new Vwma(period: 20);
|
||||
TBar r = GetRandomBar(true);
|
||||
double initialValue = indicator.Calc(r);
|
||||
|
||||
for (int i = 0; i < RandomUpdates; i++)
|
||||
{
|
||||
indicator.Calc(GetRandomBar(IsNew: false));
|
||||
}
|
||||
double finalValue = indicator.Calc(new TBar(r.Time, r.Open, r.High, r.Low, r.Close, r.Volume, IsNew: false));
|
||||
|
||||
Assert.Equal(initialValue, finalValue, precision);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,317 @@
|
||||
* **Core concepts**
|
||||
* [Architecture](docs/architecture.md)
|
||||
* [API](docs/api.md)
|
||||
* [Benchmarks](docs/benchmarks.md)
|
||||
* [Indicators](docs/indicators.md)
|
||||
* [Usage Guides](docs/usage.md)
|
||||
* [Integration](docs/integration.md)
|
||||
* [Validation](docs/validation.md)
|
||||
* [MA Qualities](docs/ma-qualities.md)
|
||||
* [Error Metrics](docs/errors.md)
|
||||
|
||||
* **Trends (FIR)**
|
||||
* [Overview](lib/trends_FIR/_index.md)
|
||||
* [ALMA - Arnaud Legoux MA](lib/trends_FIR/alma/Alma.md)
|
||||
* [BLMA - Blackman Window MA](lib/trends_FIR/blma/Blma.md)
|
||||
* [BWMA - Blackman-Harris MA](lib/trends_FIR/bwma/Bwma.md)
|
||||
* [CONV - Convolution](lib/trends_FIR/conv/Conv.md)
|
||||
* [DWMA - Double Weighted MA](lib/trends_FIR/dwma/Dwma.md)
|
||||
* [GWMA - Gaussian Weighted MA](lib/trends_FIR/gwma/Gwma.md)
|
||||
* [HAMMA - Hamming MA](lib/trends_FIR/hamma/Hamma.md)
|
||||
* [HANMA - Hanning MA](lib/trends_FIR/hanma/Hanma.md)
|
||||
* [HMA - Hull MA](lib/trends_FIR/hma/Hma.md)
|
||||
* [HWMA - Henderson Weighted MA](lib/trends_FIR/hwma/Hwma.md)
|
||||
* [LSMA - Least Squares MA](lib/trends_FIR/lsma/Lsma.md)
|
||||
* [PWMA - Pascal Weighted MA](lib/trends_FIR/pwma/Pwma.md)
|
||||
* [SGMA - Savitzky-Golay MA](lib/trends_FIR/sgma/Sgma.md)
|
||||
* [SINEMA - Sine Weighted MA](lib/trends_FIR/sinema/Sinema.md)
|
||||
* [SMA - Simple MA](lib/trends_FIR/sma/Sma.md)
|
||||
* [TRIMA - Triangular MA](lib/trends_FIR/trima/Trima.md)
|
||||
* [WMA - Weighted MA](lib/trends_FIR/wma/Wma.md)
|
||||
|
||||
* **Trends (IIR)**
|
||||
* [Overview](lib/trends_IIR/_index.md)
|
||||
* [DEMA - Double Exponential MA](lib/trends_IIR/dema/Dema.md)
|
||||
* [DSMA - Deviation-Scaled MA](lib/trends_IIR/dsma/Dsma.md)
|
||||
* [EMA - Exponential MA](lib/trends_IIR/ema/Ema.md)
|
||||
* [FRAMA - Fractal Adaptive MA](lib/trends_IIR/frama/Frama.md)
|
||||
* [HEMA - Hull Exponential MA](lib/trends_IIR/hema/Hema.md)
|
||||
* [HTIT - Hilbert Transform Instant Trendline](lib/trends_IIR/htit/Htit.md)
|
||||
* [JMA - Jurik MA](lib/trends_IIR/jma/Jma.md)
|
||||
* [KAMA - Kaufman Adaptive MA](lib/trends_IIR/kama/Kama.md)
|
||||
* [MAMA - MESA Adaptive MA](lib/trends_IIR/mama/Mama.md)
|
||||
* [MGDI - McGinley Dynamic](lib/trends_IIR/mgdi/Mgdi.md)
|
||||
* [MMA - Modified MA](lib/trends_IIR/mma/Mma.md)
|
||||
* [QEMA - Quadruple Exponential MA](lib/trends_IIR/qema/Qema.md)
|
||||
* [REMA - Regularized Exponential MA](lib/trends_IIR/rema/Rema.md)
|
||||
* [RGMA - Recursive Gaussian MA](lib/trends_IIR/rgma/Rgma.md)
|
||||
* [RMA - Rolling MA](lib/trends_IIR/rma/Rma.md)
|
||||
* [T3 - Tillson T3 MA](lib/trends_IIR/t3/T3.md)
|
||||
* [TEMA - Triple Exponential MA](lib/trends_IIR/tema/Tema.md)
|
||||
* [VAMA - Volatility Adjusted MA](lib/trends_IIR/vama/Vama.md)
|
||||
* [VIDYA - Variable Index Dynamic Average](lib/trends_IIR/vidya/Vidya.md)
|
||||
* [YZVAMA - Yang-Zhang Volatility Adjusted MA](lib/trends_IIR/yzvama/Yzvama.md)
|
||||
* [ZLEMA - Zero-Lag Exponential MA](lib/trends_IIR/zlema/Zlema.md)
|
||||
|
||||
* **Filters**
|
||||
* [Overview](lib/filters/_index.md)
|
||||
* [BESSEL - Bessel Filter](lib/filters/bessel/Bessel.md)
|
||||
* [BILATERAL - Bilateral Filter](lib/filters/bilateral/Bilateral.md)
|
||||
* [BPF - Bandpass Filter](lib/filters/bpf/Bpf.md)
|
||||
* [BUTTER - Butterworth Filter](lib/filters/butter/Butter.md)
|
||||
* [CHEBY1 - Chebyshev Type I](lib/filters/cheby1/Cheby1.md)
|
||||
* [CHEBY2 - Chebyshev Type II](lib/filters/cheby2/Cheby2.md)
|
||||
* [ELLIPTIC - Elliptic Filter](lib/filters/elliptic/Elliptic.md)
|
||||
* [GAUSS - Gaussian Filter](lib/filters/gauss/Gauss.md)
|
||||
* [HANN - Hann Filter](lib/filters/hann/Hann.md)
|
||||
* [HP - Hodrick-Prescott Filter](lib/filters/hp/Hp.md)
|
||||
* [HPF - High Pass Filter](lib/filters/hpf/Hpf.md)
|
||||
* [KALMAN - Kalman Filter](lib/filters/kalman/Kalman.md)
|
||||
* [LOESS - LOESS Smoothing](lib/filters/loess/Loess.md)
|
||||
* [NOTCH - Notch Filter](lib/filters/notch/Notch.md)
|
||||
* [SGF - Savitzky-Golay Filter](lib/filters/sgf/Sgf.md)
|
||||
* [SSF - Ehlers Super Smooth Filter](lib/filters/ssf/Ssf.md)
|
||||
* [USF - Ehlers Ultimate Smoother Filter](lib/filters/usf/Usf.md)
|
||||
* [WIENER - Wiener Filter](lib/filters/wiener/Wiener.md)
|
||||
|
||||
* **Dynamics**
|
||||
* [Overview](lib/dynamics/_index.md)
|
||||
* [ADX - Average Directional Index](lib/dynamics/adx/Adx.md)
|
||||
* [ADXR - Average Directional Movement Rating](lib/dynamics/adxr/Adxr.md)
|
||||
* [ALLIGATOR - Williams Alligator](lib/dynamics/alligator/Alligator.md)
|
||||
* [AMAT - Archer Moving Averages Trends](lib/dynamics/amat/Amat.md)
|
||||
* [AROON - Aroon](lib/dynamics/aroon/Aroon.md)
|
||||
* [AROONOSC - Aroon Oscillator](lib/dynamics/aroonosc/AroonOsc.md)
|
||||
* [CHOP - Choppiness Index](lib/dynamics/chop/Chop.md)
|
||||
* [DMX - Jurik Directional Movement Index](lib/dynamics/dmx/Dmx.md)
|
||||
* [DX - Directional Movement Index](lib/dynamics/dx/Dx.md)
|
||||
* [HT_TRENDMODE - Hilbert Transform Trend Mode](lib/dynamics/ht_trendmode/HtTrendmode.md)
|
||||
* [ICHIMOKU - Ichimoku Cloud](lib/dynamics/ichimoku/Ichimoku.md)
|
||||
* [IMI - Intraday Momentum Index](lib/dynamics/imi/Imi.md)
|
||||
* [QSTICK - Qstick Indicator](lib/dynamics/qstick/Qstick.md)
|
||||
* [SUPER - SuperTrend](lib/dynamics/super/Super.md)
|
||||
* [TTM - TTM Trend](lib/dynamics/ttm/Ttm.md)
|
||||
* [VORTEX - Vortex Indicator](lib/dynamics/vortex/Vortex.md)
|
||||
|
||||
* **Oscillators**
|
||||
* [Overview](lib/oscillators/_index.md)
|
||||
* [AC - Acceleration Oscillator](lib/oscillators/ac/Ac.md)
|
||||
* [AO - Awesome Oscillator](lib/oscillators/ao/Ao.md)
|
||||
* [APO - Absolute Price Oscillator](lib/oscillators/apo/Apo.md)
|
||||
* [BBB - Bollinger %B](lib/oscillators/bbb/Bbb.md)
|
||||
* [BBS - Bollinger Band Squeeze](lib/oscillators/bbs/Bbs.md)
|
||||
* [CFO - Chande Forecast Oscillator](lib/oscillators/cfo/Cfo.md)
|
||||
* [DPO - Detrended Price Oscillator](lib/oscillators/dpo/Dpo.md)
|
||||
* [FISHER - Fisher Transform](lib/oscillators/fisher/Fisher.md)
|
||||
* [INERTIA - Inertia](lib/oscillators/inertia/Inertia.md)
|
||||
* [KDJ - KDJ Indicator](lib/oscillators/kdj/Kdj.md)
|
||||
* [PGO - Pretty Good Oscillator](lib/oscillators/pgo/Pgo.md)
|
||||
* [SMI - Stochastic Momentum Index](lib/oscillators/smi/Smi.md)
|
||||
* [STOCH - Stochastic Oscillator](lib/oscillators/stoch/Stoch.md)
|
||||
* [STOCHF - Stochastic Fast](lib/oscillators/stochf/Stochf.md)
|
||||
* [STOCHRSI - Stochastic RSI](lib/oscillators/stochrsi/Stochrsi.md)
|
||||
* [TRIX - Triple Exponential Average](lib/oscillators/trix/Trix.md)
|
||||
* [ULTOSC - Ultimate Oscillator](lib/oscillators/ultosc/Ultosc.md)
|
||||
* [WILLR - Williams %R](lib/oscillators/willr/Willr.md)
|
||||
|
||||
* **Momentum**
|
||||
* [Overview](lib/momentum/_index.md)
|
||||
* [APO - Absolute Price Oscillator](lib/momentum/apo/Apo.md)
|
||||
* [BOP - Balance of Power](lib/momentum/bop/Bop.md)
|
||||
* [CCI - Commodity Channel Index](lib/momentum/cci/Cci.md)
|
||||
* [CFB - Jurik Composite Fractal Behavior](lib/momentum/cfb/Cfb.md)
|
||||
* [CMO - Chande Momentum Oscillator](lib/momentum/cmo/Cmo.md)
|
||||
* [MACD - Moving Average Convergence Divergence](lib/momentum/macd/Macd.md)
|
||||
* [MOM - Momentum](lib/momentum/mom/Mom.md)
|
||||
* [PMO - Price Momentum Oscillator](lib/momentum/pmo/Pmo.md)
|
||||
* [PPO - Percentage Price Oscillator](lib/momentum/ppo/Ppo.md)
|
||||
* [PRS - Price Relative Strength](lib/momentum/prs/Prs.md)
|
||||
* [ROC - Rate of Change](lib/momentum/roc/Roc.md)
|
||||
* [ROCP - Rate of Change Percentage](lib/momentum/rocp/Rocp.md)
|
||||
* [ROCR - Rate of Change Ratio](lib/momentum/rocr/Rocr.md)
|
||||
* [RSI - Relative Strength Index](lib/momentum/rsi/Rsi.md)
|
||||
* [RSX - Jurik Relative Strength X](lib/momentum/rsx/Rsx.md)
|
||||
* [TSI - True Strength Index](lib/momentum/tsi/Tsi.md)
|
||||
* [VEL - Jurik Velocity](lib/momentum/vel/Vel.md)
|
||||
|
||||
* **Volatility**
|
||||
* [Overview](lib/volatility/_index.md)
|
||||
* [ADR - Average Daily Range](lib/volatility/adr/Adr.md)
|
||||
* [ATR - Average True Range](lib/volatility/atr/Atr.md)
|
||||
* [ATRN - ATR Normalized](lib/volatility/atrn/Atrn.md)
|
||||
* [ATRP - ATR Percent](lib/volatility/atrp/Atrp.md)
|
||||
* [BBW - Bollinger Band Width](lib/volatility/bbw/Bbw.md)
|
||||
* [BBWN - Bollinger Band Width Normalized](lib/volatility/bbwn/Bbwn.md)
|
||||
* [BBWP - Bollinger Band Width Percentile](lib/volatility/bbwp/Bbwp.md)
|
||||
* [CCV - Close-to-Close Volatility](lib/volatility/ccv/Ccv.md)
|
||||
* [CV - Conditional Volatility](lib/volatility/cv/Cv.md)
|
||||
* [CVI - Chaikin's Volatility](lib/volatility/cvi/Cvi.md)
|
||||
* [EWMA - Exponential Weighted MA Volatility](lib/volatility/ewma/Ewma.md)
|
||||
* [GKV - Garman-Klass Volatility](lib/volatility/gkv/Gkv.md)
|
||||
* [HLV - High-Low Volatility](lib/volatility/hlv/Hlv.md)
|
||||
* [HV - Historical Volatility](lib/volatility/hv/Hv.md)
|
||||
* [JVOLTY - Jurik Volatility](lib/volatility/jvolty/Jvolty.md)
|
||||
* [JVOLTYN - Jurik Volatility Normalized](lib/volatility/jvoltyn/Jvoltyn.md)
|
||||
* [MASSI - Mass Index](lib/volatility/massi/Massi.md)
|
||||
* [NATR - Normalized ATR](lib/volatility/natr/Natr.md)
|
||||
* [PV - Parkinson Volatility](lib/volatility/pv/Pv.md)
|
||||
* [RSV - Rogers-Satchell Volatility](lib/volatility/rsv/Rsv.md)
|
||||
* [RV - Realized Volatility](lib/volatility/rv/Rv.md)
|
||||
* [RVI - Relative Volatility Index](lib/volatility/rvi/Rvi.md)
|
||||
* [TR - True Range](lib/volatility/tr/Tr.md)
|
||||
* [UI - Ulcer Index](lib/volatility/ui/Ui.md)
|
||||
* [VOV - Volatility of Volatility](lib/volatility/vov/Vov.md)
|
||||
* [VR - Volatility Ratio](lib/volatility/vr/Vr.md)
|
||||
* [YZV - Yang-Zhang Volatility](lib/volatility/yzv/Yzv.md)
|
||||
|
||||
* **Volume**
|
||||
* [Overview](lib/volume/_index.md)
|
||||
* [ADL - Accumulation/Distribution Line](lib/volume/adl/Adl.md)
|
||||
* [ADOSC - Chaikin A/D Oscillator](lib/volume/adosc/Adosc.md)
|
||||
* [AOBV - Archer On-Balance Volume](lib/volume/aobv/Aobv.md)
|
||||
* [CMF - Chaikin Money Flow](lib/volume/cmf/Cmf.md)
|
||||
* [EFI - Elder's Force Index](lib/volume/efi/Efi.md)
|
||||
* [EOM - Ease of Movement](lib/volume/eom/Eom.md)
|
||||
* [III - Intraday Intensity Index](lib/volume/iii/Iii.md)
|
||||
* [KVO - Klinger Volume Oscillator](lib/volume/kvo/Kvo.md)
|
||||
* [MFI - Money Flow Index](lib/volume/mfi/Mfi.md)
|
||||
* [NVI - Negative Volume Index](lib/volume/nvi/Nvi.md)
|
||||
* [OBV - On Balance Volume](lib/volume/obv/Obv.md)
|
||||
* [PVD - Price Volume Divergence](lib/volume/pvd/Pvd.md)
|
||||
* [PVI - Positive Volume Index](lib/volume/pvi/Pvi.md)
|
||||
* [PVO - Percentage Volume Oscillator](lib/volume/pvo/Pvo.md)
|
||||
* [PVR - Price Volume Rank](lib/volume/pvr/Pvr.md)
|
||||
* [PVT - Price Volume Trend](lib/volume/pvt/Pvt.md)
|
||||
* [TVI - Trade Volume Index](lib/volume/tvi/Tvi.md)
|
||||
* [TWAP - Time Weighted Average Price](lib/volume/twap/Twap.md)
|
||||
* [VA - Volume Accumulation](lib/volume/va/Va.md)
|
||||
* [VF - Volume Force](lib/volume/vf/Vf.md)
|
||||
* [VO - Volume Oscillator](lib/volume/vo/Vo.md)
|
||||
* [VROC - Volume Rate of Change](lib/volume/vroc/Vroc.md)
|
||||
* [VWAD - Volume Weighted A/D](lib/volume/vwad/Vwad.md)
|
||||
* [VWAP - Volume Weighted Average Price](lib/volume/vwap/Vwap.md)
|
||||
* [VWMA - Volume Weighted MA](lib/volume/vwma/Vwma.md)
|
||||
* [WAD - Williams A/D](lib/volume/wad/Wad.md)
|
||||
|
||||
* **Channels**
|
||||
* [Overview](lib/channels/_index.md)
|
||||
* [ABBER - Aberration Bands](lib/channels/abber/abber.md)
|
||||
* [ACCBANDS - Acceleration Bands](lib/channels/accbands/accbands.md)
|
||||
* [APCHANNEL - Andrews' Pitchfork](lib/channels/apchannel/Apchannel.md)
|
||||
* [APZ - Adaptive Price Zone](lib/channels/apz/apz.md)
|
||||
* [ATRBANDS - ATR Bands](lib/channels/atrbands/Atrbands.md)
|
||||
* [BBANDS - Bollinger Bands](lib/channels/bbands/Bbands.md)
|
||||
* [DCHANNEL - Donchian Channels](lib/channels/dchannel/Dchannel.md)
|
||||
* [DECAYCHANNEL - Decay Min-Max Channel](lib/channels/decaychannel/Decaychannel.md)
|
||||
* [FCB - Fractal Chaos Bands](lib/channels/fcb/Fcb.md)
|
||||
* [JBANDS - Jurik Volatility Bands](lib/channels/jbands/Jbands.md)
|
||||
* [KCHANNEL - Keltner Channel](lib/channels/kchannel/Kchannel.md)
|
||||
* [MAENV - Moving Average Envelope](lib/channels/maenv/Maenv.md)
|
||||
* [MMCHANNEL - Min-Max Channel](lib/channels/mmchannel/Mmchannel.md)
|
||||
* [PCHANNEL - Price Channel](lib/channels/pchannel/Pchannel.md)
|
||||
* [REGCHANNEL - Regression Channels](lib/channels/regchannel/Regchannel.md)
|
||||
* [SDCHANNEL - Standard Deviation Channel](lib/channels/sdchannel/Sdchannel.md)
|
||||
* [STARCHANNEL - Stoller Average Range Channel](lib/channels/starchannel/Starchannel.md)
|
||||
* [STBANDS - Super Trend Bands](lib/channels/stbands/Stbands.md)
|
||||
* [UBANDS - Ultimate Bands](lib/channels/ubands/Ubands.md)
|
||||
* [UCHANNEL - Ultimate Channel](lib/channels/uchannel/Uchannel.md)
|
||||
* [VWAPBANDS - VWAP Bands](lib/channels/vwapbands/Vwapbands.md)
|
||||
* [VWAPSD - VWAP with Standard Deviation Bands](lib/channels/vwapsd/Vwapsd.md)
|
||||
|
||||
* **Statistics**
|
||||
* [Overview](lib/statistics/_index.md)
|
||||
* [BETA - Beta Coefficient](lib/statistics/beta/Beta.md)
|
||||
* [BIAS - Bias](lib/statistics/bias/Bias.md)
|
||||
* [CMA - Cumulative MA](lib/statistics/cma/Cma.md)
|
||||
* [COINTEGRATION - Cointegration](lib/statistics/cointegration/Cointegration.md)
|
||||
* [CORRELATION - Correlation](lib/statistics/correlation/Correlation.md)
|
||||
* [COVARIANCE - Covariance](lib/statistics/covariance/Covariance.md)
|
||||
* [CUMMEAN - Cumulative Mean](lib/statistics/cummean/Cummean.md)
|
||||
* [ENTROPY - Shannon Entropy](lib/statistics/entropy/Entropy.md)
|
||||
* [GEOMEAN - Geometric Mean](lib/statistics/geomean/Geomean.md)
|
||||
* [GRANGER - Granger Causality](lib/statistics/granger/Granger.md)
|
||||
* [HARMEAN - Harmonic Mean](lib/statistics/harmean/Harmean.md)
|
||||
* [HURST - Hurst Exponent](lib/statistics/hurst/Hurst.md)
|
||||
* [IQR - Interquartile Range](lib/statistics/iqr/Iqr.md)
|
||||
* [JB - Jarque-Bera Test](lib/statistics/jb/Jb.md)
|
||||
* [KENDALL - Kendall Rank Correlation](lib/statistics/kendall/Kendall.md)
|
||||
* [KURTOSIS - Kurtosis](lib/statistics/kurtosis/Kurtosis.md)
|
||||
* [LINREG - Linear Regression Curve](lib/statistics/linreg/LinReg.md)
|
||||
* [MEDIAN - Rolling Median](lib/statistics/median/Median.md)
|
||||
* [MODE - Mode](lib/statistics/mode/Mode.md)
|
||||
* [PERCENTILE - Percentile](lib/statistics/percentile/Percentile.md)
|
||||
* [QUANTILE - Quantile](lib/statistics/quantile/Quantile.md)
|
||||
* [SKEW - Skewness](lib/statistics/skew/Skew.md)
|
||||
* [SPEARMAN - Spearman Rank Correlation](lib/statistics/spearman/Spearman.md)
|
||||
* [STDDEV - Standard Deviation](lib/statistics/stddev/StdDev.md)
|
||||
* [SUM - Rolling Sum](lib/statistics/sum/Sum.md)
|
||||
* [THEIL - Theil Index](lib/statistics/theil/Theil.md)
|
||||
* [VARIANCE - Population and Sample Variance](lib/statistics/variance/Variance.md)
|
||||
* [ZSCORE - Z-score](lib/statistics/zscore/Zscore.md)
|
||||
* [ZTEST - Z-Test](lib/statistics/ztest/Ztest.md)
|
||||
|
||||
* **Numerics**
|
||||
* [Overview](lib/numerics/_index.md)
|
||||
|
||||
* **Errors**
|
||||
* [Overview](lib/errors/_index.md)
|
||||
* [HUBER - Huber Loss](lib/errors/huber/Huber.md)
|
||||
* [LOGCOSH - Log-Cosh Loss](lib/errors/logcosh/LogCosh.md)
|
||||
* [MAE - Mean Absolute Error](lib/errors/mae/Mae.md)
|
||||
* [MAAPE - Mean Arctangent Absolute Percentage Error](lib/errors/maape/Maape.md)
|
||||
* [MAPD - Mean Absolute Percentage Deviation](lib/errors/mapd/Mapd.md)
|
||||
* [MAPE - Mean Absolute Percentage Error](lib/errors/mape/Mape.md)
|
||||
* [MASE - Mean Absolute Scaled Error](lib/errors/mase/Mase.md)
|
||||
* [MDAE - Median Absolute Error](lib/errors/mdae/Mdae.md)
|
||||
* [MDAPE - Median Absolute Percentage Error](lib/errors/mdape/Mdape.md)
|
||||
* [ME - Mean Error](lib/errors/me/Me.md)
|
||||
* [MPE - Mean Percentage Error](lib/errors/mpe/Mpe.md)
|
||||
* [MRAE - Mean Relative Absolute Error](lib/errors/mrae/Mrae.md)
|
||||
* [MSE - Mean Squared Error](lib/errors/mse/Mse.md)
|
||||
* [MSLE - Mean Squared Logarithmic Error](lib/errors/msle/Msle.md)
|
||||
* [PSEUDOHUBER - Pseudo-Huber Loss](lib/errors/pseudohuber/PseudoHuber.md)
|
||||
* [QUANTILE - Quantile Loss](lib/errors/quantile/QuantileLoss.md)
|
||||
* [RAE - Relative Absolute Error](lib/errors/rae/Rae.md)
|
||||
* [RMSE - Root Mean Squared Error](lib/errors/rmse/Rmse.md)
|
||||
* [RMSLE - Root Mean Squared Logarithmic Error](lib/errors/rmsle/Rmsle.md)
|
||||
* [RSE - Relative Squared Error](lib/errors/rse/Rse.md)
|
||||
* [RSQUARED - Coefficient of Determination](lib/errors/rsquared/Rsquared.md)
|
||||
* [SMAPE - Symmetric Mean Absolute Percentage Error](lib/errors/smape/Smape.md)
|
||||
* [THEILU - Theil's U Statistic](lib/errors/theilu/TheilU.md)
|
||||
* [TUKEY - Tukey Biweight Loss](lib/errors/tukey/TukeyBiweight.md)
|
||||
* [WMAPE - Weighted Mean Absolute Percentage Error](lib/errors/wmape/Wmape.md)
|
||||
|
||||
* **Forecasts**
|
||||
* [Overview](lib/forecasts/_index.md)
|
||||
* [AFIRMA - Adaptive FIR MA](lib/forecasts/afirma/Afirma.md)
|
||||
* [MLP - Multilayer Perceptron](lib/forecasts/mlp/Mlp.md)
|
||||
|
||||
* **Cycles**
|
||||
* [Overview](lib/cycles/_index.md)
|
||||
* [CG - Center of Gravity](lib/cycles/cg/Cg.md)
|
||||
* [DSP - Detrended Synthetic Price](lib/cycles/dsp/Dsp.md)
|
||||
* [EACP - Ehlers Autocorrelation Periodogram](lib/cycles/eacp/Eacp.md)
|
||||
* [EBSW - Ehlers Even Better Sinewave](lib/cycles/ebsw/Ebsw.md)
|
||||
* [HOMOD - Homodyne Discriminator](lib/cycles/homod/Homod.md)
|
||||
* [HT_DCPERIOD - Hilbert Transform Dominant Cycle Period](lib/cycles/ht_dcperiod/HtDcperiod.md)
|
||||
* [HT_DCPHASE - Hilbert Transform Dominant Cycle Phase](lib/cycles/ht_dcphase/HtDcphase.md)
|
||||
* [HT_PHASOR - Hilbert Transform Phasor](lib/cycles/ht_phasor/HtPhasor.md)
|
||||
* [HT_SINE - Hilbert Transform SineWave](lib/cycles/ht_sine/HtSine.md)
|
||||
* [LUNAR - Lunar Phase](lib/cycles/lunar/Lunar.md)
|
||||
* [PHASOR - Phasor Analysis](lib/cycles/phasor/Phasor.md)
|
||||
* [SINE - Sine Wave](lib/cycles/sine/Sine.md)
|
||||
* [SOLAR - Solar Activity Cycle](lib/cycles/solar/Solar.md)
|
||||
* [SSFDSP - SSF-Based Detrended Synthetic Price](lib/cycles/ssfdsp/Ssfdsp.md)
|
||||
* [STC - Schaff Trend Cycle](lib/cycles/stc/Stc.md)
|
||||
|
||||
* **Reversals**
|
||||
* [Overview](lib/reversals/_index.md)
|
||||
* [FRACTALS - Williams Fractals](lib/reversals/fractals/Fractals.md)
|
||||
* [PIVOT - Pivot Points](lib/reversals/pivot/Pivot.md)
|
||||
* [PIVOTCAM - Camarilla Pivot Points](lib/reversals/pivotcam/Pivotcam.md)
|
||||
* [PIVOTDEM - DeMark Pivot Points](lib/reversals/pivotdem/Pivotdem.md)
|
||||
* [PIVOTEXT - Extended Traditional Pivots](lib/reversals/pivotext/Pivotext.md)
|
||||
* [PIVOTFIB - Fibonacci Pivot Points](lib/reversals/pivotfib/Pivotfib.md)
|
||||
* [PIVOTWOOD - Woodie's Pivot Points](lib/reversals/pivotwood/Pivotwood.md)
|
||||
* [PSAR - Parabolic Stop And Reverse](lib/reversals/psar/Psar.md)
|
||||
* [SWINGS - Swing High/Low Detection](lib/reversals/swings/Swings.md)
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<RunSettings>
|
||||
<DataCollectionRunSettings>
|
||||
<DataCollectors>
|
||||
<DataCollector friendlyName="XPlat code coverage">
|
||||
<Configuration>
|
||||
<Format>opencover</Format>
|
||||
<ExcludeAssembliesWithoutSources>MissingAll</ExcludeAssembliesWithoutSources>
|
||||
<DeterministicReport>false</DeterministicReport>
|
||||
<SingleHit>false</SingleHit>
|
||||
<UseSourceLink>false</UseSourceLink>
|
||||
<SkipAutoProps>true</SkipAutoProps>
|
||||
<ExcludeByAttribute>Obsolete,GeneratedCodeAttribute,CompilerGeneratedAttribute</ExcludeByAttribute>
|
||||
</Configuration>
|
||||
</DataCollector>
|
||||
</DataCollectors>
|
||||
</DataCollectionRunSettings>
|
||||
</RunSettings>
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,313 +0,0 @@
|
||||
| AD | Chaikin A/D Line |
|
||||
| AROON | Aroon Indicator |
|
||||
| ADX | Average Directional Movement Index |
|
||||
| ADXR | Average Directional Movement Index Rating |
|
||||
| DX | Directional Movement Index |
|
||||
| SAR | Parabolic SAR |
|
||||
| SAREXT | Parabolic SAR - Extended |
|
||||
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
|
||||
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
|
||||
| ZZ | ZigZag Indicator |
|
||||
| DMI | Directional Movement Index |
|
||||
| Alligator | Alligator Indicator |
|
||||
| Regression | Regression Line Indicator |
|
||||
| SI | Swing Index |
|
||||
| ATS | ATR Trailing Stop |
|
||||
| ERI | Elder-ray Index |
|
||||
| GO | Gator Oscillator |
|
||||
| HE | Hurst Exponent |
|
||||
| IC | Ichimoku Cloud |
|
||||
| ST | SuperTrend |
|
||||
| VI | Vortex Indicator |
|
||||
| WA | Williams Alligator |
|
||||
| RSI | Relative Strength Index |
|
||||
| CCI | Commodity Channel Index |
|
||||
| MOM | Momentum |
|
||||
| ROC | Rate of Change |
|
||||
| PPO | Percentage Price Oscillator |
|
||||
| AO | Awesome Oscillator |
|
||||
| CMO | Chande Momentum Oscillator |
|
||||
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
|
||||
| ULTOSC | Ultimate Oscillator |
|
||||
| AROONOSC | Aroon Oscillator |
|
||||
| ADOSC | Chaikin A/D Oscillator |
|
||||
| APO | Absolute Price Oscillator |
|
||||
| STOCH | Stochastic |
|
||||
| STOCHF | Stochastic Fast |
|
||||
| STOCHRSI | Stochastic Relative Strength Index |
|
||||
| Qstick | Qstick Indicator |
|
||||
| RLW | %R Larry Williams |
|
||||
| AC | Acceleration Oscillator |
|
||||
| TSI | True Strength Index |
|
||||
| CRSI | ConnorsRSI |
|
||||
| DPO | Detrended Price Oscillator |
|
||||
| KDJ | KDJ Index |
|
||||
| STC | Schaff Trend Cycle |
|
||||
| SMI | Stochastic Momentum Index |
|
||||
| BB | Bollinger Bands |
|
||||
| Keltner | Keltner Channel |
|
||||
| BBF | Bollinger Bands Flat |
|
||||
| Channel | Price Channel |
|
||||
| MAE | Moving Average Envelope |
|
||||
| PAZ | Price Action Zones |
|
||||
| DC | Donchian Channels |
|
||||
| FCB | Fractal Chaos Bands |
|
||||
| PP | Pivot Points |
|
||||
| RPP | Rolling Pivot Points |
|
||||
| STARC | STARC Bands |
|
||||
| SDC | Standard Deviation Channels |
|
||||
| OBV | On Balance Volume |
|
||||
| PVI | Positive Volume Index |
|
||||
| Volume | Volume Indicator |
|
||||
| MFI | Money Flow Index |
|
||||
| ADL | Accumulation / Distribution Line |
|
||||
| CMF | Chaikin Money Flow |
|
||||
| FI | Force Index |
|
||||
| KVO | Klinger Volume Oscillator |
|
||||
| PVO | Percentage Volume Oscillator |
|
||||
| ATS | ATR Trailing Stop |
|
||||
| CE | Chandelier Exit |
|
||||
| SAR | Parabolic SAR |
|
||||
| ST | SuperTrend |
|
||||
| VS | Volatility Stop |
|
||||
| Pivots | Pivots |
|
||||
| WF | Williams Fractal |
|
||||
| EMA | Exponential Moving Average |
|
||||
| SMA | Simple Moving Average |
|
||||
| LWMA | Linearly Weighted Moving Average |
|
||||
| SMMA | Smoothed Moving Average |
|
||||
| MMA | Modified Moving Average |
|
||||
| KAMA | Kaufman Adaptive Moving Average |
|
||||
| DEMA | Double Exponential Moving Average |
|
||||
| TEMA | Triple Exponential Moving Average |
|
||||
| MAMA | MESA Adaptive Moving Average |
|
||||
| TRIMA | Triangular Moving Average |
|
||||
| T3 | Triple Exponential Moving Average (T3) |
|
||||
| PPMA | Pivot Point Moving Average |
|
||||
| WMA | Weighted Moving Average |
|
||||
| ALMA | Arnaud Legoux Moving Average |
|
||||
| EPMA | Endpoint Moving Average |
|
||||
| HMA | Hull Moving Average |
|
||||
| LSMA | Least Squares Moving Average |
|
||||
| MD | McGinley Dynamic |
|
||||
| RMA | Running Moving Average |
|
||||
| VWAP | Volume Weighted Average Price |
|
||||
| VWMA | Volume Weighted Moving Average |
|
||||
| ATR | Average True Range |
|
||||
| NATR | Normalized Average True Range |
|
||||
| TRANGE | True Range |
|
||||
| STDDEV | Standard Deviation |
|
||||
| HV | Historical Volatility |
|
||||
| BOP | Balance of Power |
|
||||
| BBP | Bull and Bear Power |
|
||||
| CI | Choppiness Index |
|
||||
| DCP | Dominant Cycle Periods |
|
||||
| PMO | Price Momentum Oscillator |
|
||||
| PRS | Price Relative Strength |
|
||||
| ROCB | ROC with Bands |
|
||||
| RRA | Rescaled Range Analysis |
|
||||
| UI | Ulcer Index |
|
||||
| CORREL | Pearson's Correlation Coefficient |
|
||||
| BETA | Beta |
|
||||
| VAR | Variance |
|
||||
| AVGPRICE | Average Price |
|
||||
| MEDPRICE | Median Price |
|
||||
| TYPPRICE | Typical Price |
|
||||
| WCLPRICE | Weighted Close Price |
|
||||
| SUM | Summation |
|
||||
| MAX | Highest value over a specified period |
|
||||
| MIN | Lowest value over a specified period |
|
||||
| MAXINDEX | Index of highest value over a specified period |
|
||||
| MININDEX | Index of lowest value over a specified period |
|
||||
| MINMAX | Lowest and highest values over a specified period |
|
||||
| MINMAXINDEX | Indexes of lowest and highest values over a period |
|
||||
| BC | Beta Coefficient |
|
||||
| MAD | Mean absolute deviation |
|
||||
| MAPE | Mean absolute percentage error |
|
||||
| MSE | Mean square error |
|
||||
| R2 | R-Squared (Coefficient of Determination) |
|
||||
| SLR | Slope and Linear Regression |
|
||||
| ZS | Z-Score |
|
||||
| AD | Chaikin A/D Line |
|
||||
| AROON | Aroon Indicator |
|
||||
| ADX | Average Directional Movement Index |
|
||||
| ADXR | Average Directional Movement Index Rating |
|
||||
| DX | Directional Movement Index |
|
||||
| SAR | Parabolic SAR |
|
||||
| SAREXT | Parabolic SAR - Extended |
|
||||
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
|
||||
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
|
||||
| ZZ | ZigZag Indicator |
|
||||
| DMI | Directional Movement Index |
|
||||
| Alligator | Alligator Indicator |
|
||||
| Regression | Regression Line Indicator |
|
||||
| SI | Swing Index |
|
||||
| ATS | ATR Trailing Stop |
|
||||
| ERI | Elder-ray Index |
|
||||
| GO | Gator Oscillator |
|
||||
| HE | Hurst Exponent |
|
||||
| IC | Ichimoku Cloud |
|
||||
| ST | SuperTrend |
|
||||
| VI | Vortex Indicator |
|
||||
| WA | Williams Alligator |
|
||||
| RSI | Relative Strength Index |
|
||||
| CCI | Commodity Channel Index |
|
||||
| MOM | Momentum |
|
||||
| ROC | Rate of Change |
|
||||
| PPO | Percentage Price Oscillator |
|
||||
| AO | Awesome Oscillator |
|
||||
| CMO | Chande Momentum Oscillator |
|
||||
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
|
||||
| ULTOSC | Ultimate Oscillator |
|
||||
| AROONOSC | Aroon Oscillator |
|
||||
| ADOSC | Chaikin A/D Oscillator |
|
||||
| APO | Absolute Price Oscillator |
|
||||
| STOCH | Stochastic |
|
||||
| STOCHF | Stochastic Fast |
|
||||
| STOCHRSI | Stochastic Relative Strength Index |
|
||||
| Qstick | Qstick Indicator |
|
||||
| RLW | %R Larry Williams |
|
||||
| AC | Acceleration Oscillator |
|
||||
| TSI | True Strength Index |
|
||||
| CRSI | ConnorsRSI |
|
||||
| DPO | Detrended Price Oscillator |
|
||||
| KDJ | KDJ Index |
|
||||
| STC | Schaff Trend Cycle |
|
||||
| SMI | Stochastic Momentum Index |
|
||||
| BB | Bollinger Bands |
|
||||
| Keltner | Keltner Channel |
|
||||
| BBF | Bollinger Bands Flat |
|
||||
| Channel | Price Channel |
|
||||
| MAE | Moving Average Envelope |
|
||||
| PAZ | Price Action Zones |
|
||||
| DC | Donchian Channels |
|
||||
| FCB | Fractal Chaos Bands |
|
||||
| PP | Pivot Points |
|
||||
| RPP | Rolling Pivot Points |
|
||||
| STARC | STARC Bands |
|
||||
| SDC | Standard Deviation Channels |
|
||||
| OBV | On Balance Volume |
|
||||
| PVI | Positive Volume Index |
|
||||
| Volume | Volume Indicator |
|
||||
| MFI | Money Flow Index |
|
||||
| ADL | Accumulation / Distribution Line |
|
||||
| CMF | Chaikin Money Flow |
|
||||
| FI | Force Index |
|
||||
| KVO | Klinger Volume Oscillator |
|
||||
| PVO | Percentage Volume Oscillator |
|
||||
| ATS | ATR Trailing Stop |
|
||||
| CE | Chandelier Exit |
|
||||
| SAR | Parabolic SAR |
|
||||
| ST | SuperTrend |
|
||||
| VS | Volatility Stop |
|
||||
| Pivots | Pivots |
|
||||
| WF | Williams Fractal |
|
||||
| ALMA | Arnaud Legoux Moving Average |
|
||||
| EPMA | Endpoint Moving Average |
|
||||
| HMA | Hull Moving Average |
|
||||
| LSMA | Least Squares Moving Average |
|
||||
| MD | McGinley Dynamic |
|
||||
| RMA | Running Moving Average |
|
||||
| T3 | Tillson T3 Moving Average |
|
||||
| VWAP | Volume Weighted Average Price |
|
||||
| VWMA | Volume Weighted Moving Average |
|
||||
| BOP | Balance of Power |
|
||||
| BBP | Bull and Bear Power |
|
||||
| CI | Choppiness Index |
|
||||
| DCP | Dominant Cycle Periods |
|
||||
| PMO | Price Momentum Oscillator |
|
||||
| PRS | Price Relative Strength |
|
||||
| ROCB | ROC with Bands |
|
||||
| RRA | Rescaled Range Analysis |
|
||||
| UI | Ulcer Index |
|
||||
| BC | Beta Coefficient |
|
||||
| MAD | Mean absolute deviation |
|
||||
| MAPE | Mean absolute percentage error |
|
||||
| MSE | Mean square error |
|
||||
| R2 | R-Squared (Coefficient of Determination) |
|
||||
| SLR | Slope and Linear Regression |
|
||||
| ZS | Z-Score |
|
||||
| EMA | Exponential Moving Average |
|
||||
| SMA | Simple Moving Average |
|
||||
| LWMA | Linearly Weighted Moving Average |
|
||||
| SMMA | Smoothed Moving Average |
|
||||
| MMA | Modified Moving Average |
|
||||
| KAMA | Kaufman Adaptive Moving Average |
|
||||
| DEMA | Double Exponential Moving Average |
|
||||
| TEMA | Triple Exponential Moving Average |
|
||||
| MAMA | MESA Adaptive Moving Average |
|
||||
| TRIMA | Triangular Moving Average |
|
||||
| T3 | Triple Exponential Moving Average (T3) |
|
||||
| PPMA | Pivot Point Moving Average |
|
||||
| MAE | Moving Average Envelope |
|
||||
| MACD | Moving Average Convergence Divergence |
|
||||
| MACDEXT | MACD with controllable MA type |
|
||||
| MACDFIX | Moving Average Convergence Divergence Fix 12/26 |
|
||||
| OsMA | Moving Average of Oscillator |
|
||||
| Regression | Regression Indicator |
|
||||
| LINEARREG | Linear Regression |
|
||||
| LINEARREG_ANGLE | Linear Regression Angle |
|
||||
| LINEARREG_INTERCEPT | Linear Regression Intercept |
|
||||
| LINEARREG_SLOPE | Linear Regression Slope |
|
||||
| RSI | Relative Strength Index |
|
||||
| CCI | Commodity Channel Index |
|
||||
| MOM | Momentum |
|
||||
| ROC | Rate of Change |
|
||||
| PPO | Percentage Price Oscillator |
|
||||
| AO | Awesome Oscillator |
|
||||
| CMO | Chande Momentum Oscillator |
|
||||
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
|
||||
| ULTOSC | Ultimate Oscillator |
|
||||
| AROONOSC | Aroon Oscillator |
|
||||
| ADOSC | Chaikin A/D Oscillator |
|
||||
| APO | Absolute Price Oscillator |
|
||||
| STOCH | Stochastic |
|
||||
| STOCHF | Stochastic Fast |
|
||||
| STOCHRSI | Stochastic Relative Strength Index |
|
||||
| Qstick | Qstick Indicator |
|
||||
| RLW | %R Larry Williams |
|
||||
| AC | Acceleration Oscillator |
|
||||
| TSI | True Strength Index |
|
||||
| AD | Chaikin A/D Line |
|
||||
| AROON | Aroon Indicator |
|
||||
| ADX | Average Directional Movement Index |
|
||||
| ADXR | Average Directional Movement Index Rating |
|
||||
| DX | Directional Movement Index |
|
||||
| SAR | Parabolic SAR |
|
||||
| SAREXT | Parabolic SAR - Extended |
|
||||
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
|
||||
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
|
||||
| ZZ | ZigZag Indicator |
|
||||
| DMI | Directional Movement Index |
|
||||
| Alligator | Alligator Indicator |
|
||||
| Regression | Regression Line Indicator |
|
||||
| SI | Swing Index |
|
||||
| ATR | Average True Range |
|
||||
| NATR | Normalized Average True Range |
|
||||
| TRANGE | True Range |
|
||||
| STDDEV | Standard Deviation |
|
||||
| HV | Historical Volatility |
|
||||
| BB | Bollinger Bands |
|
||||
| Keltner | Keltner Channel |
|
||||
| BBF | Bollinger Bands Flat |
|
||||
| Channel | Price Channel |
|
||||
| MAE | Moving Average Envelope |
|
||||
| PAZ | Price Action Zones |
|
||||
| OBV | On Balance Volume |
|
||||
| PVI | Positive Volume Index |
|
||||
| Volume | Volume Indicator |
|
||||
| MFI | Money Flow Index |
|
||||
| CORREL | Pearson's Correlation Coefficient |
|
||||
| BETA | Beta |
|
||||
| VAR | Variance |
|
||||
| AVGPRICE | Average Price |
|
||||
| MEDPRICE | Median Price |
|
||||
| TYPPRICE | Typical Price |
|
||||
| WCLPRICE | Weighted Close Price |
|
||||
| SUM | Summation |
|
||||
| MAX | Highest value over a specified period |
|
||||
| MIN | Lowest value over a specified period |
|
||||
| MAXINDEX | Index of highest value over a specified period |
|
||||
| MININDEX | Index of lowest value over a specified period |
|
||||
| MINMAX | Lowest and highest values over a specified period |
|
||||
| MINMAXINDEX | Indexes of lowest and highest values over a period |
|
||||
@@ -1,113 +0,0 @@
|
||||
* [Home](/)
|
||||
|
||||
* [List of Indicators](indicators/indicators.md)
|
||||
|
||||
* 🚧 Introduction
|
||||
* [Overview]()
|
||||
* [Features]()
|
||||
* [Historical vs Real-time analysis](essays/realtime.md)
|
||||
|
||||
* 🚧 Core Concepts
|
||||
* [Time Series Data Handling]()
|
||||
* [Calculation classes]()
|
||||
* [Presentation Classes]()
|
||||
|
||||
* 🚧 QuanTAlib C# Library
|
||||
* [Installation]()
|
||||
* [Quick Start Guide]()
|
||||
* [Usage Examples]()
|
||||
* [Tests and Validation]()
|
||||
|
||||
* 🚧 Quantower Charts
|
||||
* [Installation]()
|
||||
* [Quick Start Guide]()
|
||||
* [Using VS Code for QuanTower coding](setup/vscode.md)
|
||||
* [Using DotPeek](setup/dotpeek.md)
|
||||
* [Creating Custom Indicators]()
|
||||
* [Inspecting Quantower Internals]()
|
||||
|
||||
* [🚧 Available Indicators](indicators/indicators.md)
|
||||
* Momentum
|
||||
* [ADX - Average Directional Index](indicators/momentum/adx/description.md)
|
||||
* [ADXR - Average Directional Index Rating](indicators/momentum/adxr/description.md)
|
||||
* [APO - Absolute Price Oscillator](indicators/momentum/apo/description.md)
|
||||
* [DMI - Directional Movement Index](indicators/momentum/dmi/description.md)
|
||||
* [DMX - Directional Movement Extended](indicators/momentum/dmx/description.md)
|
||||
* [DPO - Detrended Price Oscillator](indicators/momentum/dpo/description.md)
|
||||
* [MOM - Momentum](indicators/momentum/mom/description.md)
|
||||
* [PMO - Price Momentum Oscillator](indicators/momentum/pmo/description.md)
|
||||
* [PO - Price Oscillator](indicators/momentum/po/description.md)
|
||||
* [PPO - Percentage Price Oscillator](indicators/momentum/ppo/description.md)
|
||||
* [PRS - Price Relative Strength](indicators/momentum/prs/description.md)
|
||||
* [ROC - Rate of Change](indicators/momentum/roc/description.md)
|
||||
* [TRIX - Triple Exponential](indicators/momentum/trix/description.md)
|
||||
* [TSI - True Strength Index](indicators/momentum/tsi/description.md)
|
||||
* [VEL - Velocity](indicators/momentum/vel/description.md)
|
||||
* [VORTEX - Vortex Indicator](indicators/momentum/vortex/description.md)
|
||||
* Basic Transforms
|
||||
* Numerical Analysis
|
||||
* Errors
|
||||
* Moving Averages
|
||||
* [AFIRMA - Adaptive Filtering Integrated Recursive Moving Average](indicators/averages/afirma/afirma.md)
|
||||
* [Calculation](indicators/averages/afirma/calc.md)
|
||||
* [Analysis](indicators/averages/afirma/analysis.md)
|
||||
* [Charts](indicators/averages/afirma/charts.md)
|
||||
* [ALMA - Arnaud Legoux Moving Average](indicators/averages/alma/alma.md)
|
||||
* [Calculation](indicators/averages/alma/calc.md)
|
||||
* [Analysis](indicators/averages/alma/analysis.md)
|
||||
* [Charts](indicators/averages/alma/charts.md)
|
||||
* [AMA - Adaptive Moving Average](indicators/averages/ama/ama.md)
|
||||
* [Calculation](indicators/averages/ama/calc.md)
|
||||
* [Analysis](indicators/averages/ama/analysis.md)
|
||||
* [Charts](indicators/averages/ama/charts.md)
|
||||
* [DEMA - Double Exponential Moving Average](indicators/averages/dema/dema.md)
|
||||
* [Calculation](indicators/averages/dema/calc.md)
|
||||
* [Analysis](indicators/averages/dema/analysis.md)
|
||||
* [Charts](indicators/averages/dema/charts.md)
|
||||
* [DSMA - Deviation Scaled Moving Average](indicators/averages/dsma/dsma.md)
|
||||
* [Calculation](indicators/averages/dsma/calculation.md)
|
||||
* [Quality](indicators/averages/dsma/quality.md)
|
||||
* [Charts](indicators/averages/dsma/charts.md)
|
||||
* [DWMA - Double Weighted Moving Average](indicators/averages/dwma/calculation.md)
|
||||
* [Calculation](indicators/averages/dwma/calculation.md)
|
||||
* [Quality](indicators/averages/dwma/quality.md)
|
||||
* [Charts](indicators/averages/dwma/charts.md)
|
||||
* [EMA - Exponential Moving Average](indicators/averages/ema/ema.md)
|
||||
* [Calculation](indicators/averages/ema/calculation.md)
|
||||
* [Quality](indicators/averages/ema/quality.md)
|
||||
* [Charts](indicators/averages/ema/charts.md)
|
||||
* EPMA - Endpoint Moving Average
|
||||
* FRAMA - Fractal Adaptive Moving Average
|
||||
* FWMA - Fibonacci-Weighted Moving Average
|
||||
* GMA - Gaussian-Weighted Moving Average
|
||||
* HMA - Hull Moving Average
|
||||
* HTIT - Hilbert Transform Instantaneous Trendline
|
||||
* HWMA - Holt-Winter Moving Average
|
||||
* JMA - Jurik Moving Average
|
||||
* KAMA - Kaufman's Adaptive Moving Average
|
||||
* LTMA - Laguerre Transform Moving Average
|
||||
* MAAF - Median-Average Adaptive Filter
|
||||
* MAMA - MESA Adaptive Moving Average
|
||||
* MGDI - McGinley Dynamic Index
|
||||
* MMA - Modified Moving Average
|
||||
* QEMA - Quad Exponential Moving Average
|
||||
* REMA - Regularized Exponential Moving Average
|
||||
* RMA - wildeR Moving Average
|
||||
* SINEMA - Sine-Weighted Moving Average
|
||||
* [SMA - Simple Moving Average](indicators/averages/sma/sma.md)
|
||||
* [Charts](indicators/averages/sma/charts.md)
|
||||
* SMMA - Smoothed Moving Average
|
||||
* T3 - Tillson T3 Moving Average
|
||||
* [TEMA - Triple Exponential Moving Average](indicators/averages/tema/tema.md)
|
||||
* [Calculation](indicators/averages/tema/calc.md)
|
||||
* [Analysis](indicators/averages/tema/analysis.md)
|
||||
* [Charts](indicators/averages/tema/charts.md)
|
||||
* TRIMA - Triangular Moving Average
|
||||
* VIDYA - Variable Index Dynamic Average
|
||||
* WMA - Weighted Moving Average
|
||||
* ZLEMA - Weighted Moving Average
|
||||
* Trends
|
||||
* Momentum
|
||||
* Oscillators
|
||||
* Volatility
|
||||
* Volume
|
||||
@@ -0,0 +1,187 @@
|
||||
# Architecture
|
||||
|
||||
QuanTAlib is built on specific architectural decisions designed to maximize performance on modern hardware while maintaining mathematical correctness. These decisions involve trade-offs. Understanding the trade-offs helps determine whether QuanTAlib fits a particular use case.
|
||||
|
||||
## Three Core Decisions
|
||||
|
||||
### 1. Structure of Arrays (SoA) Memory Layout
|
||||
|
||||
Traditional object-oriented design stores data as arrays of objects: `List<PriceBar>` where each `PriceBar` contains timestamp, open, high, low, close, volume. This layout is intuitive for humans. It is terrible for CPUs.
|
||||
|
||||
QuanTAlib stores timestamps and values in separate contiguous arrays. When calculating an average, the CPU loads a cache line filled entirely with price values, without wasting space on interleaved timestamps or object headers.
|
||||
|
||||
The performance difference is measurable:
|
||||
|
||||
| Operation | SoA Layout | AoS Layout | Improvement |
|
||||
| :-------- | ---------: | ---------: | ----------: |
|
||||
| Average 10,000 values | 2.4 μs | 18.7 μs | 7.8× |
|
||||
| Sum 100,000 values | 12.1 μs | 89.3 μs | 7.4× |
|
||||
| Min/Max 500,000 values | 48.2 μs | 412.6 μs | 8.6× |
|
||||
|
||||
The gains come from two sources: cache efficiency (no wasted bytes) and SIMD vectorization (CPU processes 4-8 values per instruction). Both require contiguous memory.
|
||||
|
||||
### 2. O(1) Streaming Algorithms
|
||||
|
||||
A 14-period RSI and a 200-period RSI both process new bars in approximately 0.4 μs. The lookback period does not affect per-bar processing time.
|
||||
|
||||
Traditional batch approaches recalculate from scratch, scaling linearly with period. A 200-period indicator takes 14× longer than a 14-period indicator. This variable latency makes real-time processing unpredictable.
|
||||
|
||||
QuanTAlib maintains running state: partial sums, ring buffers, recursive coefficients. The cost is memory (40-60 bytes per indicator instance). The benefit is guaranteed constant-time updates regardless of period.
|
||||
|
||||
| Approach | 14-period | 200-period | 1000-period |
|
||||
| :------- | --------: | ---------: | ----------: |
|
||||
| Batch recalculation | 0.4 μs | 5.7 μs | 28.5 μs |
|
||||
| O(1) streaming | 0.4 μs | 0.4 μs | 0.4 μs |
|
||||
|
||||
For single-symbol analysis, batch recalculation is fast enough. For 500 symbols updating simultaneously, O(1) streaming prevents the latency spikes that cause missed fills.
|
||||
|
||||
### 3. Explicit Initialization Handling
|
||||
|
||||
A 14-period SMA cannot produce a mathematically correct value until 14 bars have accumulated. Most libraries handle this in one of two ways:
|
||||
|
||||
1. **Return nothing**: NaN, null, or skip the first N-1 values entirely
|
||||
2. **Return something**: Output numbers without indicating they are preliminary
|
||||
|
||||
QuanTAlib takes a third approach: return usable values immediately and expose confidence through the `IsHot` property.
|
||||
|
||||
```csharp
|
||||
var sma = new Sma(14);
|
||||
var result = sma.Update(new TValue(time, price));
|
||||
|
||||
// result.Value is always a number (the best estimate given available data)
|
||||
// result.IsHot indicates whether enough data has accumulated
|
||||
if (result.IsHot)
|
||||
{
|
||||
// Full confidence: at least 14 bars processed
|
||||
}
|
||||
```
|
||||
|
||||
The math to calculate averages works with limited history. A 14-period SMA with 5 bars returns the average of those 5 bars. Not the 14-period average (that would require prescience), but a reasonable estimate that improves as data accumulates.
|
||||
|
||||
## Four Operating Modes
|
||||
|
||||
Trading systems have different data flow patterns. Backtesting engines process years of historical data in batch. Real-time systems update indicators bar-by-bar. Event-driven architectures react to changes asynchronously. QuanTAlib provides four modes optimized for these patterns.
|
||||
|
||||
### Span Mode
|
||||
|
||||
Operates directly on `Span<double>` without allocating objects. Raw arrays in, calculated arrays out. Zero garbage collection pressure, maximum speed, minimal abstraction.
|
||||
|
||||
```csharp
|
||||
ReadOnlySpan<double> prices = GetPrices();
|
||||
Span<double> output = stackalloc double[prices.Length];
|
||||
Sma.Calculate(prices, output, period: 14);
|
||||
```
|
||||
|
||||
**Use case:** Batch processing historical data, backtesting engines, research environments processing thousands of indicators across years of data.
|
||||
|
||||
**Trade-off:** No timestamps, no metadata, no safety rails. The caller manages array bounds, alignment, and interpretation.
|
||||
|
||||
### Batch Mode
|
||||
|
||||
Wraps calculations in TSeries objects that maintain timestamps, handle array resizing, and provide time-based indexing. Span mode with a protective wrapper.
|
||||
|
||||
```csharp
|
||||
TSeries prices = LoadHistoricalData();
|
||||
TSeries smaValues = Sma.Calculate(prices, period: 14);
|
||||
```
|
||||
|
||||
**Use case:** Historical analysis requiring time alignment. Research notebooks, strategy prototyping, exploratory analysis.
|
||||
|
||||
**Trade-off:** 10-15% overhead versus Span mode for the convenience of timestamp management.
|
||||
|
||||
### Streaming Mode
|
||||
|
||||
Processes one bar at a time, maintaining internal state between updates. Call `Update()` with each new price, receive the current indicator value.
|
||||
|
||||
```csharp
|
||||
var sma = new Sma(14);
|
||||
foreach (var bar in liveStream)
|
||||
{
|
||||
var result = sma.Update(new TValue(bar.Time, bar.Close), isNew: true);
|
||||
}
|
||||
```
|
||||
|
||||
The `isNew` parameter distinguishes between new bars and updates to the current bar. When the last bar's values change as new ticks arrive, pass `isNew: false` to update without advancing state.
|
||||
|
||||
**Use case:** Live trading systems, real-time charting, tick-by-tick analysis.
|
||||
|
||||
**Trade-off:** Per-bar overhead is higher than batch processing (function call, state management). For historical analysis, batch mode is faster.
|
||||
|
||||
### Eventing Mode
|
||||
|
||||
Extends streaming mode with event infrastructure. Indicators raise events when values change, enabling reactive chains where one indicator's output triggers another's calculation.
|
||||
|
||||
```csharp
|
||||
var source = new TSeries();
|
||||
var sma = new Sma(source, 14);
|
||||
var ema = new Ema(source, 14);
|
||||
|
||||
sma.Pub += (s, e) => HandleSmaUpdate(e.Value);
|
||||
source.Add(new TValue(DateTime.UtcNow, 100.0)); // Both indicators update
|
||||
```
|
||||
|
||||
**Use case:** Complex trading systems with conditional logic, risk management systems reacting to volatility changes, pipelines where indicators communicate state.
|
||||
|
||||
**Trade-off:** Event dispatch overhead. For simple calculations, direct calls are faster.
|
||||
|
||||
## Memory Layout Details
|
||||
|
||||
### TSeries Internal Structure
|
||||
|
||||
```csharp
|
||||
internal List<long> _t; // Timestamps (ticks since epoch)
|
||||
internal List<double> _v; // Values
|
||||
```
|
||||
|
||||
Two separate `List<T>` collections rather than `List<(long, double)>`. Access is exposed via `ReadOnlySpan<double>` properties, allowing zero-copy access to underlying memory.
|
||||
|
||||
### Cache Line Efficiency
|
||||
|
||||
A typical CPU cache line is 64 bytes. With SoA layout:
|
||||
|
||||
| Layout | Values per cache line | Utilization |
|
||||
| :----- | --------------------: | ----------: |
|
||||
| SoA (doubles only) | 8 | 100% |
|
||||
| AoS (timestamp + value) | 4 | 100% |
|
||||
| AoS (full PriceBar object) | 1-2 | 30-60% |
|
||||
|
||||
When iterating through values for calculation, SoA loads 8 relevant values per cache miss. AoS with full objects loads 1-2 values plus irrelevant data.
|
||||
|
||||
## SIMD Implementation
|
||||
|
||||
QuanTAlib uses `System.Runtime.Intrinsics` to access hardware vector instructions.
|
||||
|
||||
### Vectorization Strategy
|
||||
|
||||
| Operation | Scalar | AVX2 (4 doubles) | AVX-512 (8 doubles) |
|
||||
| :-------- | -----: | ---------------: | ------------------: |
|
||||
| Sum | 1 value/cycle | 4 values/cycle | 8 values/cycle |
|
||||
| Min/Max | 1 value/cycle | 4 values/cycle | 8 values/cycle |
|
||||
| Element-wise arithmetic | 1 value/cycle | 4 values/cycle | 8 values/cycle |
|
||||
|
||||
### Runtime Detection
|
||||
|
||||
```csharp
|
||||
if (Avx512F.IsSupported)
|
||||
CalculateAvx512(source, output);
|
||||
else if (Avx2.IsSupported)
|
||||
CalculateAvx2(source, output);
|
||||
else
|
||||
CalculateScalar(source, output);
|
||||
```
|
||||
|
||||
The library checks hardware support at runtime. Systems without AVX2 fall back to scalar implementations. The code runs everywhere; speed varies with hardware capability.
|
||||
|
||||
### Allocation Discipline
|
||||
|
||||
SIMD operations are performed on `Span<T>` and `ReadOnlySpan<T>`. No heap allocations occur during calculation. This discipline extends throughout the hot path: no LINQ, no temporary objects, no closures that capture state.
|
||||
|
||||
## Design Philosophy
|
||||
|
||||
**Correctness first.** Validation against original research papers and established libraries. When sources disagree, trace to the original author or mathematical derivation.
|
||||
|
||||
**Performance by default.** Algorithms and data structures chosen for speed. The fast path is the default path.
|
||||
|
||||
**No hidden allocations.** Hot paths are allocation-free. The garbage collector stays asleep during trading hours.
|
||||
|
||||
**Transparency.** Internal state (`IsHot`, `WarmupPeriod`, `Last`) is exposed. No black boxes.
|
||||
@@ -0,0 +1,156 @@
|
||||
# Benchmarks
|
||||
|
||||
Performance claims without measurement: just marketing. QuanTAlib benchmarks against established libraries: TA-Lib and Tulip (industry-standard C libraries accessed via P/Invoke), Skender.Stock.Indicators and Ooples.FinancialIndicators (popular .NET implementations).
|
||||
|
||||
## Test Environment
|
||||
|
||||
| Component | Specification |
|
||||
| :-------- | :------------ |
|
||||
| Data Size | 500,000 bars |
|
||||
| Period | 220 (sufficient to expose algorithmic inefficiencies) |
|
||||
| Framework | .NET 10.0.2 (10.0.225.61305), X64 RyuJIT |
|
||||
| SIMD | AVX-512F+CD+BW+DQ+VL+VBMI |
|
||||
| Benchmarking | BenchmarkDotNet v0.14.0 |
|
||||
|
||||
These results represent what current-generation CPUs achieve in production. Your mileage varies with older hardware, but relative performance ratios hold.
|
||||
|
||||
## SIMD and FMA: The Speed Multipliers
|
||||
|
||||
The library auto-detects and exploits the highest available instruction set. Processing multiple data points per clock cycle changes everything:
|
||||
|
||||
| Instruction Set | Vector Width | Doubles/Cycle | Hardware |
|
||||
| :-------------- | -----------: | ------------: | :------- |
|
||||
| AVX-512 | 512-bit | 8 | Modern server/desktop CPUs |
|
||||
| AVX2 | 256-bit | 4 | Most x86-64 since 2013 |
|
||||
| NEON | 128-bit | 2 | ARM processors (Apple Silicon, Raspberry Pi) |
|
||||
| Scalar fallback | 64-bit | 1 | Everything else |
|
||||
|
||||
**Fused Multiply-Add (FMA)** performs `a * b + c` in a single cycle with one rounding step. Two advantages compound:
|
||||
|
||||
1. **Throughput**: Double the floating-point operations per cycle versus separate multiply/add
|
||||
2. **Precision**: Cumulative rounding errors shrink in iterative calculations
|
||||
|
||||
In convolution-heavy algorithms (WMA, LinReg, Correlation), SIMD + FMA explains most of the observed speedup. The CPU stops being the bottleneck; memory bandwidth takes over.
|
||||
|
||||
## Benchmark Results
|
||||
|
||||
### Simple Moving Average (SMA)
|
||||
|
||||
QuanTAlib Span mode: 500,000 SMA values in 328 microseconds. Zero allocations. That works out to **0.66 nanoseconds per value**. For perspective: a single L1 cache access takes approximately 1 nanosecond. Moving averages calculating faster than cache fetch.
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| :------ | --------: | ----------: | :------------- |
|
||||
| **QuanTAlib (Span)** | **327.9 μs** | **0 B** | **baseline** |
|
||||
| TA-Lib | 365.4 μs | 32 B | 1.11× slower |
|
||||
| Tulip | 370.2 μs | 0 B | 1.13× slower |
|
||||
| Skender | 68,436 μs | 42.0 MB | 209× slower |
|
||||
| Ooples | 347,453 μs | 151.3 MB | 1,060× slower |
|
||||
|
||||
Skender and Ooples allocate 42-151 MB for what should be a stateless calculation. Garbage collector wakes up, stretches, and ruins everyone's day.
|
||||
|
||||
### Exponential Moving Average (EMA)
|
||||
|
||||
QuanTAlib at 421 microseconds outperforms both C libraries: Tulip at 709 μs, TA-Lib at 709 μs. Beating heavily optimized C with managed code sounds improbable. The secret: **FMA instructions** on the hot path. Those C libraries predate AVX-512 optimizations by a decade.
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| :------ | --------: | ----------: | :------------- |
|
||||
| **QuanTAlib (Span)** | **421.0 μs** | **0 B** | **baseline** |
|
||||
| TA-Lib | 708.8 μs | 32 B | 1.68× slower |
|
||||
| Tulip | 709.1 μs | 0 B | 1.68× slower |
|
||||
| Ooples | 14,509 μs | 79.3 MB | 34× slower |
|
||||
| Skender | 26,612 μs | 42.0 MB | 63× slower |
|
||||
|
||||
The 1.7× speedup over C libraries represents what happens when old code meets new silicon. Modern instruction sets exist; using them helps.
|
||||
|
||||
### Weighted Moving Average (WMA)
|
||||
|
||||
QuanTAlib WMA: 302 microseconds. Tulip: 378 μs. TA-Lib: 368 μs. Not a measurement error. Pure C# with proper SIMD vectorization beating C code that predates AVX-512 optimizations.
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| :------ | --------: | ----------: | :------------- |
|
||||
| **QuanTAlib (Span)** | **302.4 μs** | **0 B** | **baseline** |
|
||||
| TA-Lib | 367.6 μs | 32 B | 1.22× slower |
|
||||
| Tulip | 378.0 μs | 0 B | 1.25× slower |
|
||||
| Ooples | 75,169 μs | 70.9 MB | 249× slower |
|
||||
| Skender | 100,253 μs | 42.0 MB | 332× slower |
|
||||
|
||||
WMA involves weighted summation: dot product territory. SIMD shines here. Eight multiplications per cycle instead of one.
|
||||
|
||||
### Hull Moving Average (HMA)
|
||||
|
||||
HMA requires multiple moving average calculations: traditionally expensive. QuanTAlib processes 500,000 bars in 983 microseconds. Tulip: 2,173 μs. Skender: 246,653 μs. TA-Lib lacks HMA implementation entirely.
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| :------ | --------: | ----------: | :------------- |
|
||||
| **QuanTAlib (Span)** | **983.4 μs** | **0 B** | **baseline** |
|
||||
| Tulip | 2,173.2 μs | 138 B | 2.21× slower |
|
||||
| Ooples | 122,171 μs | 108.7 MB | 124× slower |
|
||||
| Skender | 246,653 μs | 200.8 MB | 251× slower |
|
||||
| TA-Lib | — | — | not implemented |
|
||||
|
||||
A 251× improvement over standard .NET implementations. Compound calculations expose implementation quality: inefficiencies multiply with each nested operation.
|
||||
|
||||
### Chaikin Oscillator (ADOSC)
|
||||
|
||||
Multi-input indicator using high, low, close, and volume. Tests OHLCV data handling efficiency.
|
||||
|
||||
| Library | Mean Time | Allocations | Relative Speed |
|
||||
| :------ | --------: | ----------: | :------------- |
|
||||
| **QuanTAlib (Span)** | **640.1 μs** | **0 B** | **baseline** |
|
||||
| TA-Lib | 675.7 μs | 40 B | 1.06× slower |
|
||||
| Tulip | 822.7 μs | 0 B | 1.29× slower |
|
||||
| Ooples | 107,730 μs | 569.9 MB | 168× slower |
|
||||
| Skender | 116,678 μs | 194.0 MB | 182× slower |
|
||||
|
||||
## Multi-Mode Comparison
|
||||
|
||||
Span mode represents maximum speed. Production code often needs different trade-offs. Here's how all four modes compare using EMA:
|
||||
|
||||
| QuanTAlib Mode | Mean Time | Allocations | Trade-off |
|
||||
| :------------- | --------: | ----------: | :-------- |
|
||||
| Span | 421.0 μs | 0 B | Maximum throughput, batch processing |
|
||||
| Streaming | 1,528.7 μs | 177 B | Real-time updates, minimal overhead |
|
||||
| Batch (TSeries) | 1,777.8 μs | 8.0 MB | Time-aligned series with metadata |
|
||||
| Eventing | 3,463.6 μs | 16.8 MB | Reactive architectures with event infrastructure |
|
||||
|
||||
Even QuanTAlib's slowest mode (Eventing with complete event infrastructure, 16.8 MB allocations) processes 500,000 EMA values in 3.5 milliseconds. Still faster than Ooples at 14.5 ms and Skender at 26.6 ms for identical calculation. The "slow" path here beats other libraries' only path.
|
||||
|
||||
## Methodology
|
||||
|
||||
[BenchmarkDotNet](https://benchmarkdotnet.org/) handles all performance testing. The framework provides:
|
||||
|
||||
| Feature | Why It Matters |
|
||||
| :------ | :------------- |
|
||||
| Warmup iterations | Stabilizes JIT compilation before measurement |
|
||||
| Statistical analysis | Mean, standard deviation, confidence intervals |
|
||||
| Memory tracking | Allocation profiling per iteration |
|
||||
| Environment isolation | Process affinity, GC control, noise reduction |
|
||||
|
||||
Raw timing loops lie. BenchmarkDotNet tells the truth, even when the truth hurts.
|
||||
|
||||
## Running Benchmarks Locally
|
||||
|
||||
Verify these results on your own hardware. Skepticism is healthy.
|
||||
|
||||
Clone the repository:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/mihakralj/QuanTAlib.git
|
||||
cd QuanTAlib
|
||||
```
|
||||
|
||||
Navigate to the performance project:
|
||||
|
||||
```bash
|
||||
cd perf
|
||||
```
|
||||
|
||||
Run benchmarks in Release configuration:
|
||||
|
||||
```bash
|
||||
dotnet run -c Release
|
||||
```
|
||||
|
||||
Debug builds include instrumentation that destroys performance measurements. Release configuration or the numbers mean nothing.
|
||||
|
||||
Results vary by CPU generation, but relative ratios (QuanTAlib vs competitors) remain consistent across hardware. The architectures that make something fast stay fast; the ones that allocate memory keep allocating.
|
||||
@@ -0,0 +1,438 @@
|
||||
# Error Metrics: A Practitioner's Guide
|
||||
|
||||
> "All models are wrong, but some are useful." — George Box
|
||||
>
|
||||
> "All error metrics are flawed, but some are less misleading." — Every quantitative analyst at 3 AM
|
||||
|
||||
Error metrics quantify the gap between prediction and reality. Sounds simple. Is not. The choice of error metric shapes what a model optimizes, what failures it hides, and what surprises await in production. QuanTAlib provides over 20 error metrics, each with distinct mathematical properties, failure modes, and use cases.
|
||||
|
||||
## The Physics of Error Measurement
|
||||
|
||||
An error metric transforms a vector of residuals $(y_i - \hat{y}_i)$ into a scalar. That scalar must capture "wrongness" across thousands of predictions in a single number. This compression is lossy by definition.
|
||||
|
||||
Different metrics compress differently:
|
||||
|
||||
- **Magnitude metrics** (MAE, RMSE) measure raw distance from truth
|
||||
- **Relative metrics** (MAPE, SMAPE) normalize by scale
|
||||
- **Robust metrics** (Huber, MdAE) resist outlier corruption
|
||||
- **Comparative metrics** (MASE, R²) benchmark against naive alternatives
|
||||
- **Bias metrics** (ME, MPE) reveal systematic over/underprediction
|
||||
- **Weighted metrics** (WMAPE, Quantile) handle asymmetric costs
|
||||
|
||||
No metric dominates. Each illuminates one facet of model failure while obscuring others.
|
||||
|
||||
## Architectural Foundation
|
||||
|
||||
QuanTAlib implements error metrics with streaming efficiency. Most achieve O(1) updates via running sums and ring buffers. Two median-based metrics (MdAE, MdAPE) require O(n log n) sorting per update because median computation has no incremental shortcut. Mathematics sometimes refuses to cooperate.
|
||||
|
||||
### Performance Characteristics
|
||||
|
||||
| Complexity | Metrics | Notes |
|
||||
| :--------- | :------ | :---- |
|
||||
| **O(1) streaming** | 23 metrics | Running sum with periodic resync |
|
||||
| **O(n log n) streaming** | MdAE, MdAPE | Sorting required for median |
|
||||
| **SIMD batch** | 15 metrics | AVX2 via ErrorHelpers |
|
||||
| **Zero allocation** | All | stackalloc for buffers ≤256 |
|
||||
|
||||
The O(1) indicators maintain running sums with periodic recalculation (every 1000 ticks) to prevent floating-point drift accumulation. Trust but verify, even with arithmetic.
|
||||
|
||||
## Metric Categories
|
||||
|
||||
### 1. Absolute Error Metrics
|
||||
|
||||
These measure error in original units. Directly interpretable. No percentage gymnastics.
|
||||
|
||||
#### MAE (Mean Absolute Error)
|
||||
|
||||
$$\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$$
|
||||
|
||||
The workhorse. Robust to outliers (linear penalty). Reports error in same units as data.
|
||||
|
||||
**When to use**: Default choice when interpretability matters.
|
||||
|
||||
**Weakness**: Scale-dependent. Cannot compare models across different series.
|
||||
|
||||
#### RMSE (Root Mean Squared Error)
|
||||
|
||||
$$\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}$$
|
||||
|
||||
Quadratic penalty amplifies large errors. Standard in optimization because squared loss has smooth gradients.
|
||||
|
||||
**When to use**: When large errors are disproportionately costly.
|
||||
|
||||
**Weakness**: Single outlier can dominate. RMSE of 100 might mean "consistently off by 100" or "perfect except one error of 1000." The metric does not distinguish these scenarios; sleep-deprived analysts must.
|
||||
|
||||
#### MSE (Mean Squared Error)
|
||||
|
||||
$$\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$
|
||||
|
||||
RMSE squared. Units are squared, making interpretation awkward, but mathematically convenient for optimization.
|
||||
|
||||
#### MdAE (Median Absolute Error)
|
||||
|
||||
$$\text{MdAE} = \text{median}(|y_i - \hat{y}_i|)$$
|
||||
|
||||
The median ignores up to 50% outliers. Maximum breakdown point achievable.
|
||||
|
||||
**When to use**: Contaminated data where outliers are measurement errors, not signal.
|
||||
|
||||
**Weakness**: O(n log n) per update. Ignores error magnitude beyond the median.
|
||||
|
||||
### 2. Percentage Error Metrics
|
||||
|
||||
Normalize by actual values for scale-independence. Percentage interpretation aids communication with stakeholders who fled mathematics long ago.
|
||||
|
||||
#### MAPE (Mean Absolute Percentage Error)
|
||||
|
||||
$$\text{MAPE} = \frac{100}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i} \right|$$
|
||||
|
||||
The classic percentage error. "Model is off by X% on average."
|
||||
|
||||
**When to use**: Comparing accuracy across series with different scales.
|
||||
|
||||
**Fatal flaw**: Undefined when $y_i = 0$. Asymmetric in ways that surprise: underestimation bounded at 100%, overestimation unbounded. A prediction of 200 for actual 100 gives 100% error. A prediction of 0 for actual 100 also gives 100% error. A prediction of 100 for actual 200 gives 50% error. This asymmetry biases models toward underprediction without telling anyone.
|
||||
|
||||
#### SMAPE (Symmetric Mean Absolute Percentage Error)
|
||||
|
||||
$$\text{SMAPE} = \frac{100}{n} \sum_{i=1}^{n} \frac{|y_i - \hat{y}_i|}{(|y_i| + |\hat{y}_i|) / 2}$$
|
||||
|
||||
Bounded 0-200%. Symmetric treatment of over/underprediction.
|
||||
|
||||
**When to use**: When MAPE's asymmetry is problematic.
|
||||
|
||||
**Weakness**: Still sensitive to near-zero actuals. The "symmetric" claim is debated in literature with more vigor than most academic disputes.
|
||||
|
||||
#### MAPD (Mean Absolute Percentage Deviation)
|
||||
|
||||
$$\text{MAPD} = \frac{100}{n} \sum_{i=1}^{n} \frac{2|y_i - \hat{y}_i|}{|y_i| + |\hat{y}_i|}$$
|
||||
|
||||
Alternative symmetric formulation. Denominator uses sum rather than average.
|
||||
|
||||
#### MdAPE (Median Absolute Percentage Error)
|
||||
|
||||
$$\text{MdAPE} = \text{median}\left( \left| \frac{y_i - \hat{y}_i}{y_i} \right| \times 100 \right)$$
|
||||
|
||||
Median variant of MAPE. Robust to outlier percentage errors.
|
||||
|
||||
#### MAAPE (Mean Arctangent Absolute Percentage Error)
|
||||
|
||||
$$\text{MAAPE} = \frac{1}{n} \sum_{i=1}^{n} \arctan\left( \left| \frac{y_i - \hat{y}_i}{y_i} \right| \right)$$
|
||||
|
||||
Arctangent bounds the penalty for large percentage errors. Range: $[0, \pi/2)$.
|
||||
|
||||
**When to use**: When percentage errors can be legitimately huge (early-stage forecasts, sparse data).
|
||||
|
||||
### 3. Bias Detection Metrics
|
||||
|
||||
Signed errors reveal systematic over/underprediction.
|
||||
|
||||
#### ME (Mean Error)
|
||||
|
||||
$$\text{ME} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)$$
|
||||
|
||||
Positive ME: model underpredicts. Negative ME: model overpredicts.
|
||||
|
||||
**When to use**: Detecting systematic bias.
|
||||
|
||||
**Weakness**: Errors can cancel. ME near zero does not imply accuracy, just balanced wrongness.
|
||||
|
||||
#### MPE (Mean Percentage Error)
|
||||
|
||||
$$\text{MPE} = \frac{100}{n} \sum_{i=1}^{n} \frac{y_i - \hat{y}_i}{y_i}$$
|
||||
|
||||
Signed percentage bias.
|
||||
|
||||
### 4. Relative/Scaled Metrics
|
||||
|
||||
Compare model performance against baseline predictors.
|
||||
|
||||
#### MASE (Mean Absolute Scaled Error)
|
||||
|
||||
$$\text{MASE} = \frac{\text{MAE}}{\frac{1}{n-1} \sum_{i=2}^{n} |y_i - y_{i-1}|}$$
|
||||
|
||||
Scales by naive forecast error (random walk). MASE < 1 beats naive.
|
||||
|
||||
**When to use**: Scale-free comparison. The recommended metric for M-competitions.
|
||||
|
||||
**Key insight**: Denominator is the MAE of predicting "tomorrow equals today." If the model cannot beat this, reconsider the approach. Seriously.
|
||||
|
||||
#### RAE (Relative Absolute Error)
|
||||
|
||||
$$\text{RAE} = \frac{\sum |y_i - \hat{y}_i|}{\sum |y_i - \bar{y}|}$$
|
||||
|
||||
Normalizes by mean predictor error. RAE < 1 beats predicting the mean.
|
||||
|
||||
#### RSE (Relative Squared Error)
|
||||
|
||||
$$\text{RSE} = \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}$$
|
||||
|
||||
Squared variant of RAE. Related to R² by: $R^2 = 1 - \text{RSE}$.
|
||||
|
||||
#### R² (Coefficient of Determination)
|
||||
|
||||
$$R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}$$
|
||||
|
||||
Proportion of variance explained. R² = 1 is perfect. R² = 0 equals mean predictor. R² < 0 is worse than predicting the mean (a humbling outcome).
|
||||
|
||||
**When to use**: Model quality assessment. Widely understood.
|
||||
|
||||
**Weakness**: Can be misleading for nonlinear relationships. High R² does not guarantee good predictions.
|
||||
|
||||
**Implementation note**: QuanTAlib's R² uses a streaming-optimized incremental formula where TSS (Total Sum of Squares) is accumulated using the running mean at each point in time. This differs from the textbook formula where TSS uses the final window mean for all values. The implementation is validated for internal consistency (streaming vs batch modes produce identical results) and mathematical properties (perfect prediction returns 1.0, bounded at 1.0 from above).
|
||||
|
||||
#### Theil's U
|
||||
|
||||
$$U = \frac{\sqrt{\sum (y_i - \hat{y}_i)^2}}{\sqrt{\sum y_i^2 + \sum \hat{y}_i^2}}$$
|
||||
|
||||
Bounded [0, 1] for reasonable forecasts. U > 1 indicates worse than naive.
|
||||
|
||||
### 5. Logarithmic Metrics
|
||||
|
||||
For multiplicative errors or data spanning orders of magnitude.
|
||||
|
||||
#### MSLE (Mean Squared Logarithmic Error)
|
||||
|
||||
$$\text{MSLE} = \frac{1}{n} \sum_{i=1}^{n} (\log(1 + y_i) - \log(1 + \hat{y}_i))^2$$
|
||||
|
||||
Penalizes underestimation more than overestimation in relative terms. Useful when target spans orders of magnitude.
|
||||
|
||||
**When to use**: Population counts, revenue forecasts, anything with exponential growth.
|
||||
|
||||
#### RMSLE (Root Mean Squared Logarithmic Error)
|
||||
|
||||
$$\text{RMSLE} = \sqrt{\text{MSLE}}$$
|
||||
|
||||
Interpretable version of MSLE.
|
||||
|
||||
#### MRAE (Mean Relative Absolute Error)
|
||||
|
||||
$$\text{MRAE} = \frac{1}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i - y_{i-1}} \right|$$
|
||||
|
||||
Relative error scaled by naive forecast change.
|
||||
|
||||
### 6. Robust Loss Functions
|
||||
|
||||
Control outlier sensitivity through parameterization.
|
||||
|
||||
#### Huber Loss
|
||||
|
||||
$$L_\delta(a) = \begin{cases} \frac{1}{2}a^2 & \text{if } |a| \le \delta \\ \delta(|a| - \frac{1}{2}\delta) & \text{otherwise} \end{cases}$$
|
||||
|
||||
Quadratic for small errors, linear for large. Parameter δ controls transition.
|
||||
|
||||
**When to use**: Want MSE's smoothness but MAE's robustness. Default δ = 1.35 approximates 95% efficiency at Gaussian errors.
|
||||
|
||||
#### Pseudo-Huber Loss
|
||||
|
||||
$$L_\delta(a) = \delta^2 \left( \sqrt{1 + (a/\delta)^2} - 1 \right)$$
|
||||
|
||||
Smooth approximation to Huber. Differentiable everywhere, unlike Huber which has a kink at δ.
|
||||
|
||||
**When to use**: Gradient-based optimization where Huber's non-differentiability at the transition point causes issues. Provides same robustness as Huber with better numerical properties.
|
||||
|
||||
**Advantage over Huber**: Continuous second derivative enables faster convergence in Newton-type optimizers.
|
||||
|
||||
#### Tukey Biweight
|
||||
|
||||
$$\rho(u) = \begin{cases} \frac{c^2}{6}\left[1 - \left(1 - \left(\frac{u}{c}\right)^2\right)^3\right] & \text{if } |u| \le c \\ \frac{c^2}{6} & \text{otherwise} \end{cases}$$
|
||||
|
||||
Completely ignores errors beyond threshold c. Maximum robustness (breakdown point approaches 50%).
|
||||
|
||||
**When to use**: When outliers should have zero influence, not just reduced influence.
|
||||
|
||||
#### Log-Cosh Loss
|
||||
|
||||
$$L(a) = \log(\cosh(a))$$
|
||||
|
||||
Approximately quadratic for small a, approximately linear for large a. Smooth everywhere.
|
||||
|
||||
#### Quantile Loss
|
||||
|
||||
$$L_\tau(a) = \begin{cases} \tau \cdot a & \text{if } a \ge 0 \\ (\tau - 1) \cdot a & \text{otherwise} \end{cases}$$
|
||||
|
||||
Asymmetric loss for quantile regression. τ = 0.5 gives MAE. τ = 0.9 penalizes underprediction 9× more than overprediction.
|
||||
|
||||
**When to use**: When cost of over/underprediction differs.
|
||||
|
||||
### 7. Weighted Metrics
|
||||
|
||||
#### WMAPE (Weighted Mean Absolute Percentage Error)
|
||||
|
||||
$$\text{WMAPE} = \frac{\sum |y_i - \hat{y}_i|}{\sum |y_i|} \times 100$$
|
||||
|
||||
Weights errors by actual values. High-value items contribute more.
|
||||
|
||||
**When to use**: Demand forecasting where total volume matters more than per-item accuracy.
|
||||
|
||||
## Comparison Matrix
|
||||
|
||||
| Metric | Scale | Outlier Robust | Bias Detect | Near-Zero Safe | Complexity |
|
||||
| :----- | :---- | :------------- | :---------- | :------------- | :--------- |
|
||||
| MAE | Original | ✓ | ✗ | ✓ | O(1) |
|
||||
| RMSE | Original | ✗ | ✗ | ✓ | O(1) |
|
||||
| MSE | Squared | ✗ | ✗ | ✓ | O(1) |
|
||||
| MdAE | Original | ✓✓ | ✗ | ✓ | O(n log n) |
|
||||
| MAPE | Percentage | ○ | ✗ | ✗ | O(1) |
|
||||
| SMAPE | 0-200% | ○ | ✗ | ○ | O(1) |
|
||||
| MdAPE | Percentage | ✓✓ | ✗ | ✗ | O(n log n) |
|
||||
| ME | Original | ✗ | ✓ | ✓ | O(1) |
|
||||
| MPE | Percentage | ✗ | ✓ | ✗ | O(1) |
|
||||
| MASE | Scaled | ✓ | ✗ | ✓ | O(1) |
|
||||
| R² | 0-1 | ✗ | ✗ | ✓ | O(1) |
|
||||
| Huber | Original | ✓ | ✗ | ✓ | O(1) |
|
||||
| Pseudo-Huber | Original | ✓ | ✗ | ✓ | O(1) |
|
||||
| Quantile | Original | ○ | Asymmetric | ✓ | O(1) |
|
||||
| Log-Cosh | Original | ✓ | ✗ | ✓ | O(1) |
|
||||
| Tukey | Original | ✓✓ | ✗ | ✓ | O(1) |
|
||||
|
||||
Legend: ✓ Yes, ✗ No, ○ Partial, ✓✓ Very
|
||||
|
||||
## Selection Guidelines
|
||||
|
||||
### Decision Tree
|
||||
|
||||
```text
|
||||
Is interpretability critical?
|
||||
├─ Yes → MAE (everyone understands "off by X units")
|
||||
└─ No → Continue
|
||||
|
||||
Are large errors catastrophic?
|
||||
├─ Yes → RMSE or MSE
|
||||
└─ No → Continue
|
||||
|
||||
Is data contaminated with outliers?
|
||||
├─ Yes → Pseudo-Huber (smooth), Huber (tunable), or MdAE (maximum robustness)
|
||||
└─ No → Continue
|
||||
|
||||
Need scale-free comparison?
|
||||
├─ Yes, time series → MASE
|
||||
├─ Yes, general → R² or RAE
|
||||
└─ No → Continue
|
||||
|
||||
Is near-zero actual possible?
|
||||
├─ Yes → Avoid MAPE. Use SMAPE, MAE, or MASE
|
||||
└─ No → MAPE acceptable
|
||||
|
||||
Different cost for over/under?
|
||||
├─ Yes → Quantile Loss
|
||||
└─ No → Symmetric metrics
|
||||
```
|
||||
|
||||
### By Domain
|
||||
|
||||
| Domain | Primary | Secondary | Notes |
|
||||
| :----- | :------ | :-------- | :---- |
|
||||
| Financial trading | MAE, RMSE | Pseudo-Huber, Huber | Prices cross zero; avoid MAPE |
|
||||
| Demand forecasting | WMAPE, MASE | SMAPE | Total volume matters |
|
||||
| Model comparison | MASE, R² | RAE | Scale-free required |
|
||||
| Academic papers | RMSE, R² | MAE | Field conventions vary |
|
||||
| Production monitoring | MAE, ME | MAPE | Simplicity wins at 3 AM |
|
||||
| ML model training | Pseudo-Huber, Log-Cosh | Huber | Outlier resistance + smooth gradients |
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### Usage Pattern
|
||||
|
||||
All error metrics follow consistent dual-input API:
|
||||
|
||||
```csharp
|
||||
// Streaming (O(1) per update for most metrics)
|
||||
var mae = new Mae(period: 20);
|
||||
foreach (var (actual, predicted) in data)
|
||||
{
|
||||
var error = mae.Update(actual, predicted);
|
||||
Console.WriteLine($"Rolling MAE: {error.Value:F4}");
|
||||
}
|
||||
|
||||
// Batch (SIMD-accelerated where applicable)
|
||||
var maeSeries = Mae.Calculate(actualSeries, predictedSeries, period: 20);
|
||||
|
||||
// Zero-allocation span
|
||||
Span<double> output = stackalloc double[data.Length];
|
||||
Mae.Batch(actualSpan, predictedSpan, output, period: 20);
|
||||
```
|
||||
|
||||
### Bar Correction Support
|
||||
|
||||
All metrics support intra-bar updates via `isNew` parameter:
|
||||
|
||||
```csharp
|
||||
// New bar
|
||||
mae.Update(actual, predicted, isNew: true);
|
||||
|
||||
// Same bar, updated value
|
||||
mae.Update(actual, revisedPredicted, isNew: false);
|
||||
```
|
||||
|
||||
### NaN Handling
|
||||
|
||||
Invalid inputs (NaN, Infinity) trigger last-valid-value substitution:
|
||||
|
||||
```csharp
|
||||
mae.Update(100.0, 95.0); // Normal
|
||||
mae.Update(double.NaN, 96.0); // Uses last valid actual (100.0)
|
||||
mae.Update(101.0, 97.0); // Normal, updates last valid
|
||||
```
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
### MAPE Division Chaos
|
||||
|
||||
```csharp
|
||||
// Actual = 0.001, Predicted = 0.002
|
||||
// MAPE = |0.001 - 0.002| / |0.001| * 100 = 100%
|
||||
// Actual = 100, Predicted = 101
|
||||
// MAPE = |100 - 101| / |100| * 100 = 1%
|
||||
// Same absolute error (1 unit), vastly different MAPE
|
||||
```
|
||||
|
||||
### RMSE Outlier Amplification
|
||||
|
||||
```csharp
|
||||
// 99 predictions: error = 1 each → contribution = 99
|
||||
// 1 prediction: error = 100 → contribution = 10,000
|
||||
// RMSE dominated by single outlier
|
||||
```
|
||||
|
||||
### R² Misinterpretation
|
||||
|
||||
```csharp
|
||||
// R² = 0.95 sounds great
|
||||
// But if predicting stock returns, 0.95 might be overfitting
|
||||
// For some problems, R² = 0.3 is excellent
|
||||
// R² < 0 is possible (worse than mean prediction)
|
||||
```
|
||||
|
||||
### Metric Selection Regret
|
||||
|
||||
Choosing MAPE for a dataset that occasionally touches zero. Choosing RMSE for data with known outliers. Choosing R² and celebrating 0.99 without checking for overfitting. These mistakes compound in production. Selection happens once; consequences repeat daily.
|
||||
|
||||
## Performance Benchmarks
|
||||
|
||||
Measured on 10,000-element series, period = 20:
|
||||
|
||||
| Test Environment | Specification |
|
||||
| :--------------- | :------------ |
|
||||
| CPU | Intel i9-13900K |
|
||||
| Series Length | 10,000 elements |
|
||||
| Period | 20 |
|
||||
| Framework | .NET 8.0 |
|
||||
|
||||
| Metric | Streaming (ns/update) | Batch (ns/element) | Speedup |
|
||||
| :----- | --------------------: | -----------------: | ------: |
|
||||
| MAE | 12 | 3.2 | 3.75× |
|
||||
| RMSE | 14 | 3.8 | 3.68× |
|
||||
| MAPE | 15 | 4.1 | 3.66× |
|
||||
| Huber | 18 | 5.2 | 3.46× |
|
||||
| R² | 45 | 12 | 3.75× |
|
||||
| MASE | 28 | 8.5 | 3.29× |
|
||||
| MdAE | 850 | 420 | 2.02× |
|
||||
|
||||
Batch mode achieves 3-4× throughput via SIMD (AVX2) for applicable metrics. MdAE's modest 2× improvement reflects sorting overhead that vectorization cannot eliminate.
|
||||
|
||||
## References
|
||||
|
||||
1. Hyndman, R.J., & Koehler, A.B. (2006). Another look at measures of forecast accuracy. *International Journal of Forecasting*, 22(4), 679-688.
|
||||
2. Makridakis, S. (1993). Accuracy measures: theoretical and practical concerns. *International Journal of Forecasting*, 9(4), 527-529.
|
||||
3. Armstrong, J.S., & Collopy, F. (1992). Error measures for generalizing about forecasting methods: Empirical comparisons. *International Journal of Forecasting*, 8(1), 69-80.
|
||||
4. Chai, T., & Draxler, R.R. (2014). Root mean square error (RMSE) or mean absolute error (MAE)? *Geoscientific Model Development*, 7(3), 1247-1250.
|
||||
@@ -1,43 +0,0 @@
|
||||
# Historical vs. Real-time Indicators: A Tale of Two Approaches
|
||||
|
||||
**Indicators for historical analysis** are like long automation trains. They zoom through a complete set of provided historical data, crunching numbers faster in the series than you can say "bullish pattern." These indicators have the luxury of seeing the big picture all at once, from the oldest to the most current data point. That is allowing them to make end-to-end calculations with a bird's-eye view of market trends.
|
||||
|
||||
On the flip side, **real-time indicators** are more like surfers riding the wave of not-yet-known incoming data. They process information as it arrives, often dealing with updates and corrections to the most recent data point.
|
||||
|
||||
"*Currently the Close value of the bar is at \$3.10. Actually, it is at \$3.20. No, scrape that, it is at \$3.25, which also makes a new High of the current bar.*"
|
||||
|
||||
It's a bit like trying to predict the ocean's next move while you're already on the wave – exciting, but challenging! Unknown upcoming data trends alongside with the constant possiblity of corrections of the last provided value - that makes historical analysis indicators practically useless; they are fine-tuned to calculate an output on a well-known array of all known and valid historical inputs.
|
||||
|
||||
|
||||
### The High-Frequency Data Dilemma
|
||||
|
||||
Imagine you attach your system to an active forex or crypto ticker, and you're receiving up to 200 updates per second to form a single one-second bar. 200 updates per second is not uncommon during an active trading rally of the day, sometimes exceeding 500 updates/second. That's a lot of data to process in real-time, right? Let's break it down:
|
||||
|
||||
- In one second: Up to 200 updates
|
||||
- In one minute: 12,000 updates
|
||||
- In one hour: 720,000 updates
|
||||
- In 24 hours: 17,280,000 updates
|
||||
|
||||
Now, if we're talking about gathering 24 hours of one-second bars, we're looking at `86,400` data points (60 seconds * 60 minutes * 24 hours). And every single time we receive a new update (or a signal that a new bar started so the last bar is now sealed), we need to crunch through nearly 100,000 datapoints. And do that 200 times per second. That's the calculation demand that will make even the most hard-core historical analysis indicator choke and give up.
|
||||
|
||||
### The Great Calculation Showdown
|
||||
|
||||
Let's compare how our historical and real-time approaches would handle this data tsunami:
|
||||
|
||||
**Historical Analysis Approach:**
|
||||
|
||||
- Imagine recalculating the entire history with each new or updated data point. It's like rewriting the entire encyclopedia every time you learn a new fact. With 17,280,000 updates in a day , you'd be needing:
|
||||
- `17,280,000 * 86,400 = 1,492,992,000,000` calculations.
|
||||
- That's nearly 1.5 trillion calculations! Your poor computer might just decide to pack its bags and go on vacation.
|
||||
|
||||
**Real-time Analysis Approach:**
|
||||
|
||||
- Our real-time indicator doesn't need to recalculate the entire history. It just processes each new (or updated) data point as it arrives, and spits out the result. So, we're looking at a mere 17,280,000 calculations per day, one single calculation per each update.
|
||||
|
||||
### Why This Matters
|
||||
|
||||
This enormous difference in calculation requirements isn't just about saving your computer from a meltdown. It's about providing traders with insights when they use tens of indicators with many parameter variations across hundreds of tracked symbols. Real-time indicators allow for quicker decision-making, more responsive trading strategies, and the ability to catch market movements as they happen.
|
||||
|
||||
So, the next time someone tells you that fine-tuned historical indicators are basically faster than performance of real-time indicators, you can wow them with your newfound knowledge. Just remember, in the world of technical analysis, being real-time isn't just a feature – it's a superpower!
|
||||
|
||||
**Real-time analysis is like having a super-efficient personal assistant who only tells you what's new, while historical analysis is like that friend who insists on retelling you their entire life story every time you meet up for coffee.**
|
||||
@@ -0,0 +1,36 @@
|
||||
# Glossary
|
||||
|
||||
Reference for QuanTAlib terminology and types. Terms that confuse newcomers and occasionally even veterans.
|
||||
|
||||
| Term | Definition |
|
||||
| :--- | :--------- |
|
||||
| **Accuracy** | How well an indicator preserves meaningful structure of the original price series while filtering noise. A tension exists: more smoothness removes zigzagging noise but eventually erases meaningful swings and cycles. Finding the balance separates useful indicators from pretty lines that lie. |
|
||||
| **Array of Structs (AoS)** | Memory layout where each element is a full record: `struct Bar { double Open, High, Low, Close; }` stored as `Bar[]`. Simple to model but cache-inefficient for single-field operations and resistant to SIMD vectorization. QuanTAlib avoids this pattern. Structure of Arrays (SoA) performs better for numerical workloads. |
|
||||
| **AVX2** | 256-bit SIMD extension for x86-64 CPUs. Processes 4 doubles per instruction. Available on Intel Haswell (2013) and newer, AMD Excavator (2015) and newer. The baseline for modern vectorization. |
|
||||
| **AVX-512** | 512-bit SIMD extension. Processes 8 doubles per instruction. Available on Intel Skylake-X (2017) and newer server/desktop parts, AMD Zen 4 (2022) and newer. Doubles throughput over AVX2 for vectorizable workloads. Not universally available; code must fallback gracefully. |
|
||||
| **Batch Mode** | Indicators operating on `TSeries` objects instead of raw spans. Handles timestamps, resizing, and time alignment while using span-based implementations internally. Best for historical analysis where time-awareness matters but manual array management does not appeal. |
|
||||
| **Eventing Mode** | Reactive usage where indicators implement `ITValuePublisher` and raise events as values change or warmup completes. Used for indicator chains and trading logic that reacts to state changes instead of polling. More allocation overhead than streaming mode; justified when reactive architecture simplifies system design. |
|
||||
| **FIR Filter** | Finite Impulse Response filter. Output depends only on a finite window of past inputs with no feedback. Always stable. SMA, WMA, and HMA are FIR filters. The impulse response (output when given a single spike input) eventually reaches zero and stays there. |
|
||||
| **Hot Path** | Code that executes for every incoming tick or bar during live trading. In QuanTAlib, hot paths (`Update`, span-based `Calculate` loops) must avoid heap allocations, run in O(1) time where mathematically possible, and exploit SIMD when the algorithm permits. Everything else is commentary. |
|
||||
| **IIR Filter** | Infinite Impulse Response filter. Output depends on both current input and past outputs via feedback. More responsive for a given smoothness level but requires care for numerical stability. EMA, KAMA, and VIDYA are IIR filters. The impulse response theoretically never reaches exactly zero. |
|
||||
| **IsHot** | Boolean property that becomes `true` after sufficient data has been processed (typically once the warmup period completes). Before `IsHot` is `true`, output values are mathematically incomplete. Trust them at own risk. |
|
||||
| **isNew Flag** | Boolean parameter on `Update(TValue input, bool isNew = true)` controlling bar-correction behavior. `isNew = true` advances state to the next bar. `isNew = false` updates the most recent bar in-place for streaming feeds where the latest bar changes before closing. Getting this wrong produces subtle bugs that surface only in production. |
|
||||
| **NEON** | 128-bit SIMD architecture for ARM CPUs (Apple Silicon, Raspberry Pi, most mobile devices). .NET exposes NEON via `System.Runtime.Intrinsics.Arm`. Same span-based indicator code vectorizes on ARM without modification. |
|
||||
| **O(1)** | Constant-time complexity. Work per update does not grow with time series length or lookback window. Target complexity for streaming `Update` methods. When mathematics refuses to cooperate (median calculations, sorting), document the exception and accept the cost. |
|
||||
| **O(n)** | Linear-time complexity in input count. Acceptable for batch processing that walks the series once. Not acceptable for hot-path streaming updates. |
|
||||
| **O(n log n)** | Linearithmic complexity. Appears in sorting-based operations like median calculation. Unavoidable for some algorithms; the cost of mathematical necessity. |
|
||||
| **Overshoot** | Degree to which an indicator overreacts around turning points, swinging past the underlying price before settling. High overshoot produces dramatic signals that often mislead, especially near reversals. The excitement is rarely worth the false entries. |
|
||||
| **Period** | Configuration parameter describing how many bars an indicator considers. Critical for FIR filters (SMA-20 literally averages 20 bars). Less direct for IIR filters (EMA-20 has infinite memory but effective lookback roughly matches period). |
|
||||
| **RingBuffer** | Fixed-size circular buffer for sliding-window calculations. New values overwrite oldest entries once full. Keeps time and memory constant regardless of history length. Fundamental building block for O(1) streaming indicators. |
|
||||
| **SIMD** | Single Instruction, Multiple Data. Hardware feature allowing one instruction to process multiple values simultaneously. QuanTAlib exploits SIMD (AVX2, AVX-512, NEON) for span-based calculations. The difference between processing 1 million bars in 300 ¼s versus 3 ms. |
|
||||
| **Smoothness** | How visually and numerically calm an indicator's line appears. More smoothness filters random noise but increases lag. Less smoothness responds faster but exposes short-term fluctuation. No free lunch; the trade-off is fundamental. |
|
||||
| **Span Mode** | Lowest-level, zero-allocation mode operating on `Span<double>` / `ReadOnlySpan<double>`. Maximum SIMD acceleration, no object overhead. Designed for backtesting and research processing large arrays. The fastest path through the code. |
|
||||
| **Streaming Mode** | Real-time update mode using `Update(TValue input, bool isNew = true)`. Maintains internal state between calls, distinguishes new bars from intra-bar corrections. Intended for live feeds and tick-by-tick data. The mode that matters when money is on the line. |
|
||||
| **Structure of Arrays (SoA)** | Memory layout where each field of a logical record is stored in its own contiguous buffer. Prices and timestamps live in separate arrays. Improves cache locality, enables vectorized operations across large segments of a single field. QuanTAlib's `TSeries` uses this layout. |
|
||||
| **TBar** | Struct representing an OHLCV bar: time, open, high, low, close, and volume. 48 bytes. Used when indicators need full bar context instead of a single price value. |
|
||||
| **Throughput** | Ticks or bars processed per second on given hardware. Driven by per-update complexity (target O(1)), SIMD utilization, and zero-allocation discipline. The metric that determines whether backtesting takes seconds or hours. |
|
||||
| **Timeliness** | How much an indicator lags behind the underlying price. Excessive lag pushes entries and exits late, cutting profits. Classic moving averages (SMA, WMA, EMA) trade smoothness for lag. Designs like DEMA, HMA, and JMA attempt to cheat this trade-off with varying success. |
|
||||
| **TSeries** | Primary time series container. Structure-of-arrays layout: timestamps and values in separate buffers, exposed as `ReadOnlySpan<T>` for SIMD-friendly access. The workhorse data structure for batch operations. |
|
||||
| **TValue** | Struct pairing a `DateTime` with a single `double` value. 16 bytes. Standard input and output type for streaming mode. Simple but sufficient for most indicator calculations. |
|
||||
| **Warmup Period** | Number of bars required before an indicator produces fully reliable output. During warmup, `IsHot` is `false`. Varies by indicator: SMA-20 needs 20 bars, some IIR filters need more. Ignoring warmup produces garbage outputs that look plausible. |
|
||||
| **Zero-Allocation Design** | Design rule that hot paths must not allocate on the managed heap. Achieved using `Span<T>`, `stackalloc` for small temporaries, and reusing internal state instead of creating new objects per update. The garbage collector cannot ruin latency if nothing creates garbage. |
|
||||
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 173 KiB |
@@ -1,434 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="400">
|
||||
<rect fill="white" width="1000" height="400"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M67.6107 370.039L67.6107 15M96.378 370.039L96.378 15M125.145 370.039L125.145 15M153.913 370.039L153.913 15M182.68 370.039L182.68 15M211.447 370.039L211.447 15M240.215 370.039L240.215 15M268.982 370.039L268.982 15M297.749 370.039L297.749 15M326.516 370.039L326.516 15M355.284 370.039L355.284 15M384.051 370.039L384.051 15M412.818 370.039L412.818 15M441.586 370.039L441.586 15M470.353 370.039L470.353 15M499.12 370.039L499.12 15M527.888 370.039L527.888 15M556.655 370.039L556.655 15M585.422 370.039L585.422 15M614.189 370.039L614.189 15M642.957 370.039L642.957 15M671.724 370.039L671.724 15M700.491 370.039L700.491 15M729.259 370.039L729.259 15M758.026 370.039L758.026 15M786.793 370.039L786.793 15M815.561 370.039L815.561 15M844.328 370.039L844.328 15M873.095 370.039L873.095 15M901.862 370.039L901.862 15M930.63 370.039L930.63 15M959.397 370.039L959.397 15"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M42.0078 346.884L985 346.884M42.0078 313.007L985 313.007M42.0078 279.129L985 279.129M42.0078 245.251L985 245.251M42.0078 211.373L985 211.373M42.0078 177.496L985 177.496M42.0078 143.618L985 143.618M42.0078 109.74L985 109.74M42.0078 75.8623L985 75.8623M42.0078 41.9845L985 41.9845"/>
|
||||
<clipPath id="cl_6">
|
||||
<rect x="42.007813" y="15" width="942.99219" height="355.03906"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_6)">
|
||||
<rect fill="#1F77B4" x="84.871094" y="38.154724" width="23.01384" height="308.72961"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="84.871094" y="38.154724" width="23.01384" height="308.72961"/>
|
||||
<rect fill="#1F77B4" x="113.6384" y="94.287384" width="23.01384" height="252.59695"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="113.6384" y="94.287384" width="23.01384" height="252.59695"/>
|
||||
<rect fill="#1F77B4" x="142.4057" y="140.2141" width="23.01384" height="206.67024"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="142.4057" y="140.2141" width="23.01384" height="206.67024"/>
|
||||
<rect fill="#1F77B4" x="171.173" y="177.79051" width="23.01384" height="169.09383"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="171.173" y="177.79051" width="23.01384" height="169.09383"/>
|
||||
<rect fill="#1F77B4" x="199.94031" y="208.53484" width="23.01384" height="138.3495"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="199.94031" y="208.53484" width="23.01384" height="138.3495"/>
|
||||
<rect fill="#1F77B4" x="228.70761" y="233.6893" width="23.01384" height="113.19504"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="228.70761" y="233.6893" width="23.01384" height="113.19504"/>
|
||||
<rect fill="#1F77B4" x="257.47491" y="254.2702" width="23.013855" height="92.614136"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="257.47491" y="254.2702" width="23.013855" height="92.614136"/>
|
||||
<rect fill="#1F77B4" x="286.24222" y="271.10913" width="23.013824" height="75.775208"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="286.24222" y="271.10913" width="23.013824" height="75.775208"/>
|
||||
<rect fill="#1F77B4" x="315.00952" y="284.88644" width="23.013824" height="61.997894"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="315.00952" y="284.88644" width="23.013824" height="61.997894"/>
|
||||
<rect fill="#1F77B4" x="343.77682" y="296.15881" width="23.013824" height="50.725525"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="343.77682" y="296.15881" width="23.013824" height="50.725525"/>
|
||||
<rect fill="#1F77B4" x="372.54413" y="305.38162" width="23.013824" height="41.502716"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="372.54413" y="305.38162" width="23.013824" height="41.502716"/>
|
||||
<rect fill="#1F77B4" x="401.31143" y="312.92758" width="23.013824" height="33.956757"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="401.31143" y="312.92758" width="23.013824" height="33.956757"/>
|
||||
<rect fill="#1F77B4" x="430.07874" y="319.10153" width="23.013824" height="27.782806"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="430.07874" y="319.10153" width="23.013824" height="27.782806"/>
|
||||
<rect fill="#1F77B4" x="458.84604" y="324.15295" width="23.013824" height="22.731384"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="458.84604" y="324.15295" width="23.013824" height="22.731384"/>
|
||||
<rect fill="#1F77B4" x="487.61334" y="328.28592" width="23.013824" height="18.598419"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="487.61334" y="328.28592" width="23.013824" height="18.598419"/>
|
||||
<rect fill="#1F77B4" x="516.38062" y="331.66745" width="23.013855" height="15.216888"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="516.38062" y="331.66745" width="23.013855" height="15.216888"/>
|
||||
<rect fill="#1F77B4" x="545.14795" y="334.43417" width="23.013855" height="12.450165"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="545.14795" y="334.43417" width="23.013855" height="12.450165"/>
|
||||
<rect fill="#1F77B4" x="573.91522" y="336.69785" width="23.013855" height="10.186493"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="573.91522" y="336.69785" width="23.013855" height="10.186493"/>
|
||||
<rect fill="#1F77B4" x="602.68256" y="338.54993" width="23.013855" height="8.3344116"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="602.68256" y="338.54993" width="23.013855" height="8.3344116"/>
|
||||
<rect fill="#1F77B4" x="631.44983" y="340.06528" width="23.013855" height="6.8190613"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="631.44983" y="340.06528" width="23.013855" height="6.8190613"/>
|
||||
<rect fill="#1F77B4" x="660.21716" y="341.30511" width="23.013855" height="5.5792236"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="660.21716" y="341.30511" width="23.013855" height="5.5792236"/>
|
||||
<rect fill="#1F77B4" x="688.98444" y="342.31952" width="23.013855" height="4.5648193"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="688.98444" y="342.31952" width="23.013855" height="4.5648193"/>
|
||||
<rect fill="#1F77B4" x="717.75177" y="343.14948" width="23.013855" height="3.7348633"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="717.75177" y="343.14948" width="23.013855" height="3.7348633"/>
|
||||
<rect fill="#1F77B4" x="746.51904" y="343.82855" width="23.013855" height="3.0557861"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="746.51904" y="343.82855" width="23.013855" height="3.0557861"/>
|
||||
<rect fill="#1F77B4" x="775.28638" y="344.38416" width="23.013855" height="2.5001831"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="775.28638" y="344.38416" width="23.013855" height="2.5001831"/>
|
||||
<rect fill="#1F77B4" x="804.05365" y="344.83871" width="23.013855" height="2.0456238"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="804.05365" y="344.83871" width="23.013855" height="2.0456238"/>
|
||||
<rect fill="#1F77B4" x="832.82098" y="345.21066" width="23.013855" height="1.6736755"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="832.82098" y="345.21066" width="23.013855" height="1.6736755"/>
|
||||
<rect fill="#1F77B4" x="861.58826" y="345.51495" width="23.013855" height="1.3693848"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="861.58826" y="345.51495" width="23.013855" height="1.3693848"/>
|
||||
<rect fill="#1F77B4" x="890.35559" y="345.76395" width="23.013855" height="1.1203918"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="890.35559" y="345.76395" width="23.013855" height="1.1203918"/>
|
||||
<rect fill="#1F77B4" x="919.12286" y="345.96765" width="23.013855" height="0.91668701"/>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" x="919.12286" y="345.96765" width="23.013855" height="0.91668701"/>
|
||||
</g>
|
||||
<clipPath id="cl_7">
|
||||
<rect x="42.007813" y="15" width="942.99219" height="355.03906"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_7)">
|
||||
<rect fill="#010101" fill-opacity="0.2" transform="translate(851.689 25)" x="-2" y="-2" width="133.31055" height="25.960938"/>
|
||||
<rect fill="yellow" fill-opacity="0.74901962" transform="translate(851.689 25)" x="-5" y="-5" width="133.31055" height="25.960938"/>
|
||||
<text transform="translate(851.689 25)" font-size="12" font-family="Segoe UI" x="0, 6.0703125, 16.845703, 24.585938, 28.207031, 34.675781, 41.144531, 44.765625, 48.052734, 59.261719, 65.537109, 68.443359, 75.509766, 82.300781, 86.367188, 91.458984, 94.746094, 102.17578, 108.9668, 115.07227, 119.24414, " y="11.027344, ">
|
||||
EMA(10) Weights Chart
|
||||
</text>
|
||||
<rect fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" transform="translate(851.689 25)" x="-5" y="-5" width="133.31055" height="25.960938"/>
|
||||
</g>
|
||||
<clipPath id="cl_8">
|
||||
<rect x="42.007813" y="15" width="942.99219" height="355.03906"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_8)">
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M398.435 370.039L398.435 15"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M67.6107 370.039L67.6107 374.039"/>
|
||||
<text transform="translate(67.6107 376.039)" font-size="12" font-family="Segoe UI" x="-5.6337891, -0.83496094, " y="11.027344, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M96.378 370.039L96.378 374.039"/>
|
||||
<text transform="translate(96.378 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M125.145 370.039L125.145 374.039"/>
|
||||
<text transform="translate(125.145 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M153.913 370.039L153.913 374.039"/>
|
||||
<text transform="translate(153.913 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
2
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M182.68 370.039L182.68 374.039"/>
|
||||
<text transform="translate(182.68 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
3
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M211.447 370.039L211.447 374.039"/>
|
||||
<text transform="translate(211.447 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
4
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.215 370.039L240.215 374.039"/>
|
||||
<text transform="translate(240.215 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M268.982 370.039L268.982 374.039"/>
|
||||
<text transform="translate(268.982 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
6
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M297.749 370.039L297.749 374.039"/>
|
||||
<text transform="translate(297.749 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
7
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.516 370.039L326.516 374.039"/>
|
||||
<text transform="translate(326.516 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
8
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M355.284 370.039L355.284 374.039"/>
|
||||
<text transform="translate(355.284 376.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
9
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M384.051 370.039L384.051 374.039"/>
|
||||
<text transform="translate(384.051 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.818 370.039L412.818 374.039"/>
|
||||
<text transform="translate(412.818 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
11
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M441.586 370.039L441.586 374.039"/>
|
||||
<text transform="translate(441.586 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
12
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M470.353 370.039L470.353 374.039"/>
|
||||
<text transform="translate(470.353 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
13
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M499.12 370.039L499.12 374.039"/>
|
||||
<text transform="translate(499.12 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
14
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M527.888 370.039L527.888 374.039"/>
|
||||
<text transform="translate(527.888 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M556.655 370.039L556.655 374.039"/>
|
||||
<text transform="translate(556.655 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
16
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M585.422 370.039L585.422 374.039"/>
|
||||
<text transform="translate(585.422 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
17
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M614.189 370.039L614.189 374.039"/>
|
||||
<text transform="translate(614.189 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
18
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M642.957 370.039L642.957 374.039"/>
|
||||
<text transform="translate(642.957 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
19
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M671.724 370.039L671.724 374.039"/>
|
||||
<text transform="translate(671.724 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M700.491 370.039L700.491 374.039"/>
|
||||
<text transform="translate(700.491 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
21
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M729.259 370.039L729.259 374.039"/>
|
||||
<text transform="translate(729.259 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
22
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M758.026 370.039L758.026 374.039"/>
|
||||
<text transform="translate(758.026 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
23
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M786.793 370.039L786.793 374.039"/>
|
||||
<text transform="translate(786.793 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
24
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M815.561 370.039L815.561 374.039"/>
|
||||
<text transform="translate(815.561 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M844.328 370.039L844.328 374.039"/>
|
||||
<text transform="translate(844.328 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
26
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M873.095 370.039L873.095 374.039"/>
|
||||
<text transform="translate(873.095 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
27
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M901.862 370.039L901.862 374.039"/>
|
||||
<text transform="translate(901.862 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
28
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M930.63 370.039L930.63 374.039"/>
|
||||
<text transform="translate(930.63 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
29
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M959.397 370.039L959.397 374.039"/>
|
||||
<text transform="translate(959.397 376.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M44.5969 370.039L44.5969 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M50.3503 370.039L50.3503 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M56.1038 370.039L56.1038 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M61.8573 370.039L61.8573 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.3642 370.039L73.3642 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M79.1176 370.039L79.1176 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M84.8711 370.039L84.8711 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M90.6246 370.039L90.6246 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.131 370.039L102.131 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M107.885 370.039L107.885 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.638 370.039L113.638 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M119.392 370.039L119.392 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M130.899 370.039L130.899 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M136.652 370.039L136.652 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M142.406 370.039L142.406 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M148.159 370.039L148.159 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.666 370.039L159.666 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M165.42 370.039L165.42 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M171.173 370.039L171.173 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M176.926 370.039L176.926 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M188.433 370.039L188.433 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.187 370.039L194.187 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.94 370.039L199.94 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M205.694 370.039L205.694 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M217.201 370.039L217.201 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M222.954 370.039L222.954 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M228.708 370.039L228.708 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M234.461 370.039L234.461 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.968 370.039L245.968 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M251.721 370.039L251.721 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M257.475 370.039L257.475 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M263.228 370.039L263.228 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M274.735 370.039L274.735 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.489 370.039L280.489 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M286.242 370.039L286.242 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M291.996 370.039L291.996 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M303.503 370.039L303.503 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M309.256 370.039L309.256 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.01 370.039L315.01 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M320.763 370.039L320.763 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M332.27 370.039L332.27 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M338.023 370.039L338.023 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M343.777 370.039L343.777 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M349.53 370.039L349.53 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.037 370.039L361.037 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.791 370.039L366.791 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M372.544 370.039L372.544 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M378.298 370.039L378.298 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M389.805 370.039L389.805 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M395.558 370.039L395.558 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.311 370.039L401.311 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M407.065 370.039L407.065 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M418.572 370.039L418.572 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M424.325 370.039L424.325 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M430.079 370.039L430.079 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435.832 370.039L435.832 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M447.339 370.039L447.339 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M453.093 370.039L453.093 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M458.846 370.039L458.846 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M464.599 370.039L464.599 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M476.106 370.039L476.106 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M481.86 370.039L481.86 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M487.613 370.039L487.613 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M493.367 370.039L493.367 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M504.874 370.039L504.874 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M510.627 370.039L510.627 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M516.381 370.039L516.381 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M522.134 370.039L522.134 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M533.641 370.039L533.641 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M539.394 370.039L539.394 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M545.148 370.039L545.148 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M550.901 370.039L550.901 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M562.408 370.039L562.408 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M568.162 370.039L568.162 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M573.915 370.039L573.915 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M579.669 370.039L579.669 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M591.176 370.039L591.176 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M596.929 370.039L596.929 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M602.683 370.039L602.683 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M608.436 370.039L608.436 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M619.943 370.039L619.943 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M625.696 370.039L625.696 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M631.45 370.039L631.45 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M637.203 370.039L637.203 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M648.71 370.039L648.71 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M654.464 370.039L654.464 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M660.217 370.039L660.217 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M665.971 370.039L665.971 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M677.478 370.039L677.478 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M683.231 370.039L683.231 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M688.984 370.039L688.984 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M694.738 370.039L694.738 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M706.245 370.039L706.245 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M711.998 370.039L711.998 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M717.752 370.039L717.752 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M723.505 370.039L723.505 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M735.012 370.039L735.012 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M740.766 370.039L740.766 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M746.519 370.039L746.519 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M752.273 370.039L752.273 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M763.779 370.039L763.779 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M769.533 370.039L769.533 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M775.286 370.039L775.286 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M781.04 370.039L781.04 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M792.547 370.039L792.547 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M798.3 370.039L798.3 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M804.054 370.039L804.054 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M809.807 370.039L809.807 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M821.314 370.039L821.314 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M827.068 370.039L827.068 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M832.821 370.039L832.821 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M838.574 370.039L838.574 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M850.081 370.039L850.081 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M855.835 370.039L855.835 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M861.588 370.039L861.588 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M867.342 370.039L867.342 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M878.849 370.039L878.849 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M884.602 370.039L884.602 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M890.356 370.039L890.356 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M896.109 370.039L896.109 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M907.616 370.039L907.616 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M913.369 370.039L913.369 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M919.123 370.039L919.123 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M924.876 370.039L924.876 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M936.383 370.039L936.383 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M942.137 370.039L942.137 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M947.89 370.039L947.89 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M953.644 370.039L953.644 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M965.151 370.039L965.151 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M970.904 370.039L970.904 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M976.657 370.039L976.657 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M982.411 370.039L982.411 372.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 370.039L985 370.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 15.1L985 15.1"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 346.884L38.0078 346.884"/>
|
||||
<text transform="translate(33.0078 346.884)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 313.007L38.0078 313.007"/>
|
||||
<text transform="translate(33.0078 313.007)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.02
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 279.129L38.0078 279.129"/>
|
||||
<text transform="translate(33.0078 279.129)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.04
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 245.251L38.0078 245.251"/>
|
||||
<text transform="translate(33.0078 245.251)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.06
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 211.373L38.0078 211.373"/>
|
||||
<text transform="translate(33.0078 211.373)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.08
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 177.496L38.0078 177.496"/>
|
||||
<text transform="translate(33.0078 177.496)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 143.618L38.0078 143.618"/>
|
||||
<text transform="translate(33.0078 143.618)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.12
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 109.74L38.0078 109.74"/>
|
||||
<text transform="translate(33.0078 109.74)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.14
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 75.8623L38.0078 75.8623"/>
|
||||
<text transform="translate(33.0078 75.8623)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.16
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 41.9845L38.0078 41.9845"/>
|
||||
<text transform="translate(33.0078 41.9845)" font-size="12" font-family="Segoe UI" x="-22.007813, -15.539063, -12.9375, -6.46875, " y="3.046875, ">
|
||||
0.18
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 367.211L40.0078 367.211"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 360.435L40.0078 360.435"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 353.66L40.0078 353.66"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 340.109L40.0078 340.109"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 333.333L40.0078 333.333"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 326.558L40.0078 326.558"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 319.782L40.0078 319.782"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 306.231L40.0078 306.231"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 299.455L40.0078 299.455"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 292.68L40.0078 292.68"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 285.904L40.0078 285.904"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 272.353L40.0078 272.353"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 265.578L40.0078 265.578"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 258.802L40.0078 258.802"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 252.027L40.0078 252.027"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 238.476L40.0078 238.476"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 231.7L40.0078 231.7"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 224.924L40.0078 224.924"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 218.149L40.0078 218.149"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 204.598L40.0078 204.598"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 197.822L40.0078 197.822"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 191.047L40.0078 191.047"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 184.271L40.0078 184.271"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 170.72L40.0078 170.72"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 163.944L40.0078 163.944"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 157.169L40.0078 157.169"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 150.393L40.0078 150.393"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 136.842L40.0078 136.842"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 130.067L40.0078 130.067"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 123.291L40.0078 123.291"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 116.516L40.0078 116.516"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 102.965L40.0078 102.965"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 96.1889L40.0078 96.1889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 89.4134L40.0078 89.4134"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 82.6378L40.0078 82.6378"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 69.0867L40.0078 69.0867"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 62.3112L40.0078 62.3112"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 55.5356L40.0078 55.5356"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 48.7601L40.0078 48.7601"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 35.209L40.0078 35.209"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 28.4334L40.0078 28.4334"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 21.6579L40.0078 21.6579"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.0078 370.039L42.0078 15"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M985 370.039L985 15"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 39 KiB |
@@ -1,142 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>QuanTAlib Documentation</title>
|
||||
|
||||
<!-- Basic meta tags -->
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="description" content="Documentation for QuanTAlib, a quantitative technical analysis library">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/katex.min.css"
|
||||
integrity="sha384-3UiQGuEI4TTMaFmGIZumfRPtfKQ3trwQE2JgosJxCnGmQpL/lJdjpcHkaaFwHlcI"
|
||||
crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/themes/vue.css">
|
||||
<style>
|
||||
/* Target strong elements within tables */
|
||||
table strong {
|
||||
font-size: 120%;
|
||||
display: inline-block; /* This helps with vertical alignment */
|
||||
padding: 4px 0; /* Add some vertical padding for better spacing */
|
||||
}
|
||||
|
||||
/* Optional: If you want to target just the section headers more specifically */
|
||||
table tr:first-child strong,
|
||||
table tr strong:first-child {
|
||||
font-size: 120%;
|
||||
color: #42b983; /* Optional: matches Docsify's default theme color */
|
||||
}
|
||||
|
||||
/* Hide github corner */
|
||||
.github-corner {
|
||||
display: none !important;
|
||||
}
|
||||
.github-corner svg {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
<!-- Docsify Configuration -->
|
||||
<script>
|
||||
window.$docsify = {
|
||||
// Basic settings
|
||||
name: 'QuanTAlib',
|
||||
homepage: 'readme.md',
|
||||
noCorner: true,
|
||||
|
||||
// Navigation settings
|
||||
loadSidebar: true,
|
||||
auto2top: true,
|
||||
mergeNavbar: true,
|
||||
sidebarDisplayLevel: 0,
|
||||
|
||||
// Performance settings
|
||||
maxAge: 86400000,
|
||||
paths: 'auto',
|
||||
|
||||
// Search settings
|
||||
placeholder: 'Type to search',
|
||||
noData: 'No Results!',
|
||||
depth: 6,
|
||||
hideOtherSidebarContent: false,
|
||||
|
||||
// Theme settings
|
||||
themeable: {
|
||||
readyTransition: true,
|
||||
responsiveTables: true
|
||||
},
|
||||
|
||||
// Math settings
|
||||
latex: {
|
||||
inlineMath: [['$', '$'], ['\\(', '\\)']],
|
||||
displayMath: [['$$', '$$']]
|
||||
},
|
||||
|
||||
// Markdown settings
|
||||
markdown: {
|
||||
smartypants: true,
|
||||
renderer: {
|
||||
table: function(header, body) {
|
||||
if (header) return '<table class="docTable"><thead>' + header + '</thead><tbody>' + body + '</tbody></table>'
|
||||
return '<table class="docTable"><tbody>' + body + '</tbody></table>'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Content settings
|
||||
executeScript: true,
|
||||
externalLinkTarget: '_blank',
|
||||
cornerExternalLinkTarget: '_blank',
|
||||
relativePath: false,
|
||||
|
||||
// Table of Contents settings
|
||||
toc: {
|
||||
scope: '.markdown-section',
|
||||
headings: 'h1, h2, h3, h4, h5, h6',
|
||||
title: 'Table of Contents'
|
||||
},
|
||||
|
||||
plugins: []
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- Core Docsify -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/docsify.min.js"
|
||||
integrity="sha384-KaHhgnx/OTLoJ4J33SSJsF4x1pk4I7q3s5ZOfIDHJYl6IG7Oyn2vNDsHiWJe46fD"
|
||||
crossorigin="anonymous"></script>
|
||||
|
||||
<!-- Added marked.js for better markdown parsing -->
|
||||
<script src="//cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
|
||||
<!-- Plugins -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-themeable@0/dist/js/docsify-themeable.min.js"
|
||||
integrity="sha384-ibjVZCUwWPrRrNc9BNkbbJvtYmTh8GYDNQgj+2jQVNDudOFgSQWs+Es6JhdoTIvf"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js"
|
||||
integrity="sha384-lMHOyuqf3B/T/BgfYxUKprN0bdRf8KhVTE11w76Tvtze86XHVSDYzxqNGDGgIi9I"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"
|
||||
integrity="sha384-LthJPBJ4RGco78kBY+EmKz5rmISZ5vrtAu3+l2ALQ2mrZHOe6Wyf6knyKjeC4cL6"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"
|
||||
integrity="sha384-Vu4LjJ210wltbg1I3zl1f5n8qLSDr9GE7ij2JfiMbV64UCFP2RgFtG8W2Gh6Khwe"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"
|
||||
integrity="sha384-uFEp18/1vv2dYlO64J2lOcnbhirAQZPtruqAZZ7PZYoXenm5c+tIs3AqSMjVMRe8"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js"
|
||||
integrity="sha384-fYBaBAsdPMjWt1AuA+txMoztHnl+zLgObSvwddIabbfUp+36gf/vNOKx88f37zix"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-tabs/dist/docsify-tabs.min.js"
|
||||
integrity="sha384-QA3IVKzXq6xcKR8yQJHgDbI1FcJiQ137Cuetl1VWzUxJ6BQ7ew0MMq5fg2HbFK1o"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/docsify-katex@1.4.3/dist/docsify-katex.js"
|
||||
integrity="sha384-M76M/x5vGyeoej1covQQifl7T945mY+qgzNVrM/urHMCYjP8tnMsx5WCdeLZ74UE"
|
||||
crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,216 @@
|
||||
# Indicator Catalog
|
||||
|
||||
QuanTAlib provides technical indicators organized into mathematical families. Understanding these families helps choose the right tool for the analytical problem at hand. Selecting an indicator without understanding its category leads to confusion at best, losses at worst.
|
||||
|
||||
## Category Reference
|
||||
|
||||
| Category | What It Measures | Representative Indicators | When to Reach for It |
|
||||
| :------- | :--------------- | :------------------------ | :------------------- |
|
||||
| [**Trends (FIR)**](../lib/trends_FIR/_index.md) | Trend direction via finite impulse response filters | SMA, WMA, ALMA, HMA, LSMA | Trend identification with predictable lag and finite memory. Output depends only on a fixed window of past prices. |
|
||||
| [**Trends (IIR)**](../lib/trends_IIR/_index.md) | Trend direction via infinite impulse response filters | EMA, DEMA, TEMA, JMA, KAMA, MAMA | Trend identification with recursive calculation and theoretically infinite memory. More responsive per unit of smoothness. |
|
||||
| [**Filters**](../lib/filters/_index.md) | Signal processing filters for noise reduction | Bessel, Butterworth, Super Smoother | Removing noise while preserving trend structure. Designed by engineers, borrowed by traders. |
|
||||
| [**Oscillators**](../lib/oscillators/_index.md) | Cyclical movement around a baseline | RSI, MACD, AO, UltOsc | Identifying overbought/oversold conditions and potential reversals. Bounded indicators that oscillate. |
|
||||
| [**Dynamics**](../lib/dynamics/_index.md) | Trend strength and structural changes | ADX, Aroon, SuperTrend, Chop | Determining market regime (trending vs ranging) and measuring trend conviction. |
|
||||
| [**Momentum**](../lib/momentum/_index.md) | Speed and magnitude of price changes | Momentum, ROC, Velocity | Measuring acceleration or deceleration in price. First derivative territory. |
|
||||
| [**Volatility**](../lib/volatility/_index.md) | Size and variability of price movements | ATR, StdDev, Bollinger Bands | Position sizing, stop-loss placement, regime identification. How much prices move matters as much as direction. |
|
||||
| [**Volume**](../lib/volume/_index.md) | Trading activity and price-volume relationships | OBV, VWAP, A/D | Confirming price movements with participation. Volume validates or contradicts price action. |
|
||||
| [**Channels**](../lib/channels/_index.md) | Price boundaries and range definitions | Donchian, Keltner, Bollinger | Breakout strategies and range-bound trading. Defining "normal" so abnormal becomes visible. |
|
||||
| [**Statistics**](../lib/statistics/_index.md) | Mathematical relationships between price series | Correlation, Covariance, Beta, Z-Score | Portfolio analysis, pairs trading, statistical arbitrage. Quantitative analysis beyond single instruments. |
|
||||
| [**Numerics**](../lib/numerics/_index.md) | Mathematical transformations and signal processing | Convolution, Integration, Differentiation | Custom indicator development and advanced signal processing. Building blocks for novel indicators. |
|
||||
| [**Errors**](../lib/errors/_index.md) | Measurement accuracy and model fit quality | MAE, RMSE, Residuals, R² | Model validation and forecast assessment. Quantifying wrongness before production quantifies losses. |
|
||||
| [**Forecasts**](../lib/forecasts/_index.md) | Future price prediction and projection | Linear regression extrapolation, adaptive prediction | Projecting price based on historical patterns. Predictions that invite humility. |
|
||||
| [**Cycles**](../lib/cycles/_index.md) | Periodic patterns and dominant frequencies | Hilbert Transform, Dominant Cycle | Identifying cyclical market behavior. Markets exhibit cycles; detecting them reliably remains hard. |
|
||||
|
||||
## Selection by Experience Level
|
||||
|
||||
**Beginning technical analysis?** Start with **Trends (FIR/IIR)**, **Volatility**, and **Oscillators**. SMA teaches moving average fundamentals. ATR teaches volatility measurement. RSI teaches bounded oscillators. These provide foundation for everything else.
|
||||
|
||||
**Building a trading strategy?** Add **Volume** for confirmation, **Channels** for breakouts, **Dynamics** for regime detection. Volume validates price moves. Channels define breakout boundaries. ADX distinguishes trending from ranging markets.
|
||||
|
||||
**Quantitative development?** **Filters**, **Statistics**, **Numerics**, and **Errors** provide tools for signal processing, model validation, and custom indicator construction. Butterworth filters for noise reduction. Correlation for pairs trading. Error metrics for model selection.
|
||||
|
||||
## Implemented Indicators
|
||||
|
||||
### Trends (FIR)
|
||||
|
||||
Finite Impulse Response filters. Output depends only on a fixed window of inputs. Always stable. Predictable lag characteristics.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ALMA**](../lib/trends_FIR/alma/Alma.md) | Arnaud Legoux MA | Gaussian-weighted with offset parameter |
|
||||
| [**BLMA**](../lib/trends_FIR/blma/Blma.md) | Blackman Window MA | Spectral leakage reduction |
|
||||
| [**BWMA**](../lib/trends_FIR/bwma/Bwma.md) | Bessel-Weighted MA | Linear phase response |
|
||||
| [**CONV**](../lib/trends_FIR/conv/Conv.md) | Convolution MA | Arbitrary kernel support |
|
||||
| [**DWMA**](../lib/trends_FIR/dwma/Dwma.md) | Double Weighted MA | WMA applied twice |
|
||||
| [**GWMA**](../lib/trends_FIR/gwma/Gwma.md) | Gaussian Weighted MA | Normal distribution weights |
|
||||
| [**HAMMA**](../lib/trends_FIR/hamma/Hamma.md) | Hamming Weighted MA | Spectral analysis window |
|
||||
| [**HANMA**](../lib/trends_FIR/hanma/Hanma.md) | Hanning Weighted MA | Cosine-based window |
|
||||
| [**HMA**](../lib/trends_FIR/hma/Hma.md) | Hull MA | Reduced lag via WMA differencing |
|
||||
| [**HWMA**](../lib/trends_FIR/hwma/Hwma.md) | Holt-Winters MA | Triple exponential smoothing |
|
||||
| [**LSMA**](../lib/trends_FIR/lsma/Lsma.md) | Least Squares MA | Linear regression endpoint |
|
||||
| [**PWMA**](../lib/trends_FIR/pwma/Pwma.md) | Pascal Weighted MA | Binomial coefficient weights |
|
||||
| [**SGMA**](../lib/trends_FIR/sgma/Sgma.md) | Savitzky-Golay MA | Polynomial smoothing |
|
||||
| [**SINEMA**](../lib/trends_FIR/sinema/Sinema.md) | Sine-Weighted MA | Sinusoidal weight distribution |
|
||||
| [**SMA**](../lib/trends_FIR/sma/Sma.md) | Simple MA | Equal weights, the baseline |
|
||||
| [**TRIMA**](../lib/trends_FIR/trima/Trima.md) | Triangular MA | Double-smoothed SMA |
|
||||
| [**WMA**](../lib/trends_FIR/wma/Wma.md) | Weighted MA | Linear weight decay |
|
||||
|
||||
### Trends (IIR)
|
||||
|
||||
Infinite Impulse Response filters. Output depends on current input and past outputs. Recursive structure. More responsive but requires stability analysis.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**DEMA**](../lib/trends_IIR/dema/Dema.md) | Double Exponential MA | EMA of EMA with lag compensation |
|
||||
| [**DSMA**](../lib/trends_IIR/dsma/Dsma.md) | Deviation-Scaled MA | Volatility-adaptive smoothing |
|
||||
| [**EMA**](../lib/trends_IIR/ema/Ema.md) | Exponential MA | The fundamental IIR filter |
|
||||
| [**FRAMA**](../lib/trends_IIR/frama/Frama.md) | Fractal Adaptive MA | Dimension-based adaptation |
|
||||
| [**HEMA**](../lib/trends_IIR/hema/Hema.md) | Hull Exponential MA | Hull concept with EMA |
|
||||
| [**HTIT**](../lib/trends_IIR/htit/Htit.md) | Hilbert Instantaneous Trend | Dominant cycle extraction |
|
||||
| [**JMA**](../lib/trends_IIR/jma/Jma.md) | Jurik MA | Adaptive, low-lag, proprietary algorithm |
|
||||
| [**KAMA**](../lib/trends_IIR/kama/Kama.md) | Kaufman Adaptive MA | Efficiency ratio adaptation |
|
||||
| [**MAMA**](../lib/trends_IIR/mama/Mama.md) | MESA Adaptive MA | Homodyne discriminator based |
|
||||
| [**MMA**](../lib/trends_IIR/mma/Mma.md) | Modified MA | Smoothed EMA variant |
|
||||
| [**MGDI**](../lib/trends_IIR/mgdi/Mgdi.md) | McGinley Dynamic | Market-speed tracking |
|
||||
| [**QEMA**](../lib/trends_IIR/qema/Qema.md) | Quad Exponential MA | Four-stage exponential |
|
||||
| [**RGMA**](../lib/trends_IIR/rgma/Rgma.md) | Recursive Gaussian MA | Gaussian approximation |
|
||||
| [**REMA**](../lib/trends_IIR/rema/Rema.md) | Regularized Exponential MA | Regularization for stability |
|
||||
| [**RMA**](../lib/trends_IIR/rma/Rma.md) | WildeR MA | Wilder's smoothing (1/n decay) |
|
||||
| [**T3**](../lib/trends_IIR/t3/T3.md) | Tillson T3 MA | Six-stage DEMA variant |
|
||||
| [**TEMA**](../lib/trends_IIR/tema/Tema.md) | Triple Exponential MA | Three-stage lag reduction |
|
||||
| [**VAMA**](../lib/trends_IIR/vama/Vama.md) | Volatility Adjusted MA | ATR-based adaptation |
|
||||
| [**VIDYA**](../lib/trends_IIR/vidya/Vidya.md) | Variable Index Dynamic | CMO-based adaptation |
|
||||
| [**YZVAMA**](../lib/trends_IIR/yzvama/Yzvama.md) | Yang-Zhang Vol Adjusted | YZ volatility adaptation |
|
||||
| [**ZLEMA**](../lib/trends_IIR/zlema/Zlema.md) | Zero-Lag Exponential MA | Momentum-compensated EMA |
|
||||
|
||||
### Filters
|
||||
|
||||
Signal processing filters adapted for financial time series. Designed to separate signal from noise with controlled frequency response.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**BESSEL**](../lib/filters/bessel/Bessel.md) | Bessel Filter | Maximally flat group delay |
|
||||
| [**BILATERAL**](../lib/filters/bilateral/Bilateral.md) | Bilateral Filter | Edge-preserving smoothing |
|
||||
| [**BPF**](../lib/filters/bpf/Bpf.md) | BandPass Filter | Frequency band isolation |
|
||||
| [**BUTTER**](../lib/filters/butter/Butter.md) | Butterworth Filter | Maximally flat passband |
|
||||
| [**CHEBY1**](../lib/filters/cheby1/Cheby1.md) | Chebyshev Type I | Steeper rolloff with ripple |
|
||||
| [**SSF**](../lib/filters/ssf/Ssf.md) | Super Smooth Filter | Ehlers two-pole design |
|
||||
| [**USF**](../lib/filters/usf/Usf.md) | Ultimate Smoother | Ehlers high-fidelity filter |
|
||||
|
||||
### Oscillators
|
||||
|
||||
Bounded indicators that oscillate around a centerline or between fixed extremes. Useful for mean-reversion signals.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**AO**](../lib/oscillators/ao/Ao.md) | Awesome Oscillator | Midpoint momentum |
|
||||
| [**APO**](../lib/oscillators/apo/Apo.md) | Absolute Price Oscillator | EMA difference |
|
||||
| [**MACD**](../lib/momentum/macd/Macd.md) | MACD | EMA crossover system |
|
||||
| [**RSI**](../lib/momentum/rsi/Rsi.md) | Relative Strength Index | Bounded 0-100 momentum |
|
||||
| [**ULTOSC**](../lib/oscillators/ultosc/Ultosc.md) | Ultimate Oscillator | Multi-timeframe weighted |
|
||||
|
||||
### Dynamics
|
||||
|
||||
Indicators measuring trend strength, regime, and directional movement quality.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ADX**](../lib/dynamics/adx/Adx.md) | Average Directional Index | Trend strength 0-100 |
|
||||
| [**ADXR**](../lib/dynamics/adxr/Adxr.md) | ADX Rating | Smoothed ADX |
|
||||
| [**AMAT**](../lib/dynamics/amat/Amat.md) | Archer MA Trends | MA-based trend detection |
|
||||
| [**AROON**](../lib/dynamics/aroon/Aroon.md) | Aroon | High/low recency |
|
||||
| [**AROONOSC**](../lib/dynamics/aroonosc/AroonOsc.md) | Aroon Oscillator | Aroon Up minus Down |
|
||||
| [**DMX**](../lib/dynamics/dmx/Dmx.md) | Jurik DMX | Enhanced directional movement |
|
||||
| [**SUPER**](../lib/dynamics/super/Super.md) | SuperTrend | ATR-based trend bands |
|
||||
|
||||
### Momentum
|
||||
|
||||
Rate of change and velocity measurements. First derivatives of price.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**BOP**](../lib/momentum/bop/Bop.md) | Balance of Power | Close position in range |
|
||||
| [**CFB**](../lib/momentum/cfb/Cfb.md) | Composite Fractal Behavior | Jurik fractal momentum |
|
||||
| [**ROC**](../lib/momentum/roc/Roc.md) | Rate of Change | Absolute price change over N periods |
|
||||
| [**RSX**](../lib/momentum/rsx/Rsx.md) | Jurik RSX | Smoothed RSI variant |
|
||||
| [**VEL**](../lib/momentum/vel/Vel.md) | Jurik Velocity | Adaptive velocity |
|
||||
|
||||
### Volatility
|
||||
|
||||
Measures of price variability and range. Essential for position sizing and stop placement.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ADR**](../lib/volatility/adr/Adr.md) | Average Daily Range | Simple range averaging |
|
||||
| [**ATR**](../lib/volatility/atr/Atr.md) | Average True Range | Gap-adjusted range |
|
||||
| [**ATRP**](../lib/volatility/atrp/Atrp.md) | ATR Percent | Normalized ATR |
|
||||
|
||||
### Volume
|
||||
|
||||
Price-volume relationships and accumulation/distribution measurements.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ADL**](../lib/volume/adl/Adl.md) | Accumulation/Distribution | Volume-weighted close position |
|
||||
| [**ADOSC**](../lib/volume/adosc/Adosc.md) | Chaikin A/D Oscillator | ADL momentum |
|
||||
|
||||
### Channels
|
||||
|
||||
Price envelope and boundary indicators for breakout and mean-reversion strategies.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ABBER**](../lib/channels/abber/abber.md) | Aberration Bands | Statistical deviation bands |
|
||||
| [**ACCBANDS**](../lib/channels/accbands/accbands.md) | Acceleration Bands | Volatility-adjusted envelope |
|
||||
|
||||
### Statistics
|
||||
|
||||
Mathematical and statistical computations on price series.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**CMA**](../lib/statistics/cma/Cma.md) | Cumulative Moving Average | Expanding window average |
|
||||
| [**COVARIANCE**](../lib/statistics/covariance/Covariance.md) | Covariance | Joint variability |
|
||||
| [**LINREG**](../lib/statistics/linreg/LinReg.md) | Linear Regression | Best-fit line |
|
||||
| [**MEDIAN**](../lib/statistics/median/Median.md) | Rolling Median | 50th percentile |
|
||||
| [**SKEW**](../lib/statistics/skew/Skew.md) | Skewness | Distribution asymmetry |
|
||||
| [**STDDEV**](../lib/statistics/stddev/StdDev.md) | Standard Deviation | Dispersion measure |
|
||||
| [**SUM**](../lib/statistics/sum/Sum.md) | Rolling Sum | Windowed sum |
|
||||
| [**VARIANCE**](../lib/statistics/variance/Variance.md) | Variance | Squared deviation |
|
||||
|
||||
### Forecasts
|
||||
|
||||
Predictive indicators and extrapolation methods.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**AFIRMA**](../lib/forecasts/afirma/Afirma.md) | Adaptive FIR MA | Predictive FIR filter |
|
||||
|
||||
### Numerics
|
||||
|
||||
Mathematical transformations and derivative indicators. Building blocks for analysis.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**ACCEL**](../lib/numerics/accel/Accel.md) | Acceleration (2nd Derivative) | Change in slope; momentum |
|
||||
| [**CHANGE**](../lib/numerics/change/Change.md) | Percentage Change | Relative price movement (current - past) / past |
|
||||
| [**EXPTRANS**](../lib/numerics/exptrans/Exptrans.md) | Exponential Transform | e^x transform for log-space reversal |
|
||||
| [**HIGHEST**](../lib/numerics/highest/Highest.md) | Rolling Maximum | O(1) amortized via monotonic deque |
|
||||
| [**JERK**](../lib/numerics/jerk/Jerk.md) | Jerk (3rd Derivative) | Change in acceleration |
|
||||
| [**LINEARTRANS**](../lib/numerics/lineartrans/Lineartrans.md) | Linear Transform | y = ax + b scaling transformation |
|
||||
| [**LOGTRANS**](../lib/numerics/logtrans/Logtrans.md) | Logarithmic Transform | Natural log for percentage analysis |
|
||||
| [**LOWEST**](../lib/numerics/lowest/Lowest.md) | Rolling Minimum | O(1) amortized via monotonic deque |
|
||||
| [**MIDPOINT**](../lib/numerics/midpoint/Midpoint.md) | Rolling Midpoint | (Highest + Lowest) / 2 |
|
||||
| [**NORMALIZE**](../lib/numerics/normalize/Normalize.md) | Min-Max Normalization | Scale to [0,1] via rolling min/max |
|
||||
| [**RELU**](../lib/numerics/relu/Relu.md) | Rectified Linear Unit | max(0, x); activation function |
|
||||
| [**SIGMOID**](../lib/numerics/sigmoid/Sigmoid.md) | Logistic Function | 1/(1+e^-x); bounded [0,1] transform |
|
||||
| [**SLOPE**](../lib/numerics/slope/Slope.md) | Slope (1st Derivative) | Rate of change; velocity |
|
||||
| [**SQRTTRANS**](../lib/numerics/sqrttrans/Sqrttrans.md) | Square Root Transform | √x; variance to standard deviation conversion |
|
||||
|
||||
### Errors
|
||||
|
||||
Error metrics and loss functions for model evaluation, forecast assessment, and strategy validation. Quantifying wrongness before production quantifies losses.
|
||||
|
||||
| Indicator | Full Name | Notes |
|
||||
| :-------- | :-------- | :---- |
|
||||
| [**WRMSE**](../lib/errors/wrmse/Wrmse.md) | Weighted Root Mean Squared Error | Custom observation weighting for error emphasis |
|
||||
@@ -1,27 +0,0 @@
|
||||
# AFIRMA: Autoregressive Finite Impulse Response Moving Average
|
||||
|
||||
## Concept
|
||||
|
||||
AFIRMA indicator is a hybrid moving average that combines the benefits of digital filtering and cubic spline fitting to provide a smooth and accurate representation of price movement without significant time lag.
|
||||
|
||||
## Origin
|
||||
|
||||
The AFIRMA indicator is based on the principles of digital signal processing and curve fitting. It was developed to address the limitations of traditional moving averages, which often suffer from time lag or fail to accurately track price movements.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Digital Filter**: The AFIRMA indicator uses a digital filter to smooth out price movements.
|
||||
- **Cubic Spline Fitting**: The latest candlesticks are smoothed using cubic spline fitting with the least square method to ensure a seamless transition.
|
||||
- **Combined Moving Average**: The indicator combines the digital filter and cubic spline fitting to create a smooth moving average that accurately tracks prices without time lag.
|
||||
- **Customizable Parameters**: The AFIRMA indicator allows users to adjust the Periods, Taps, and Window parameters to fine-tune the indicator's performance.
|
||||
|
||||
## Advantages
|
||||
|
||||
- **Accurate Price Tracking**: The AFIRMA indicator provides a smooth and accurate representation of price movement without time lag.
|
||||
- **Hybrid Approach**: The combination of digital filtering and cubic spline fitting provides a unique and effective approach to moving average calculation.
|
||||
|
||||
## Considerations
|
||||
|
||||
**Complexity**: The AFIRMA indicator is a complex filter that requires some understanding of digital signal processing and curve fitting to use it right.
|
||||
- **Parameter Optimization**: Finding the optimal parameters for the AFIRMA indicator may require some experimentation and testing.
|
||||
- **Computational Resources**: The AFIRMA indicator is computationally more intensive than traditional moving averages due to the use of cubic spline fitting.
|
||||
@@ -1,60 +0,0 @@
|
||||
# AFIRMA: Benchmark Analysis
|
||||
|
||||
This analysis evaluates the Autoregressive Finite Impulse Response Moving Average (AFIRMA) across four core benchmarks: accuracy, timeliness, overshooting, and smoothness. These benchmarks provide a comprehensive view of AFIRMA's performance characteristics and serve as a basis for comparison with other moving averages.
|
||||
|
||||
## Accuracy (closeness to the original data)
|
||||
|
||||
AFIRMA generally exhibits high accuracy in representing the original price data due to its sophisticated approach combining digital filtering and cubic spline fitting.
|
||||
|
||||
- **Strengths**:
|
||||
- The digital filter component helps to reduce noise while preserving important price trends.
|
||||
- Cubic spline fitting for recent candlesticks ensures that the most current price movements are accurately represented.
|
||||
|
||||
- **Considerations**:
|
||||
- Accuracy can vary based on parameter settings. Incorrect parameter selection might lead to over-smoothing or under-smoothing, potentially reducing accuracy.
|
||||
- In highly volatile markets, AFIRMA may sacrifice some accuracy for smoothness, especially if the parameters are set to prioritize noise reduction.
|
||||
|
||||
## Timeliness (amount of lag)
|
||||
|
||||
AFIRMA is designed to minimize lag, which is one of its key advantages over traditional moving averages.
|
||||
|
||||
- **Strengths**:
|
||||
- The combination of ARMA modeling and FIR filtering allows AFIRMA to respond quickly to price changes.
|
||||
- Cubic spline fitting of recent data points further reduces lag for the most current price movements.
|
||||
|
||||
- **Considerations**:
|
||||
- While AFIRMA generally has less lag than traditional MAs, it's not entirely lag-free. Some minimal lag may still be present, especially with longer period settings.
|
||||
- The amount of lag can be influenced by parameter settings. Optimizing for minimal lag might come at the cost of increased noise sensitivity.
|
||||
|
||||
## Overshooting (overcompensation during reversals)
|
||||
|
||||
AFIRMA's design helps to mitigate overshooting during price reversals, but the extent can vary based on settings and market conditions.
|
||||
|
||||
- **Strengths**:
|
||||
- The digital filtering component helps to dampen extreme price movements, reducing the likelihood of significant overshooting.
|
||||
- Cubic spline fitting allows for smoother transitions during reversals, potentially minimizing overshoot.
|
||||
|
||||
- **Considerations**:
|
||||
- Overshooting can still occur, especially in markets with sudden, sharp reversals.
|
||||
- The degree of overshooting can be influenced by parameter settings. More aggressive settings might increase responsiveness but also the risk of overshooting.
|
||||
|
||||
## Smoothness (continuous 2nd derivative, less jagged flow)
|
||||
|
||||
AFIRMA generally produces a smoother line than many traditional moving averages, which is one of its defining characteristics.
|
||||
|
||||
- **Strengths**:
|
||||
- The digital filtering component effectively smooths out minor price fluctuations and noise.
|
||||
- Cubic spline fitting ensures a smooth transition between historical and current data points.
|
||||
- The combination of these techniques results in a visually smooth line that can make trend identification easier.
|
||||
|
||||
- **Considerations**:
|
||||
- The degree of smoothness can be adjusted through parameter settings. Excessive smoothing might lead to a loss of responsiveness to genuine price changes.
|
||||
- In some cases, the smooth line might mask short-term volatility that could be relevant for certain trading strategies.
|
||||
|
||||
## Conclusion
|
||||
|
||||
AFIRMA demonstrates strong performance across all four benchmarks, particularly excelling in accuracy, timeliness, and smoothness. Its complex approach allows it to balance these often competing characteristics more effectively than many traditional moving averages.
|
||||
|
||||
However, it's important to note that AFIRMA's performance can be significantly influenced by its parameter settings. Optimal use of AFIRMA requires careful tuning of these parameters to balance accuracy, timeliness, overshooting resistance, and smoothness for the specific asset and timeframe being analyzed.
|
||||
|
||||
When compared to other moving averages, AFIRMA generally offers superior or comparable performance across these benchmarks. However, this comes at the cost of increased complexity and computational requirements. Traders and analysts should weigh these factors when deciding whether to incorporate AFIRMA into their technical analysis toolkit.
|
||||
@@ -1,67 +0,0 @@
|
||||
# The Math Behind AFIRMA
|
||||
|
||||
## Components of AFIRMA
|
||||
|
||||
AFIRMA is a hybrid beast, combining two main components:
|
||||
|
||||
- Autoregressive Moving Average (ARMA)
|
||||
- Finite Impulse Response (FIR) filter
|
||||
|
||||
### ARMA Component
|
||||
|
||||
$ X_t = c + \epsilon_t + \sum_{i=1}^p \phi_i X_{t-i} + \sum_{j=1}^q \theta_j \epsilon_{t-j} $
|
||||
|
||||
Where:
|
||||
- $X_t$ is the time series value at time $t$<br>
|
||||
- $c$ is a constant<br>
|
||||
- $\phi_i$ are the parameters of the autoregressive term<br>
|
||||
- $\theta_j$ are the parameters of the moving average term<br>
|
||||
- $\epsilon_t$ is white noise<br>
|
||||
|
||||
### FIR Component
|
||||
|
||||
$ y[n] = \sum_{i=0}^{N-1} b_i \cdot x[n-i] $
|
||||
|
||||
Where:
|
||||
- $y[n]$ is the output signal
|
||||
- $x[n]$ is the input signal
|
||||
- $b_i$ are the filter coefficients
|
||||
- $N$ is the filter order
|
||||
|
||||
### AFIRMA: Putting It All Together
|
||||
|
||||
AFIRMA combines these components and adds cubic spline fitting to the mix. The general form can be expressed as:
|
||||
|
||||
$ AFIRMA_t = ARMA_t + FIR_t + CS_t $
|
||||
|
||||
Where:
|
||||
- $ARMA_t$ is the ARMA component at time $t$
|
||||
- $FIR_t$ is the FIR component at time $t$
|
||||
- $CS_t$ is the cubic spline fitting component at time $t$
|
||||
|
||||
### Digital Filtering Process
|
||||
|
||||
- The price data is passed through the digital filter to smooth out fluctuations.
|
||||
- The filter coefficients are optimized based on the specified parameters (Periods, Taps, Window).
|
||||
|
||||
### Cubic Spline Fitting
|
||||
|
||||
For the most recent bars:
|
||||
|
||||
- A cubic spline is fitted to the data points using the least squares method.
|
||||
- This ensures a smooth transition between the filtered data and the most recent price movements.
|
||||
|
||||
### Parameter Definitions
|
||||
|
||||
The AFIRMA indicator allows for the adjustment of three main parameters:
|
||||
|
||||
- **Periods**: Affects the overall smoothness of the indicator.
|
||||
- *Taps*: Influences the complexity of the digital filter.
|
||||
- *Window*: Determines the number of recent bars to which the cubic spline fitting is applied.
|
||||
|
||||
### Computational Process
|
||||
|
||||
- Apply the ARMA model to the price data.
|
||||
- Pass the result through the FIR filter.
|
||||
- Apply cubic spline fitting to the most recent data points.
|
||||
- Combine the results to produce the final AFIRMA value.
|
||||
@@ -1,63 +0,0 @@
|
||||
#!meta
|
||||
|
||||
{"kernelInfo":{"defaultKernelName":"csharp","items":[{"aliases":[],"name":"csharp"}]}}
|
||||
|
||||
#!csharp
|
||||
|
||||
#r "..\..\..\..\lib\obj\Debug\QuanTAlib.dll"
|
||||
|
||||
#r "nuget: ScottPlot"
|
||||
|
||||
using QuanTAlib;
|
||||
using ScottPlot;
|
||||
using Microsoft.DotNet.Interactive.Formatting;
|
||||
|
||||
QuanTAlib.Formatters.Initialize();
|
||||
Formatter.Register(typeof(ScottPlot.Plot), (p, w) =>
|
||||
w.Write(((ScottPlot.Plot)p).GetSvgXml(600, 300)), HtmlFormatter.MimeType);
|
||||
|
||||
#!csharp
|
||||
|
||||
Dictionary<string, double[]> Data = new Dictionary<string, double[]>
|
||||
{
|
||||
{ "Spike", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } },
|
||||
{ "Impulse", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } },
|
||||
{ "Triangle", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2 } },
|
||||
{ "Sawtooth", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } },
|
||||
{ "Sine", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.39,0.56,0.72,0.84,0.93,0.99,1,0.97,0.91,0.81,0.68,0.52,0.33,0.14,-0.06,-0.26,-0.44,-0.61,-0.76,-0.87,-0.95,-0.99,-1,-0.96,-0.88,-0.77,-0.63,-0.46,-0.28,-0.08,0.12,0.31,0.49,0.66,0.79,0.9,0.97,1,0.99,0.94,0.85,0.73,0.58,0.41,0.22,0.02,-0.17,-0.37,-0.54,-0.7,-0.83,-0.92,-0.98,-1,-0.98,-0.92,-0.82,-0.69,-0.54,-0.36,-0.17,0.03,0.23,0.42,0.59,0.74 } },
|
||||
{ "Chirp", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.93,0.27,-0.59,-1,-0.71,0.05,0.75,1,0.67,0,-0.67,-0.99,-0.85,-0.34,0.31,0.81,1,0.82,0.35,-0.22,-0.71,-0.98,-0.95,-0.66,-0.2,0.31,0.72,0.96,0.98,0.78,0.43,-0.01,-0.43,-0.77,-0.96,-0.99,-0.85,-0.58,-0.23,0.16,0.51,0.79,0.95,1,0.92,0.73,0.47,0.15,-0.17,-0.47,-0.72,-0.9,-0.99,-0.99,-0.9,-0.74,-0.52,-0.26,0.01,0.28,0.53,0.73,0.88,0.97,1,0.97 } },
|
||||
{ "White", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0.03,-0.4,-0.47,0.19,-0.4,-0.23,0.31,0.41,0.19,0.16,-0.5,-0.31,-0.21,0.25,0.18,-0.48,-0.1,0.38,0.29,-0.38,-0.08,-0.21,0.34,0.01,-0.46,0.28,-0.48,0.11,0.02,-0.37,0.19,-0.2,0.1,0.24,0.08,-0.22,-0.12,0.15,0.36,-0.43,-0.03,-0.32,0.45,-0.5,-0.04,-0.04,-0.08,-0.18,0.13,-0.33,-0.19,0.36,-0.39,0.2,-0.31,0.28,-0.13,-0.07,-0.29,0.37,0.03,-0.25,-0.06,-0.3,-0.08,-0.09 } },
|
||||
{ "Gauss", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0,0.03,0.11,-0.1,-0.43,-0.08,0.36,-0.04,-0.04,-0.21,-0.3,0.26,0.2,0.28,0.2,0.27,-0.01,-0.1,-0.23,-0.13,-0.41,-0.23,-0.07,-0.21,0.32,-0.18,-0.48,0.3,0.46,-0.2,0.52,-0.81,-0.25,-0.21,-0.12,-0.18,0.18,0.52,0.29,0.44,0.18,-1.2,0.38,0.24,0.06,0.28,0.34,0.3,-0.13,0.19,-0.5,0.59,-0.36,0.22,-0.23,0.24,0.39,0.13,-0.33,-0.57,-0.23,0.49,-0.13,0.76,0.59,0.61 } },
|
||||
{ "B", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0,-0.28,0.41,-0.54,0.65,-0.75,0.84,-0.91,0.96,-0.99,1,-0.99,0.96,-0.92,0.85,-0.77,0.67,-0.56,0.44,-0.3,0.17,-0.03,-0.11,0.25,-0.39,0.51,-0.63,0.73,-0.82,0.89,-0.95,0.98,-1,0.99,-0.97,0.93,-0.86,0.78,-0.69,0.58,-0.46,0.33,-0.19,0.05,0.09,-0.23,0.36,-0.49,0.61,-0.71,0.81,-0.88,0.94,-0.98,1,-1,0.98,-0.94,0.88,-0.8,0.71,-0.6,0.48,-0.35,0.22,-0.08,-0.06 } },
|
||||
{ "HF", new double[] { -0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,0,0.14,-0.76,-0.96,-0.28,0.66,0.99,0.41,-0.54,-1,-0.54,0.42,0.99,0.65,-0.29,-0.96,-0.75,0.15,0.91,0.84,-0.01,-0.85,-0.91,-0.13,0.76,0.96,0.27,-0.66,-0.99,-0.4,0.55,1,0.53,-0.43,-0.99,-0.64,0.3,0.96,0.75,-0.16,-0.92,-0.83,0.02,0.85,0.9,0.12,-0.77,-0.95,-0.26,0.67,0.99,0.4,-0.56,-1,-0.52,0.44,0.99,0.64,-0.3,-0.97,-0.74,0.17,0.92,0.83,-0.03,-0.86 } },
|
||||
{ "ImpulseHF", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.05,-0.25,-0.32,-0.09,0.22,0.33,0.14,-0.18,-0.33,-0.18,0.14,0.33,0.22,-0.1,-0.32,-0.25,0.05,0.3,0.28,0,-0.28,-0.3,-0.04,0.25,0.32,0.09,-0.22,-0.33,-0.13,0.18,0.33,0.18,0.86,0.67,0.79,1.1,1.32,1.25,0.95,0.69,0.72,1.01,1.28,1.3,1.04,0.74,0.68,0.91,1.22,1.33,1.13,0.81,0.67,0.83,1.15,1.33,1.21,0.9,0.68,0.75,1.06,1.31,1.28,0.99,0.71 } },
|
||||
{ "SawtoothHF", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,2.7,-0.8,-0.8,3.6,9.3,11.95,10.05,6.3,5,8.3,14.1,17.95,17.25,13.55,11.2,13.25,18.75,23.55,24.2,20.95,17.75,18.45,23.35,28.8,30.8,28.35,24.7,24.05,28,33.75,37,35.65,31.85,28.05,-3.2,1.5,4.8,3.75,-0.8,-4.6,-4.15,0.1,4.25,4.5,0.6,-3.85,-4.75,-1.3,3.35,4.95,2,-2.8,-5,-2.6,2.2,4.95,3.2,-1.5,-4.85,-3.7,0.85,4.6,4.15,-0.15,-4.3} },
|
||||
{ "SineG", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.59,0.83,0.74,0.5,0.91,1.36,0.93,0.87,0.6,0.38,0.78,0.53,0.42,0.14,0.01,-0.45,-0.71,-0.99,-1,-1.36,-1.22,-1.07,-1.17,-0.56,-0.95,-1.11,-0.16,0.18,-0.28,0.64,-0.5,0.24,0.45,0.67,0.72,1.15,1.52,1.28,1.38,1.03,-0.47,0.96,0.65,0.28,0.3,0.17,-0.07,-0.67,-0.51,-1.33,-0.33,-1.34,-0.78,-1.21,-0.68,-0.43,-0.56,-0.87,-0.93,-0.4,0.52,0.1,1.18,1.18,1.35} },
|
||||
{ "ChirpG", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1.3,0.3,-0.48,-1.1,-1.14,-0.03,1.11,0.96,0.63,-0.21,-0.97,-0.73,-0.65,-0.06,0.51,1.08,0.99,0.72,0.12,-0.35,-1.12,-1.21,-1.02,-0.87,0.12,0.13,0.24,1.26,1.44,0.58,0.95,-0.82,-0.68,-0.98,-1.08,-1.17,-0.67,-0.06,0.06,0.6,0.69,-0.41,1.33,1.24,0.98,1.01,0.81,0.45,-0.3,-0.28,-1.22,-0.31,-1.35,-0.77,-1.13,-0.5,-0.13,-0.13,-0.32,-0.29,0.3,1.22,0.75,1.73,1.59,1.58} },
|
||||
{ "Complex", new double[] { 175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.44,176.27,176.04,176.99,175.49,175.68,174.34,176.4,174.05,174.4,174.2,176.16,175,177.72,174.33,176.96,174.62,174.76,170.9,171.12,171.05,170.01,169.24,172.64,171.96,175.72,174.16,175.81,177.3,178.38,176.75,177.19,175.55,178.49,176.52,178.45,178.04,178.25,177.8,176.97,172.94,174.92,173.98,172.29,171.19,172.54,172.11,175.32,175.63,176.65,173.8,176.04,172.74,175.24,171.84,171.54,172.17,171.85,172.38,170.78,173.49,173.69,171.71,174.38,173.99,174.83} },
|
||||
{ "Market", new double[] { 68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,67.75,67.75,72.75,74.75,72.25,71.25,71.75,72.75,77.75,76,76,76,74.75,75.5,74.75,73.75,74,74.75,72.25,72.5,72.25,74.5,74.75,75.75,75.75,75.75,74.25,73.75,74.75,72,71.75,72.5,72.25,71,72,71.75,71.75,73.25,72.5,73.75,74,76.75,75.75,75,75.75,74.5,74.25,73.5,71.75,70.5,69,70.5,70,68.75,67.25,68.5,70.75,70,70.5,68.25,68.25,68.25,63.75,64.25} }
|
||||
|
||||
};
|
||||
|
||||
#!csharp
|
||||
|
||||
String Name = "AFIRMA";
|
||||
int taps = 6;
|
||||
int periods = 6;
|
||||
Afirma.WindowType window = Afirma.WindowType.BlackmanHarris;
|
||||
|
||||
Func<int, int, Afirma.WindowType, AbstractBase> Indicator = (taps, periods, windows) => new Afirma(taps: taps, periods: periods, window: window);
|
||||
|
||||
foreach (var item in Data) {
|
||||
string Signal = item.Key;
|
||||
double[] Input = item.Value;
|
||||
TSeries Output = new();
|
||||
var ma = Indicator(taps, periods, window);
|
||||
foreach (var value in Input) { Output.Add(ma.Calc(value)); }
|
||||
Plot plt = new();
|
||||
var p1a = plt.Add.Signal(Input[24..]); p1a.Color = ScottPlot.Colors.Red; p1a.LineWidth = 2;
|
||||
var p1b = plt.Add.Signal(Output.v.ToArray()[24..]); p1b.Color = ScottPlot.Colors.Blue; p1b.LineWidth = 4;
|
||||
plt.Title($"{Signal} - {Name}({taps}, {periods}, {window.ToString()})");
|
||||
plt.Display();
|
||||
plt.SaveSvg($"img/{Name}{taps}_{Signal}.svg", 450, 300);
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# AFIRMA: Charts
|
||||
|
||||
               
|
||||
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_97">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_97)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 197.075L58.2771 197.075L63.3304 119.246L68.3837 197.075L73.437 119.246L78.4902 197.075L83.5435 158.16L88.5968 185.4L93.6501 118.273L98.7034 210.695L103.757 94.9243L108.81 231.125L113.863 76.4399L118.917 246.69L123.97 64.7656L129.023 254.473L134.076 60.8741L139.13 254.473L144.183 64.7656L149.236 247.663L154.29 75.4671L159.343 233.07L164.396 92.9785L169.45 212.64L174.503 115.354L179.556 187.346L184.609 141.622L189.663 161.079L194.716 168.862L199.769 133.839L204.823 196.102L209.876 108.544L214.929 219.45L219.982 87.1414L225.036 237.935L230.089 71.5756L235.142 250.582L240.196 62.8199L245.249 255.446L250.302 61.847L255.355 252.528L260.409 67.6842L265.462 241.826L270.515 82.2771L275.569 225.288L280.622 101.734L285.675 202.912L290.729 126.056L295.782 176.645L300.835 153.296L305.888 149.404L310.942 180.536L315.995 123.137L321.048 205.83L326.102 98.8157L331.155 227.233L336.208 79.3585L341.261 243.772L346.315 66.7113L351.368 253.5L356.421 60.8741L361.475 255.446L366.528 62.8199L371.581 249.609L376.634 72.5485L381.688 235.989L386.741 89.0871L391.794 216.532L396.848 111.463L401.901 192.21L406.954 136.757L412.008 165.943L417.061 163.997"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="197.07455" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="119.24576" rx="0.40212631" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="197.07455" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="119.24576" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="197.07455" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="185.40024" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="118.27289" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="210.6946" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="94.924255" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="108.81" cy="231.12466" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="76.439911" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="246.69043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="64.765594" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="247.66328" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="75.467056" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="92.978531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="212.64032" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="115.35431" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="187.34595" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="141.62154" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="161.07874" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="168.86162" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="133.83865" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="196.1017" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="108.5443" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="219.45035" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="237.93468" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="71.575607" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="252.52759" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="67.684174" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="241.82613" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="82.277069" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="225.28751" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="101.73427" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="202.91171" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="126.05577" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="176.6445" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="153.29585" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="149.40442" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="180.53593" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="123.13719" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="205.83029" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="98.815689" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="227.23322" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="79.35849" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="243.77184" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="66.711304" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="249.60901" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="72.548477" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="235.98895" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="89.087097" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="216.53177" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="111.46288" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="192.21027" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="136.75723" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="165.94304" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="163.99731" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<clipPath id="cl_98">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_98)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 158.16L58.2771 158.16L63.3304 158.16L68.3837 158.16L73.437 158.16L78.4902 158.16L83.5435 158.161L88.5968 160.216L93.6501 174.943L98.7034 170.289L103.757 155.28L108.81 161.915L113.863 155.122L118.917 160.969L123.97 155.581L129.023 160.126L134.076 156.756L139.13 159.003L144.183 157.879L149.236 157.879L154.29 159.054L159.343 157.139L164.396 160.229L169.45 155.964L174.503 161.021L179.556 155.07L184.609 161.48L189.663 154.073L194.716 161.709L199.769 154.176L204.823 162.093L209.876 154.228L214.929 162.196L219.982 154.892L225.036 161.634L230.089 155.403L235.142 160.74L240.196 156.245L245.249 159.948L250.302 157.42L255.355 158.825L260.409 158.544L265.462 157.65L270.515 159.232L275.569 156.091L280.622 160.407L285.675 155.683L290.729 161.301L295.782 154.789L300.835 161.812L305.888 154.176L310.942 162.093L315.995 154.228L321.048 162.144L326.102 154.56L331.155 161.863L336.208 154.738L341.261 160.866L346.315 155.197L351.368 160.024L356.421 156.423L361.475 159.284L366.528 157.598L371.581 158.16L376.634 158.722L381.688 157.037L386.741 159.846L391.794 155.862L396.848 160.637L401.901 155.019L406.954 161.531L412.008 154.457L417.061 161.761"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="158.16113" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="160.21609" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="174.94324" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="170.28909" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="155.28046" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="161.91498" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="155.12158" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="160.96921" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="155.58069" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="160.12646" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="156.75563" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="159.00287" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="157.87924" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="157.87927" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="159.05426" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="157.13928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="160.22922" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="155.96432" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="161.02057" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="155.07021" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="161.47961" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="154.07343" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="161.70915" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="154.17612" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="162.0928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="154.22754" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="162.19553" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="154.89206" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="161.63376" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="155.40251" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="160.73969" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="156.24524" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="159.94833" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="157.4202" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="158.82474" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="158.54379" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="157.6497" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="159.23242" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="156.09113" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="160.40738" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="155.68338" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="161.30147" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="154.78932" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="161.81189" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="154.17615" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="162.0928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="154.22751" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="162.14418" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="154.55978" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="161.86325" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="154.73795" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="160.86644" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="155.19702" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="160.02373" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="156.42334" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="159.28375" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="157.59836" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="158.16016" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="158.72195" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="157.03653" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="159.84555" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="155.86157" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="160.63692" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="155.01884" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="161.53098" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="154.45703" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="161.76053" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-126.54688, -116.28906, -111.875, -105.40625, -100.99219, -89.742188, -81.421875, -76.351563, -65.90625, -50.59375, -39.34375, -33.4375, -24.234375, -19.898438, -15.484375, -6.28125, -1.9453125, 2.46875, 12.726563, 17.273438, 25.882813, 33.5625, 42.507813, 57.164063, 65.773438, 75.453125, 87.710938, 96.320313, 102.6875, 109.05469, 113.60156, 120.64063, " y="-6.890625, ">
|
||||
B - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_85">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_85)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 158.16L58.2771 158.16L63.3304 157.187L68.3837 158.16L73.437 157.187L78.4902 158.16L83.5435 157.187L88.5968 67.6842L93.6501 131.893L98.7034 215.559L103.757 255.446L108.81 227.233L113.863 153.296L118.917 85.1956L123.97 60.8741L129.023 92.9785L134.076 158.16L139.13 223.342L144.183 254.473L149.236 240.853L154.29 191.237L159.343 128.001L164.396 79.3585L169.45 60.8741L174.503 78.3856L179.556 124.11L184.609 179.563L189.663 227.233L194.716 253.5L199.769 250.582L204.823 222.369L209.876 177.617L214.929 128.001L219.982 88.1142L225.036 64.7656L230.089 62.8199L235.142 82.2771L240.196 116.327L245.249 159.133L250.302 199.993L255.355 233.07L260.409 251.555L265.462 254.473L270.515 240.853L275.569 214.586L280.622 180.536L285.675 142.594L290.729 108.544L295.782 81.3042L300.835 65.7384L305.888 60.8741L310.942 68.657L315.995 87.1414L321.048 112.436L326.102 143.567L331.155 174.699L336.208 203.885L341.261 228.206L346.315 245.718L351.368 254.473L356.421 254.473L361.475 245.718L366.528 230.152L371.581 208.749L376.634 183.455L381.688 157.187L386.741 130.92L391.794 106.599L396.848 87.1414L401.901 72.5485L406.954 63.7927L412.008 60.8741L417.061 63.7927"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="157.18729" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="67.684174" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="131.89293" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="215.5589" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="255.44617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="227.23322" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="153.29585" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="85.195648" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="60.874146" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="92.978531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="158.16016" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="223.34178" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="240.85326" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="191.2374" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="128.0015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="79.35849" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="78.385635" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="124.11006" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="179.56308" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="227.23322" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="222.36893" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="177.61736" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="128.0015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="88.114227" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="230.089" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="82.277069" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="116.32718" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="159.13303" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="199.99313" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="251.55472" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="240.85326" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="214.58604" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="180.53593" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="142.59439" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="108.5443" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="81.304214" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="65.738449" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="68.657028" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="112.43573" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="143.56726" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="174.69878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="203.88458" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="228.20609" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="245.71756" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="245.71756" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="230.15179" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="208.74887" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="183.45453" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="157.18729" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="130.92007" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="106.59857" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="72.548477" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="63.792725" rx="0.40213013" ry="0.4021244"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="63.792725" rx="0.40213013" ry="0.4021244"/>
|
||||
</g>
|
||||
<clipPath id="cl_86">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_86)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 157.674L58.2771 157.674L63.3304 157.674L68.3837 157.674L73.437 157.674L78.4902 157.674L83.5435 157.674L88.5968 157.671L93.6501 152.892L98.7034 115.884L103.757 108.944L108.81 172.442L113.863 229.585L118.917 235.319L123.97 188.154L129.023 121.87L134.076 78.3357L139.13 81.6613L144.183 127.319L149.236 188.95L154.29 234.739L159.343 243.391L164.396 213.42L169.45 159.671L174.503 106.047L179.556 73.6163L184.609 73.0269L189.663 103.255L194.716 151.94L199.769 201.854L204.823 237.69L209.876 249.159L214.929 234.262L219.982 198.861L225.036 153.067L230.089 109.448L235.142 78.4474L240.196 66.0575L245.249 74.4531L250.302 100.538L255.355 138.09L260.409 179.048L265.462 215.348L270.515 240.717L275.569 251.315L280.622 246.119L285.675 226.639L290.729 196.943L295.782 161.565L300.835 126.136L305.888 95.9023L310.942 74.7053L315.995 64.5418L321.048 66.0009L326.102 78.8259L331.155 100.458L336.208 128.31L341.261 159.03L346.315 188.931L351.368 215.428L356.421 236.138L361.475 249.169L366.528 253.547L371.581 249.272L376.634 237.265L381.688 218.936L386.741 195.844L391.794 170.269L396.848 144.157L401.901 119.12L406.954 97.3847L412.008 80.4112L417.061 68.7883"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="157.67374" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="157.67374" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="157.67145" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="152.89233" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="115.88365" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="108.9442" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="172.44171" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="229.58455" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="235.31851" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="188.15427" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="121.87022" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="78.335739" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="81.661301" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="127.31938" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="188.94975" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="234.73878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="243.39133" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="213.42036" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="159.67075" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="106.04749" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="73.616333" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="73.026917" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="103.25529" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="151.93964" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="201.854" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="237.69034" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="249.15872" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="234.26196" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="198.86075" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="153.06671" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="109.44757" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="78.447433" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="66.057541" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="74.453064" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="100.53754" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="138.09045" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="179.04837" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="215.34785" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="240.71683" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="251.31531" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="246.11905" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="226.63858" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="196.9433" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="161.56514" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="126.13554" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="95.902267" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="74.705292" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="64.541779" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="66.000946" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="78.825851" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="100.45773" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="128.31035" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="159.03012" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="188.93132" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="215.4276" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="236.1382" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="249.16885" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="253.54672" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="249.27179" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="237.26544" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="218.93559" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="195.84427" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="170.26941" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="144.15669" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="119.11963" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="97.38472" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="80.411194" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="68.78833" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-141.64453, -131.66016, -122.02734, -117.48047, -111.11328, -101.19141, -96.777344, -90.308594, -85.894531, -74.644531, -66.324219, -61.253906, -50.808594, -35.496094, -24.246094, -18.339844, -9.1367188, -4.8007813, -0.38671875, 8.8164063, 13.152344, 17.566406, 27.824219, 32.371094, 40.980469, 48.660156, 57.605469, 72.261719, 80.871094, 90.550781, 102.80859, 111.41797, 117.78516, 124.15234, 128.69922, 135.73828, " y="-6.890625, ">
|
||||
Chirp - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,348 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 264.922L435 264.922M40.3379 233.336L435 233.336M40.3379 201.749L435 201.749M40.3379 170.163L435 170.163M40.3379 138.577L435 138.577M40.3379 106.99L435 106.99M40.3379 75.4039L435 75.4039"/>
|
||||
<clipPath id="cl_b5">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_b5)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 170.163L58.2771 170.163L63.3304 169.531L68.3837 170.163L73.437 169.531L78.4902 170.163L83.5435 169.531L88.5968 88.0384L93.6501 151.211L98.7034 200.486L103.757 239.653L108.81 242.18L113.863 172.058L118.917 100.041L123.97 109.517L129.023 130.364L134.076 183.429L139.13 231.441L144.183 216.279L149.236 211.225L154.29 173.953L159.343 137.945L164.396 101.936L169.45 107.622L174.503 124.679L179.556 162.582L184.609 192.273L189.663 240.916L194.716 246.602L199.769 234.599L204.823 225.123L209.876 162.582L214.929 161.951L219.982 155.002L225.036 90.5653L230.089 79.1942L235.142 133.523L240.196 110.149L245.249 221.965L250.302 213.12L255.355 232.072L260.409 238.39L265.462 244.075L270.515 212.489L275.569 173.953L280.622 166.373L285.675 132.259L290.729 126.574L295.782 196.064L300.835 86.1432L305.888 91.8288L310.942 108.254L315.995 106.359L321.048 118.993L326.102 141.735L331.155 189.115L336.208 187.851L341.261 247.234L346.315 189.747L351.368 255.446L356.421 218.806L361.475 241.548L366.528 201.749L371.581 178.375L376.634 178.375L381.688 190.378L386.741 188.483L391.794 151.211L396.848 93.0922L401.901 122.783L406.954 60.8741L412.008 69.7183L417.061 70.3501"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="170.16296" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="169.53125" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="170.16296" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="169.53125" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="170.16296" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="169.53125" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="88.038422" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="151.21115" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="200.48589" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="239.65298" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="242.17989" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="172.05817" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="100.04124" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="109.51715" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="130.36415" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="183.42924" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="231.44052" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="216.27907" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="211.22525" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="173.95334" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="137.94489" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="101.93643" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="107.62198" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="124.6786" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="162.58224" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="192.27344" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="240.91643" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="246.60197" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="234.59915" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="225.12325" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="162.58224" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="161.95053" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="155.00153" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="90.565338" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="230.089" cy="79.194244" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="133.5228" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="110.14888" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="221.96461" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="213.12044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="232.07225" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="238.38953" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="244.07507" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="212.48871" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="173.95334" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="166.37262" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="132.25934" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="126.57379" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="196.0638" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="86.14325" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="91.828796" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="108.25369" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="106.35852" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="118.99306" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="141.73524" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="189.11479" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="187.85135" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="247.2337" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="189.74652" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="218.80597" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="241.54816" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="201.74934" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="178.37543" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="178.37543" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="190.37825" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="188.48306" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="151.21115" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="93.092239" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="122.78343" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="69.718338" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="70.350067" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<clipPath id="cl_b6">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_b6)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 169.847L58.2771 169.847L63.3304 169.847L68.3837 169.847L73.437 169.847L78.4902 169.847L83.5435 169.847L88.5968 169.845L93.6501 165.507L98.7034 132.159L103.757 126.539L108.81 174.582L113.863 217.595L118.917 235.136L123.97 203.178L129.023 140.258L134.076 109.692L139.13 122.248L144.183 158.332L149.236 203.827L154.29 221.052L159.343 212.581L164.396 190.952L169.45 156.016L174.503 122.146L179.556 107.586L184.609 117.855L189.663 144.299L194.716 177.995L199.769 215.325L204.823 240.552L209.876 239.796L214.929 227.189L219.982 194.32L225.036 165.204L230.089 155.104L235.142 122.551L240.196 91.1579L245.249 105.728L250.302 124.875L255.355 166.824L260.409 212.634L265.462 223.395L270.515 234.529L275.569 239.227L280.622 225.944L285.675 194.489L290.729 170.397L295.782 149.419L300.835 134.891L305.888 155.809L310.942 137.731L315.995 95.6635L321.048 99.6436L326.102 107.106L331.155 113.979L336.208 132.201L341.261 164.157L346.315 189.116L351.368 214.571L356.421 218.823L361.475 223.697L366.528 234.856L371.581 230.008L376.634 219.212L381.688 192.166L386.741 180.247L391.794 184.276L396.848 186.824L401.901 166.875L406.954 125.69L412.008 107.739L417.061 90.7282"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="169.84711" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="169.84711" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="169.84711" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="169.84711" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="169.84711" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="169.84711" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="169.84503" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="165.5072" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="132.1591" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="126.53885" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="174.58157" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="217.59474" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="235.1358" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="203.17751" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="140.2581" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="109.69157" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="122.24803" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="158.33212" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="203.82742" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="221.05222" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="212.58116" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="190.95235" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="156.01617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="122.14618" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="107.58636" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="117.85516" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="144.29944" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="177.9953" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="215.32462" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="240.55217" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="239.79625" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="227.18933" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="194.32043" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="165.20389" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="155.10428" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="122.55104" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="91.157898" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="105.72844" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="124.87497" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="166.82397" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="212.634" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="223.39517" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="234.52899" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="239.22707" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="225.94379" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="194.48907" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="170.3974" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="149.41888" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="134.89099" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="155.80939" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="137.73105" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="95.663483" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="99.643585" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="107.10616" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="113.97903" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="132.20097" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="164.15714" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="189.11557" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="214.57071" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="218.82318" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="223.69749" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="234.85556" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="230.00784" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="219.21173" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="192.16608" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="180.24658" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="184.27631" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="186.82428" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="166.87527" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="125.6902" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="107.73862" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="90.728195" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 264.922L36.3379 264.922"/>
|
||||
<text transform="translate(31.3379 264.922)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-1.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 233.336L36.3379 233.336"/>
|
||||
<text transform="translate(31.3379 233.336)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 201.749L36.3379 201.749"/>
|
||||
<text transform="translate(31.3379 201.749)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 170.163L36.3379 170.163"/>
|
||||
<text transform="translate(31.3379 170.163)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.577L36.3379 138.577"/>
|
||||
<text transform="translate(31.3379 138.577)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 106.99L36.3379 106.99"/>
|
||||
<text transform="translate(31.3379 106.99)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 75.4039L36.3379 75.4039"/>
|
||||
<text transform="translate(31.3379 75.4039)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
1.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 258.605L38.3379 258.605"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 252.288L38.3379 252.288"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.97L38.3379 245.97"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 239.653L38.3379 239.653"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 227.018L38.3379 227.018"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 220.701L38.3379 220.701"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 214.384L38.3379 214.384"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 208.067L38.3379 208.067"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 195.432L38.3379 195.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 189.115L38.3379 189.115"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 182.798L38.3379 182.798"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 176.48L38.3379 176.48"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 163.846L38.3379 163.846"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 157.528L38.3379 157.528"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 151.211L38.3379 151.211"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 144.894L38.3379 144.894"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 132.259L38.3379 132.259"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 125.942L38.3379 125.942"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.625L38.3379 119.625"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 113.308L38.3379 113.308"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 100.673L38.3379 100.673"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 94.3557L38.3379 94.3557"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 88.0384L38.3379 88.0384"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 81.7211L38.3379 81.7211"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 69.0866L38.3379 69.0866"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 62.7693L38.3379 62.7693"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 56.4521L38.3379 56.4521"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 50.1348L38.3379 50.1348"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-147.33203, -137.34766, -127.71484, -123.16797, -116.80078, -106.87891, -95.503906, -91.089844, -84.621094, -80.207031, -68.957031, -60.636719, -55.566406, -45.121094, -29.808594, -18.558594, -12.652344, -3.4492188, 0.88671875, 5.3007813, 14.503906, 18.839844, 23.253906, 33.511719, 38.058594, 46.667969, 54.347656, 63.292969, 77.949219, 86.558594, 96.238281, 108.49609, 117.10547, 123.47266, 129.83984, 134.38672, 141.42578, " y="-6.890625, ">
|
||||
ChirpG - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 32 KiB |
@@ -1,333 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M57.3878 270.039L57.3878 46.2813M82.7139 270.039L82.7139 46.2813M108.04 270.039L108.04 46.2813M133.366 270.039L133.366 46.2813M158.692 270.039L158.692 46.2813M184.018 270.039L184.018 46.2813M209.344 270.039L209.344 46.2813M234.671 270.039L234.671 46.2813M259.997 270.039L259.997 46.2813M285.323 270.039L285.323 46.2813M310.649 270.039L310.649 46.2813M335.975 270.039L335.975 46.2813M361.301 270.039L361.301 46.2813M386.627 270.039L386.627 46.2813M411.953 270.039L411.953 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M39.4063 239.46L435 239.46M39.4063 197.39L435 197.39M39.4063 155.32L435 155.32M39.4063 113.251L435 113.251M39.4063 71.1812L435 71.1812"/>
|
||||
<clipPath id="cl_bb">
|
||||
<rect x="39.40625" y="46.28125" width="395.59375" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_bb)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M57.3878 132.182L57.3878 132.182L62.453 121.665L67.5182 132.182L72.5835 121.665L77.6487 132.182L82.7139 121.665L87.7791 125.03L92.8443 107.571L97.9095 112.409L102.975 92.4264L108.04 123.979L113.105 119.982L118.17 148.169L123.236 104.837L128.301 154.269L133.366 146.907L138.431 151.113L143.497 109.885L148.562 134.286L153.627 77.071L158.692 148.379L163.757 93.0574L168.823 142.279L173.888 139.334L178.953 220.528L184.018 215.901L189.084 217.373L194.149 239.249L199.214 255.446L204.279 183.928L209.344 198.231L214.41 119.141L219.475 151.955L224.54 117.247L229.605 85.9056L234.671 63.188L239.736 97.4747L244.801 88.2194L249.866 122.716L254.931 60.8741L259.997 102.313L265.062 61.7155L270.127 70.3398L275.192 65.9225L280.258 75.3882L285.323 92.8471L290.388 177.617L295.453 135.968L300.518 155.741L305.584 191.29L310.649 214.428L315.714 186.031L320.779 195.076L325.844 127.555L330.91 121.034L335.975 99.5782L341.04 159.527L346.105 112.409L351.171 181.824L356.236 129.237L361.301 200.756L366.366 207.066L371.431 193.814L376.497 200.545L381.562 189.397L386.627 223.053L391.692 166.048L396.758 161.841L401.823 203.49L406.888 147.327L411.953 155.531L417.018 137.862"/>
|
||||
<ellipse fill="red" cx="57.387787" cy="132.18216" rx="0.40259933" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="62.453003" cy="121.66476" rx="0.40259933" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="67.518227" cy="132.18216" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="72.58345" cy="121.66476" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="77.648666" cy="132.18216" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="82.71389" cy="121.66476" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="87.779114" cy="125.03033" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="92.84433" cy="107.57143" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="97.909546" cy="112.40944" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="102.97478" cy="92.426376" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="108.03999" cy="123.97859" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="113.10522" cy="119.98198" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="118.17043" cy="148.16861" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="123.23566" cy="104.83691" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="128.30087" cy="154.26871" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="133.36609" cy="146.90652" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="138.43132" cy="151.11349" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="143.49654" cy="109.88527" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="148.56177" cy="134.28564" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="153.62698" cy="77.070953" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="158.6922" cy="148.37897" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="163.75742" cy="93.057419" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="168.82265" cy="142.27887" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="173.88786" cy="139.334" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="178.95308" cy="220.52838" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="184.01831" cy="215.90071" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="189.08353" cy="217.37315" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="194.14874" cy="239.24936" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="199.21397" cy="255.44617" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="204.27919" cy="183.9278" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="209.34441" cy="198.23148" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="214.40964" cy="119.14058" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="219.47485" cy="151.9549" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="224.54007" cy="117.24745" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="229.6053" cy="85.905579" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="234.67052" cy="63.187973" rx="0.40260315" ry="0.40259933"/>
|
||||
<ellipse fill="red" cx="239.73573" cy="97.474716" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="244.80095" cy="88.219406" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="249.86618" cy="122.71649" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="254.9314" cy="60.874146" rx="0.40260315" ry="0.40259933"/>
|
||||
<ellipse fill="red" cx="259.99661" cy="102.31273" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="265.06183" cy="61.715546" rx="0.40258789" ry="0.40259933"/>
|
||||
<ellipse fill="red" cx="270.12708" cy="70.339813" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="275.19226" cy="65.922501" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="280.25751" cy="75.388168" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="285.32272" cy="92.847061" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="290.38794" cy="177.61736" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="295.45316" cy="135.96843" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="300.51837" cy="155.74115" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="305.58362" cy="191.28998" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="310.64883" cy="214.42828" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="315.71405" cy="186.03128" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="320.77927" cy="195.07625" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="325.84448" cy="127.5545" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="330.9097" cy="121.03371" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="335.97495" cy="99.578201" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="341.04016" cy="159.52742" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="346.10538" cy="112.40944" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="351.17059" cy="181.82431" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="356.23581" cy="129.23729" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="361.30103" cy="200.75565" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="366.36627" cy="207.0661" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="371.43149" cy="193.81416" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="376.4967" cy="200.5453" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="381.56192" cy="189.39685" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="386.62714" cy="223.05255" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="391.69235" cy="166.04822" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="396.75757" cy="161.84125" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="401.82281" cy="203.49017" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="406.88803" cy="147.32722" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="411.95325" cy="155.53081" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="red" cx="417.01846" cy="137.86156" rx="0.40258789" ry="0.40260315"/>
|
||||
</g>
|
||||
<clipPath id="cl_bc">
|
||||
<rect x="39.40625" y="46.28125" width="395.59375" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_bc)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M57.3878 126.923L57.3878 126.923L62.453 126.923L67.5182 126.923L72.5835 126.923L77.6487 126.923L82.7139 126.923L87.7791 126.923L92.8443 126.545L97.9095 122.98L102.975 116.378L108.04 109.858L113.105 103.83L118.17 109.048L123.236 121.802L128.301 131.996L133.366 127.626L138.431 131.454L143.497 148.197L148.562 147.219L153.627 131.566L158.692 121.242L163.757 108.158L168.823 112.826L173.888 119.552L178.953 120.437L184.018 142.498L189.084 179.841L194.149 214.001L199.214 218.036L204.279 229.088L209.344 242.411L214.41 219.584L219.475 190.68L224.54 159.666L229.605 137.893L234.671 131.211L239.736 102.21L244.801 78.0169L249.866 81.0447L254.931 92.8572L259.997 102.688L265.062 92.1615L270.127 82.7159L275.192 80.2809L280.258 67.9395L285.323 68.1771L290.388 71.8138L295.453 88.0977L300.518 132.108L305.584 153.357L310.649 149.934L315.714 173.694L320.779 199.478L325.844 199.482L330.91 188.485L335.975 160.493L341.04 126.731L346.105 113.82L351.171 128.198L356.236 136.468L361.301 146.828L366.366 155.643L371.431 168.108L376.497 199.431L381.562 200.46L386.627 197.292L391.692 196.393L396.758 203.8L401.823 192.55L406.888 169.158L411.953 179.921L417.018 173.64"/>
|
||||
<ellipse fill="blue" cx="57.387787" cy="126.92346" rx="0.40259933" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="62.453003" cy="126.92346" rx="0.40259933" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="67.518227" cy="126.92346" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="72.58345" cy="126.92346" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="77.648666" cy="126.92346" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="82.71389" cy="126.92346" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="87.779114" cy="126.92328" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="92.84433" cy="126.5452" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="97.909546" cy="122.98044" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="102.97478" cy="116.37848" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="108.03999" cy="109.85771" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="113.10522" cy="103.83049" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="118.17043" cy="109.04819" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="123.23566" cy="121.80177" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="128.30087" cy="131.99629" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="133.36609" cy="127.62581" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="138.43132" cy="131.45374" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="143.49654" cy="148.19687" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="148.56177" cy="147.21906" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="153.62698" cy="131.56564" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="158.6922" cy="121.24202" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="163.75742" cy="108.15773" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="168.82265" cy="112.82567" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="173.88786" cy="119.55196" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="178.95308" cy="120.4373" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="184.01831" cy="142.49797" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="189.08353" cy="179.84102" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="194.14874" cy="214.00066" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="199.21397" cy="218.03642" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="204.27919" cy="229.08798" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="209.34441" cy="242.41077" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="214.40964" cy="219.58435" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="219.47485" cy="190.67973" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="224.54007" cy="159.66553" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="229.6053" cy="137.89291" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="234.67052" cy="131.21097" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="239.73573" cy="102.21039" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="244.80095" cy="78.016891" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="249.86618" cy="81.044693" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="254.9314" cy="92.857193" rx="0.40260315" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="259.99661" cy="102.68811" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="265.06183" cy="92.161499" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="270.12708" cy="82.715912" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="275.19226" cy="80.280853" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="280.25751" cy="67.939529" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="285.32272" cy="68.177109" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="290.38794" cy="71.813751" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="295.45316" cy="88.097672" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="300.51837" cy="132.10773" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="305.58362" cy="153.35724" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="310.64883" cy="149.93431" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="315.71405" cy="173.69382" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="320.77927" cy="199.47836" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="325.84448" cy="199.48213" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="330.9097" cy="188.48468" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="335.97495" cy="160.49268" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="341.04016" cy="126.7307" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="346.10538" cy="113.82042" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="351.17059" cy="128.19807" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="356.23581" cy="136.46805" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="361.30103" cy="146.82805" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="366.36627" cy="155.64336" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="371.43149" cy="168.108" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="376.4967" cy="199.43097" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="381.56192" cy="200.46028" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="386.62714" cy="197.29163" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="391.69235" cy="196.39334" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="396.75757" cy="203.80025" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="401.82281" cy="192.55009" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="406.88803" cy="169.15778" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="411.95325" cy="179.92068" rx="0.40258789" ry="0.40260315"/>
|
||||
<ellipse fill="blue" cx="417.01846" cy="173.64026" rx="0.40258789" ry="0.40260315"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M57.3878 270.039L57.3878 274.039"/>
|
||||
<text transform="translate(57.3878 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M82.7139 270.039L82.7139 274.039"/>
|
||||
<text transform="translate(82.7139 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.04 270.039L108.04 274.039"/>
|
||||
<text transform="translate(108.04 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M133.366 270.039L133.366 274.039"/>
|
||||
<text transform="translate(133.366 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M158.692 270.039L158.692 274.039"/>
|
||||
<text transform="translate(158.692 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.018 270.039L184.018 274.039"/>
|
||||
<text transform="translate(184.018 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.344 270.039L209.344 274.039"/>
|
||||
<text transform="translate(209.344 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M234.671 270.039L234.671 274.039"/>
|
||||
<text transform="translate(234.671 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M259.997 270.039L259.997 274.039"/>
|
||||
<text transform="translate(259.997 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.323 270.039L285.323 274.039"/>
|
||||
<text transform="translate(285.323 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.649 270.039L310.649 274.039"/>
|
||||
<text transform="translate(310.649 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M335.975 270.039L335.975 274.039"/>
|
||||
<text transform="translate(335.975 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.301 270.039L361.301 274.039"/>
|
||||
<text transform="translate(361.301 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.627 270.039L386.627 274.039"/>
|
||||
<text transform="translate(386.627 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.953 270.039L411.953 274.039"/>
|
||||
<text transform="translate(411.953 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M42.1921 270.039L42.1921 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M47.2573 270.039L47.2573 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M52.3226 270.039L52.3226 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M62.453 270.039L62.453 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M67.5182 270.039L67.5182 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M72.5835 270.039L72.5835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M77.6487 270.039L77.6487 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M87.7791 270.039L87.7791 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M92.8443 270.039L92.8443 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M97.9095 270.039L97.9095 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.975 270.039L102.975 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.105 270.039L113.105 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.17 270.039L118.17 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.236 270.039L123.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M128.301 270.039L128.301 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M138.431 270.039L138.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M143.497 270.039L143.497 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M148.562 270.039L148.562 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M153.627 270.039L153.627 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M163.757 270.039L163.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M168.823 270.039L168.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M173.888 270.039L173.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M178.953 270.039L178.953 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.084 270.039L189.084 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.149 270.039L194.149 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.214 270.039L199.214 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.279 270.039L204.279 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.41 270.039L214.41 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.475 270.039L219.475 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M224.54 270.039L224.54 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M229.605 270.039L229.605 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M239.736 270.039L239.736 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M244.801 270.039L244.801 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M249.866 270.039L249.866 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M254.931 270.039L254.931 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.062 270.039L265.062 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.127 270.039L270.127 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.192 270.039L275.192 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.258 270.039L280.258 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.388 270.039L290.388 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.453 270.039L295.453 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.518 270.039L300.518 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.584 270.039L305.584 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.714 270.039L315.714 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M320.779 270.039L320.779 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M325.844 270.039L325.844 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M330.91 270.039L330.91 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.04 270.039L341.04 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.105 270.039L346.105 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.171 270.039L351.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.236 270.039L356.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.366 270.039L366.366 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.431 270.039L371.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.497 270.039L376.497 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.562 270.039L381.562 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.692 270.039L391.692 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.758 270.039L396.758 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.823 270.039L401.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.888 270.039L406.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.018 270.039L417.018 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.084 270.039L422.084 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.149 270.039L427.149 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.214 270.039L432.214 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 239.46L35.4063 239.46"/>
|
||||
<text transform="translate(30.4063 239.46)" font-size="12" font-family="Segoe UI" x="-19.40625, -12.9375, -6.46875, " y="3.046875, ">
|
||||
170
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 197.39L35.4063 197.39"/>
|
||||
<text transform="translate(30.4063 197.39)" font-size="12" font-family="Segoe UI" x="-19.40625, -12.9375, -6.46875, " y="3.046875, ">
|
||||
172
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 155.32L35.4063 155.32"/>
|
||||
<text transform="translate(30.4063 155.32)" font-size="12" font-family="Segoe UI" x="-19.40625, -12.9375, -6.46875, " y="3.046875, ">
|
||||
174
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 113.251L35.4063 113.251"/>
|
||||
<text transform="translate(30.4063 113.251)" font-size="12" font-family="Segoe UI" x="-19.40625, -12.9375, -6.46875, " y="3.046875, ">
|
||||
176
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 71.1812L35.4063 71.1812"/>
|
||||
<text transform="translate(30.4063 71.1812)" font-size="12" font-family="Segoe UI" x="-19.40625, -12.9375, -6.46875, " y="3.046875, ">
|
||||
178
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 264.701L37.4063 264.701"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 256.288L37.4063 256.288"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 247.874L37.4063 247.874"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 231.046L37.4063 231.046"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 222.632L37.4063 222.632"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 214.218L37.4063 214.218"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 205.804L37.4063 205.804"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 188.976L37.4063 188.976"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 180.562L37.4063 180.562"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 172.148L37.4063 172.148"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 163.734L37.4063 163.734"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 146.907L37.4063 146.907"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 138.493L37.4063 138.493"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 130.079L37.4063 130.079"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 121.665L37.4063 121.665"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 104.837L37.4063 104.837"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 96.423L37.4063 96.423"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 88.0091L37.4063 88.0091"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 79.5951L37.4063 79.5951"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 62.7673L37.4063 62.7673"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 54.3534L37.4063 54.3534"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M39.4063 270.039L39.4063 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.203 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-154.60938, -144.625, -134.84375, -120.1875, -110.26563, -105.71875, -97.0625, -88.226563, -83.8125, -77.34375, -72.929688, -61.679688, -53.359375, -48.289063, -37.84375, -22.53125, -11.28125, -5.375, 3.828125, 8.1640625, 12.578125, 21.78125, 26.117188, 30.53125, 40.789063, 45.335938, 53.945313, 61.625, 70.570313, 85.226563, 93.835938, 103.51563, 115.77344, 124.38281, 130.75, 137.11719, 141.66406, 148.70313, " y="-6.890625, ">
|
||||
Complex - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,327 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 235.592L435 235.592M40.3379 185.956L435 185.956M40.3379 136.32L435 136.32M40.3379 86.6847L435 86.6847"/>
|
||||
<clipPath id="cl_91">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_91)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 176.029L58.2771 176.029L63.3304 96.6119L68.3837 176.029L73.437 96.6119L78.4902 176.029L83.5435 96.6119L88.5968 136.32L93.6501 133.342L98.7034 125.401L103.757 146.248L108.81 179.007L113.863 144.262L118.917 100.583L123.97 140.291L129.023 140.291L134.076 157.167L139.13 166.102L144.183 110.51L149.236 116.466L154.29 108.524L159.343 116.466L164.396 109.517L169.45 137.313L174.503 146.248L179.556 159.153L184.609 149.226L189.663 177.022L194.716 159.153L199.769 143.269L204.823 157.167L209.876 104.554L214.929 154.189L219.982 183.971L225.036 106.539L230.089 90.6556L235.142 156.175L240.196 84.6993L245.249 216.73L250.302 161.138L255.355 157.167L260.409 148.233L265.462 154.189L270.515 118.452L275.569 84.6993L280.622 107.532L285.675 92.641L290.729 118.452L295.782 255.446L300.835 98.5973L305.888 112.495L310.942 130.364L315.995 108.524L321.048 102.568L326.102 106.539L331.155 149.226L336.208 117.459L341.261 185.956L346.315 77.7503L351.368 172.058L356.421 114.481L361.475 159.153L366.528 112.495L371.581 97.6046L376.634 123.415L381.688 169.08L386.741 192.905L391.794 159.153L396.848 87.6774L401.901 149.226L406.954 60.8741L412.008 77.7503L417.061 75.7649"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="176.02902" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="96.611862" rx="0.40212631" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="176.02902" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="96.611862" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="176.02902" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="96.611862" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="136.32043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="133.3423" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="125.40059" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="146.24759" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="179.00716" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="144.26215" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="100.58272" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="140.29131" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="140.29131" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="157.16745" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="166.10187" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="110.50987" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="116.46616" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="108.52444" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="116.46616" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="109.51715" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="137.31316" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="146.24759" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="159.15286" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="149.22574" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="177.02173" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="159.15286" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="143.26944" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="157.16745" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="104.55359" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="154.1893" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="183.97073" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="106.53902" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="230.089" cy="90.655579" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="156.17473" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="84.699295" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="216.7303" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="161.13831" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="157.16745" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="148.233" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="154.1893" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="118.45158" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="84.699295" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="107.53172" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="92.641006" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="118.45158" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="98.59729" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="112.4953" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="130.36415" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="108.52444" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="102.56815" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="106.53902" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="149.22574" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="117.45886" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="185.95616" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="77.75029" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="172.05817" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="114.48073" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="159.15286" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="112.4953" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="97.604584" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="123.41516" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="169.08002" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="192.90515" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="159.15286" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="87.677444" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="149.22574" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="77.75029" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="75.764862" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<clipPath id="cl_92">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_92)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 136.32L58.2771 136.32L63.3304 136.32L68.3837 136.32L73.437 136.32L78.4902 136.32L83.5435 136.32L88.5968 136.319L93.6501 134.223L98.7034 120.505L103.757 132.315L108.81 130.631L113.863 137.975L118.917 159.688L123.97 157.594L129.023 126.358L134.076 122.747L139.13 139.086L144.183 149.199L149.236 157.804L154.29 138.148L159.343 116.007L164.396 112.601L169.45 112.548L174.503 114.042L179.556 124.255L184.609 140.993L189.663 151.703L194.716 154.976L199.769 162.703L204.823 165.779L209.876 152.888L214.929 148.278L219.982 132.751L225.036 133.725L230.089 162.363L235.142 142.841L240.196 106.152L245.249 120.482L250.302 123.952L255.355 151.553L260.409 181.746L265.462 161.616L270.515 153.226L275.569 149.793L280.622 134.222L285.675 104.671L290.729 97.1142L295.782 100.248L300.835 113.571L305.888 177.293L310.942 170.514L315.995 114.779L321.048 119.544L326.102 118.185L331.155 106.911L336.208 107.125L341.261 125.995L346.315 134.704L351.368 147.668L356.421 133.217L361.475 127.58L366.528 140.647L371.581 137.391L376.634 132.677L381.688 108.881L386.741 113.713L391.794 146.142L396.848 176.792L401.901 170.991L406.954 128.45L412.008 117.561L417.061 102.69"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="136.32043" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="136.32043" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="136.32043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="136.32043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="136.32043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="136.32043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="136.31944" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="134.22318" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="120.50491" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="132.31487" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="130.63078" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="137.97496" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="159.68759" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="157.59418" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="126.35762" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="122.74744" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="139.08559" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="149.19928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="157.80377" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="138.1478" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="116.00702" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="112.60149" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="112.54832" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="114.04169" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="124.25496" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="140.99309" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="151.70311" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="154.97583" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="162.70316" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="165.77878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="152.88849" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="148.27838" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="132.75095" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="133.72498" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="162.36349" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="142.84119" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="106.15186" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="120.48155" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="123.95216" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="151.55273" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="181.74612" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="161.61624" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="153.22552" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="149.79344" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="134.22205" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="104.67123" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="97.114182" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="100.24811" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="113.5712" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="177.29327" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="170.51401" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="114.77876" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="119.54425" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="118.18452" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="106.91141" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="107.12485" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="125.99496" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="134.70395" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="147.66785" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="133.21706" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="127.58011" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="140.64699" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="137.39133" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="132.67738" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="108.881" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="113.71292" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="146.14215" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="176.79173" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="170.99133" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="128.45041" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="117.5607" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="102.69009" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.592L36.3379 235.592"/>
|
||||
<text transform="translate(31.3379 235.592)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 185.956L36.3379 185.956"/>
|
||||
<text transform="translate(31.3379 185.956)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 136.32L36.3379 136.32"/>
|
||||
<text transform="translate(31.3379 136.32)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 86.6847L36.3379 86.6847"/>
|
||||
<text transform="translate(31.3379 86.6847)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.373L38.3379 265.373"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L38.3379 255.446"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.519L38.3379 245.519"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 225.665L38.3379 225.665"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 215.738L38.3379 215.738"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 205.81L38.3379 205.81"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 195.883L38.3379 195.883"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 176.029L38.3379 176.029"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 166.102L38.3379 166.102"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 156.175L38.3379 156.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 146.248L38.3379 146.248"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 126.393L38.3379 126.393"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 116.466L38.3379 116.466"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 106.539L38.3379 106.539"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 96.6119L38.3379 96.6119"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 76.7576L38.3379 76.7576"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 66.8304L38.3379 66.8304"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 56.9033L38.3379 56.9033"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.9762L38.3379 46.9762"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-143.28906, -131.91406, -123.30469, -113.625, -106.58594, -99.546875, -95.132813, -88.664063, -84.25, -73, -64.679688, -59.609375, -49.164063, -33.851563, -22.601563, -16.695313, -7.4921875, -3.15625, 1.2578125, 10.460938, 14.796875, 19.210938, 29.46875, 34.015625, 42.625, 50.304688, 59.25, 73.90625, 82.515625, 92.195313, 104.45313, 113.0625, 119.42969, 125.79688, 130.34375, 137.38281, " y="-6.890625, ">
|
||||
Gauss - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_9d">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_9d)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 216.532L58.2771 216.532L63.3304 99.7886L68.3837 216.532L73.437 99.7886L78.4902 216.532L83.5435 99.7886L88.5968 158.16L93.6501 144.54L98.7034 232.098L103.757 251.555L108.81 185.4L113.863 93.9514L118.917 61.847L123.97 118.273L129.023 210.695L134.076 255.446L139.13 210.695L144.183 117.3L149.236 61.847L154.29 94.9243L159.343 186.373L164.396 251.555L169.45 231.125L174.503 143.567L179.556 69.6299L184.609 76.4399L189.663 159.133L194.716 240.853L199.769 246.69L204.823 170.807L209.876 84.2228L214.929 64.7656L219.982 131.893L225.036 222.369L230.089 254.473L235.142 197.075L240.196 104.653L245.249 60.8741L250.302 106.599L255.355 199.993L260.409 254.473L265.462 220.423L270.515 128.974L275.569 64.7656L280.622 85.1956L285.675 173.726L290.729 247.663L295.782 238.908L300.835 156.214L305.888 75.4671L310.942 70.6028L315.995 146.486L321.048 233.07L326.102 250.582L331.155 183.455L336.208 92.9785L341.261 61.847L346.315 119.246L351.368 212.64L356.421 255.446L361.475 208.749L366.528 115.354L371.581 61.847L376.634 95.8971L381.688 187.346L386.741 252.528L391.794 230.152L396.848 141.622L401.901 68.657L406.954 77.4128L412.008 161.079L417.061 241.826"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="216.53177" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="99.788559" rx="0.40212631" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="216.53177" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="99.788559" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="216.53177" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="99.788559" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="144.54012" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="232.09752" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="251.55472" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="185.40024" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="93.951385" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="61.847015" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="118.27289" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="210.6946" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="210.6946" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="117.30003" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="94.924255" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="186.37311" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="251.55472" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="231.12466" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="143.56726" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="69.629898" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="76.439911" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="159.13303" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="240.85326" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="246.69043" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="170.80734" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="84.222794" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="131.89293" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="222.36893" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="197.07455" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="104.65285" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="106.59857" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="199.99313" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="220.4232" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="128.97435" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="85.195648" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="173.72592" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="247.66328" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="238.90755" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="156.21445" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="75.467056" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="70.602753" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="146.48584" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="183.45453" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="92.978531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="119.24576" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="212.64032" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="208.74887" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="115.35431" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="95.89711" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="187.34595" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="252.52759" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="230.15179" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="141.62154" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="68.657028" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="77.412766" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="161.07874" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="241.82613" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<clipPath id="cl_9e">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_9e)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 158.16L58.2771 158.16L63.3304 158.16L68.3837 158.16L73.437 158.16L78.4902 158.16L83.5435 158.16L88.5968 158.159L93.6501 155.077L98.7034 134.425L103.757 152.896L108.81 190.064L113.863 233.698L118.917 212.611L123.97 141.477L129.023 85.7206L134.076 96.6465L139.13 163.866L144.183 225.815L149.236 225.764L154.29 163.431L159.343 96.2629L164.396 86.1556L169.45 142.347L174.503 213.046L179.556 233.261L184.609 184.516L189.663 111.59L194.716 81.3195L199.769 121.749L204.823 195.928L209.876 235.436L214.929 203.86L219.982 130.5L225.036 82.6244L230.089 104.144L235.142 175.278L240.196 230.6L245.249 219.187L250.302 151.584L255.355 90.0704L260.409 90.9918L265.462 153.759L270.515 220.492L275.569 229.73L280.622 173.104L285.675 102.788L290.729 83.0594L295.782 132.291L300.835 205.549L305.888 235.001L310.942 193.753L315.995 119.957L321.048 81.3195L326.102 113.381L331.155 186.691L336.208 233.696L341.261 211.306L346.315 140.12L351.368 85.2342L356.421 97.1328L361.475 165.171L366.528 226.633L371.581 224.894L376.634 161.691L381.688 95.3415L386.741 86.5392L391.794 143.268L396.848 213.916L401.901 233.21L406.954 183.211L412.008 110.285L417.061 81.3195"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="158.15869" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="155.07693" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="134.42525" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="152.89648" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="190.0643" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="233.69815" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="212.61139" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="141.47681" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="85.720627" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="96.646484" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="163.86627" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="225.81491" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="225.76353" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="163.43129" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="96.262909" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="86.155624" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="142.34677" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="213.04637" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="233.26094" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="184.51581" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="111.58992" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="81.319473" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="121.74861" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="195.92804" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="235.43585" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="203.86044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="130.49957" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="82.62439" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="104.14389" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="175.27847" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="230.59967" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="219.18745" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="151.58408" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="90.070419" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="90.99176" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="153.75897" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="220.49237" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="229.72971" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="173.10358" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="102.78757" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="83.059372" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="132.29086" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="205.54895" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="235.00085" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="193.75314" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="119.95731" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="81.319473" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="113.38123" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="186.6907" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="233.69592" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="211.30644" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="140.12045" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="85.234238" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="97.132843" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="165.17119" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="226.63345" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="224.89355" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="161.69136" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="95.341522" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="86.539185" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="143.2681" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="213.91632" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="233.20953" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="183.21086" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="110.285" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="81.319473" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-131.70703, -119.44922, -111.12891, -106.71484, -100.24609, -95.832031, -84.582031, -76.261719, -71.191406, -60.746094, -45.433594, -34.183594, -28.277344, -19.074219, -14.738281, -10.324219, -1.1210938, 3.2148438, 7.6289063, 17.886719, 22.433594, 31.042969, 38.722656, 47.667969, 62.324219, 70.933594, 80.613281, 92.871094, 101.48047, 107.84766, 114.21484, 118.76172, 125.80078, " y="-6.890625, ">
|
||||
HF - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,338 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M53.6964 270.039L53.6964 46.2813M79.2701 270.039L79.2701 46.2813M104.844 270.039L104.844 46.2813M130.417 270.039L130.417 46.2813M155.991 270.039L155.991 46.2813M181.565 270.039L181.565 46.2813M207.138 270.039L207.138 46.2813M232.712 270.039L232.712 46.2813M258.286 270.039L258.286 46.2813M283.86 270.039L283.86 46.2813M309.433 270.039L309.433 46.2813M335.007 270.039L335.007 46.2813M360.581 270.039L360.581 46.2813M386.154 270.039L386.154 46.2813M411.728 270.039L411.728 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M35.5391 255.446L435 255.446M35.5391 216.532L435 216.532M35.5391 177.617L435 177.617M35.5391 138.703L435 138.703M35.5391 99.7886L435 99.7886M35.5391 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_6d">
|
||||
<rect x="35.539063" y="46.28125" width="399.46094" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_6d)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M53.6964 255.446L53.6964 255.446L58.8111 253.5L63.9258 255.446L69.0406 253.5L74.1553 255.446L79.2701 253.5L84.3848 255.446L89.4995 255.446L94.6143 255.446L99.729 255.446L104.844 255.446L109.958 255.446L115.073 255.446L120.188 255.446L125.303 255.446L130.417 255.446L135.532 255.446L140.647 255.446L145.762 255.446L150.876 255.446L155.991 255.446L161.106 255.446L166.221 255.446L171.335 255.446L176.45 255.446L181.565 255.446L186.68 255.446L191.794 255.446L196.909 255.446L202.024 255.446L207.138 255.446L212.253 255.446L217.368 255.446L222.483 255.446L227.597 255.446L232.712 255.446L237.827 255.446L242.942 255.446L248.056 255.446L253.171 60.8741L258.286 60.8741L263.401 60.8741L268.515 60.8741L273.63 60.8741L278.745 60.8741L283.86 60.8741L288.974 60.8741L294.089 60.8741L299.204 60.8741L304.318 60.8741L309.433 60.8741L314.548 60.8741L319.663 60.8741L324.777 60.8741L329.892 60.8741L335.007 60.8741L340.122 60.8741L345.236 60.8741L350.351 60.8741L355.466 60.8741L360.581 60.8741L365.695 60.8741L370.81 60.8741L375.925 60.8741L381.04 60.8741L386.154 60.8741L391.269 60.8741L396.384 60.8741L401.498 60.8741L406.613 60.8741L411.728 60.8741L416.843 60.8741"/>
|
||||
<ellipse fill="red" cx="53.696381" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="58.811115" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="63.92585" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="69.040588" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="74.155319" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="79.270065" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="84.384796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="89.499535" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="94.614273" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="99.729012" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="104.84374" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="109.95848" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="115.07322" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="120.18796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="125.30269" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="130.41742" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="135.53217" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="140.64691" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="145.76164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="150.87637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="155.99112" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="161.10585" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="166.22058" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="171.33533" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="176.45006" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="181.56479" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="186.67953" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="191.79427" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="196.90901" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="202.02374" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="207.13847" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="212.25322" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="217.36795" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="222.4827" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="227.59743" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="232.71216" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="237.8269" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="242.94164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="248.05637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="253.17111" cy="60.874146" rx="0.40455627" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="258.28583" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="263.40057" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="268.51532" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="273.63007" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="278.74481" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="283.85953" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="288.97427" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="294.08899" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="299.20374" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="304.31848" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="309.43323" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="314.54794" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="319.66269" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="324.77744" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="329.89215" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="335.0069" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="340.12164" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="345.23636" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="350.3511" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="355.46585" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="360.58057" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="365.69531" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="370.81006" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="375.9248" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="381.03952" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="386.15427" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="391.26901" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="396.38373" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="401.49847" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="406.61322" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="411.72794" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="416.84268" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
</g>
|
||||
<clipPath id="cl_6e">
|
||||
<rect x="35.539063" y="46.28125" width="399.46094" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_6e)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M53.6964 254.473L53.6964 254.473L58.8111 254.473L63.9258 254.473L69.0406 254.473L74.1553 254.473L79.2701 254.473L84.3848 254.473L89.4995 254.473L94.6143 254.576L99.729 255.343L104.844 255.446L109.958 255.446L115.073 255.446L120.188 255.446L125.303 255.446L130.417 255.446L135.532 255.446L140.647 255.446L145.762 255.446L150.876 255.446L155.991 255.446L161.106 255.446L166.221 255.446L171.335 255.446L176.45 255.446L181.565 255.446L186.68 255.446L191.794 255.446L196.909 255.446L202.024 255.446L207.138 255.446L212.253 255.446L217.368 255.446L222.483 255.446L227.597 255.446L232.712 255.446L237.827 255.446L242.942 255.446L248.056 255.446L253.171 255.441L258.286 245.16L263.401 158.16L268.515 71.1602L273.63 60.8791L278.745 60.8741L283.86 60.8741L288.974 60.8741L294.089 60.8741L299.204 60.8741L304.318 60.8741L309.433 60.8741L314.548 60.8741L319.663 60.8741L324.777 60.8741L329.892 60.8741L335.007 60.8741L340.122 60.8741L345.236 60.8741L350.351 60.8741L355.466 60.8741L360.581 60.8741L365.695 60.8741L370.81 60.8741L375.925 60.8741L381.04 60.8741L386.154 60.8741L391.269 60.8741L396.384 60.8741L401.498 60.8741L406.613 60.8741L411.728 60.8741L416.843 60.8741"/>
|
||||
<ellipse fill="blue" cx="53.696381" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="58.811115" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="63.92585" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="69.040588" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="74.155319" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="79.270065" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="84.384796" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="89.499535" cy="254.47336" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="94.614273" cy="254.57611" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="99.729012" cy="255.34335" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="104.84374" cy="255.44611" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="109.95848" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="115.07322" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="120.18796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="125.30269" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="130.41742" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="135.53217" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="140.64691" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="145.76164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="150.87637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="155.99112" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="161.10585" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="166.22058" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="171.33533" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="176.45006" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="181.56479" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="186.67953" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="191.79427" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="196.90901" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="202.02374" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="207.13847" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="212.25322" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="217.36795" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="222.4827" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="227.59743" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="232.71216" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="237.8269" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="242.94164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="248.05637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="253.17111" cy="255.44125" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="258.28583" cy="245.16008" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="263.40057" cy="158.16016" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="268.51532" cy="71.160233" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="273.63007" cy="60.879059" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="278.74481" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="283.85953" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="288.97427" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="294.08899" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="299.20374" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="304.31848" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="309.43323" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="314.54794" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="319.66269" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="324.77744" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="329.89215" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="335.0069" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="340.12164" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="345.23636" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="350.3511" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="355.46585" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="360.58057" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="365.69531" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="370.81006" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="375.9248" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="381.03952" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="386.15427" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="391.26901" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="396.38373" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="401.49847" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="406.61322" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="411.72794" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
<ellipse fill="blue" cx="416.84268" cy="60.874146" rx="0.40457153" ry="0.4045639"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.6964 270.039L53.6964 274.039"/>
|
||||
<text transform="translate(53.6964 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M79.2701 270.039L79.2701 274.039"/>
|
||||
<text transform="translate(79.2701 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M104.844 270.039L104.844 274.039"/>
|
||||
<text transform="translate(104.844 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M130.417 270.039L130.417 274.039"/>
|
||||
<text transform="translate(130.417 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M155.991 270.039L155.991 274.039"/>
|
||||
<text transform="translate(155.991 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M181.565 270.039L181.565 274.039"/>
|
||||
<text transform="translate(181.565 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M207.138 270.039L207.138 274.039"/>
|
||||
<text transform="translate(207.138 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M232.712 270.039L232.712 274.039"/>
|
||||
<text transform="translate(232.712 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M258.286 270.039L258.286 274.039"/>
|
||||
<text transform="translate(258.286 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M283.86 270.039L283.86 274.039"/>
|
||||
<text transform="translate(283.86 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M309.433 270.039L309.433 274.039"/>
|
||||
<text transform="translate(309.433 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M335.007 270.039L335.007 274.039"/>
|
||||
<text transform="translate(335.007 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.581 270.039L360.581 274.039"/>
|
||||
<text transform="translate(360.581 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.154 270.039L386.154 274.039"/>
|
||||
<text transform="translate(386.154 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.728 270.039L411.728 274.039"/>
|
||||
<text transform="translate(411.728 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M38.3522 270.039L38.3522 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.4669 270.039L43.4669 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.5816 270.039L48.5816 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.8111 270.039L58.8111 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.9258 270.039L63.9258 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M69.0406 270.039L69.0406 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M74.1553 270.039L74.1553 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M84.3848 270.039L84.3848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M89.4995 270.039L89.4995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M94.6143 270.039L94.6143 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M99.729 270.039L99.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M109.958 270.039L109.958 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M115.073 270.039L115.073 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M120.188 270.039L120.188 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M125.303 270.039L125.303 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M135.532 270.039L135.532 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M140.647 270.039L140.647 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M145.762 270.039L145.762 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M150.876 270.039L150.876 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M161.106 270.039L161.106 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M166.221 270.039L166.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M171.335 270.039L171.335 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M176.45 270.039L176.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M186.68 270.039L186.68 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M191.794 270.039L191.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M196.909 270.039L196.909 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M202.024 270.039L202.024 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M212.253 270.039L212.253 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M217.368 270.039L217.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M222.483 270.039L222.483 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M227.597 270.039L227.597 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M237.827 270.039L237.827 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M242.942 270.039L242.942 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M248.056 270.039L248.056 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M253.171 270.039L253.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M263.401 270.039L263.401 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M268.515 270.039L268.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M273.63 270.039L273.63 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M278.745 270.039L278.745 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.974 270.039L288.974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M294.089 270.039L294.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M299.204 270.039L299.204 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M304.318 270.039L304.318 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M314.548 270.039L314.548 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M319.663 270.039L319.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.777 270.039L324.777 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.892 270.039L329.892 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M340.122 270.039L340.122 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M345.236 270.039L345.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M350.351 270.039L350.351 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M355.466 270.039L355.466 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.695 270.039L365.695 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.81 270.039L370.81 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.925 270.039L375.925 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.04 270.039L381.04 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.269 270.039L391.269 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.384 270.039L396.384 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.498 270.039L401.498 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.613 270.039L406.613 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.843 270.039L416.843 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.957 270.039L421.957 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.072 270.039L427.072 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.187 270.039L432.187 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 255.446L31.5391 255.446"/>
|
||||
<text transform="translate(26.5391 255.446)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 216.532L31.5391 216.532"/>
|
||||
<text transform="translate(26.5391 216.532)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.2
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 177.617L31.5391 177.617"/>
|
||||
<text transform="translate(26.5391 177.617)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.4
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 138.703L31.5391 138.703"/>
|
||||
<text transform="translate(26.5391 138.703)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.6
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 99.7886L31.5391 99.7886"/>
|
||||
<text transform="translate(26.5391 99.7886)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.8
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 60.8741L31.5391 60.8741"/>
|
||||
<text transform="translate(26.5391 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 263.229L33.5391 263.229"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 247.663L33.5391 247.663"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 239.88L33.5391 239.88"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 232.098L33.5391 232.098"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 224.315L33.5391 224.315"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 208.749L33.5391 208.749"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 200.966L33.5391 200.966"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 193.183L33.5391 193.183"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 185.4L33.5391 185.4"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 169.834L33.5391 169.834"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 162.052L33.5391 162.052"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 154.269L33.5391 154.269"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 146.486L33.5391 146.486"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 130.92L33.5391 130.92"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 123.137L33.5391 123.137"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 115.354L33.5391 115.354"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 107.571L33.5391 107.571"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 92.0057L33.5391 92.0057"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 84.2228L33.5391 84.2228"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 76.4399L33.5391 76.4399"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 68.657L33.5391 68.657"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 53.0913L33.5391 53.0913"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 270.039L35.5391 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(235.27 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-151.20313, -146.13281, -131.47656, -121.55469, -111.875, -107.32813, -100.28906, -91.632813, -87.21875, -80.75, -76.335938, -65.085938, -56.765625, -51.695313, -41.25, -25.9375, -14.6875, -8.78125, 0.421875, 4.7578125, 9.171875, 18.375, 22.710938, 27.125, 37.382813, 41.929688, 50.539063, 58.21875, 67.164063, 81.820313, 90.429688, 100.10938, 112.36719, 120.97656, 127.34375, 133.71094, 138.25781, 145.29688, " y="-6.890625, ">
|
||||
Impulse - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,320 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 216.766L435 216.766M40.3379 158.16L435 158.16M40.3379 99.5541L435 99.5541"/>
|
||||
<clipPath id="cl_a3">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_a3)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 240.209L58.2771 240.209L63.3304 193.324L68.3837 240.209L73.437 193.324L78.4902 240.209L83.5435 216.766L88.5968 216.766L93.6501 210.906L98.7034 246.069L103.757 254.274L108.81 227.315L113.863 190.98L118.917 178.086L123.97 200.357L129.023 237.864L134.076 255.446L139.13 237.864L144.183 200.357L149.236 178.086L154.29 190.98L159.343 228.487L164.396 254.274L169.45 246.069L174.503 210.906L179.556 181.603L184.609 183.947L189.663 216.766L194.716 249.586L199.769 251.93L204.823 221.455L209.876 187.463L214.929 179.258L219.982 206.217L225.036 242.553L230.089 255.446L235.142 232.004L240.196 195.668L245.249 178.086L250.302 195.668L255.355 115.964L260.409 138.234L265.462 124.169L270.515 87.8329L275.569 62.0463L280.622 70.2511L285.675 105.415L290.729 135.89L295.782 132.374L300.835 98.382L305.888 66.7348L310.942 64.3905L315.995 94.8656L321.048 130.029L326.102 137.062L331.155 110.103L336.208 73.7675L341.261 60.8741L346.315 84.3166L351.368 121.824L356.421 138.234L361.475 119.48L366.528 81.9723L371.581 60.8741L376.634 74.9396L381.688 111.275L386.741 137.062L391.794 128.857L396.848 92.5214L401.901 63.2184L406.954 66.7348L412.008 100.726L417.061 133.546"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="240.20859" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="193.32378" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="240.20859" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="193.32378" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="240.20859" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="216.76617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="216.76617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="210.90558" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="246.0692" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="254.27405" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="227.31528" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="190.97952" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="178.08621" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="200.35651" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="237.86435" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="237.86435" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="200.35651" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="178.08621" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="190.97952" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="228.4874" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="254.27405" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="246.0692" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="210.90558" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="181.60257" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="183.94681" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="216.76617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="249.58556" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="251.92979" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="221.45467" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="187.46317" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="179.25833" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="206.2171" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="242.55284" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="232.00375" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="195.66801" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="178.08621" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="195.66801" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="115.96382" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="138.2341" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="124.16866" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="87.832916" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="62.046265" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="70.251114" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="105.41473" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="135.88986" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="132.3735" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="98.382004" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="66.734756" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="64.390518" rx="0.40213013" ry="0.4021244"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="94.865646" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="130.02927" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="137.06198" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="110.10321" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="73.767471" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="84.316559" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="121.82442" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="138.2341" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="119.48018" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="81.972321" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="74.93959" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="111.27533" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="137.06198" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="128.85715" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="92.521408" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="63.218399" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="66.734756" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="100.72624" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="133.54562" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<clipPath id="cl_a4">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_a4)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 216.766L58.2771 216.766L63.3304 216.766L68.3837 216.766L73.437 216.766L78.4902 216.766L83.5435 216.767L88.5968 218.004L93.6501 226.01L98.7034 217.695L103.757 215.696L108.81 229.23L113.863 246.887L118.917 238.439L123.97 209.891L129.023 187.633L134.076 191.887L139.13 218.862L144.183 243.741L149.236 243.741L154.29 218.862L159.343 191.887L164.396 187.695L169.45 210.415L174.503 238.963L179.556 246.948L184.609 227.371L189.663 198.238L194.716 186.061L199.769 201.968L204.823 231.564L209.876 247.41L214.929 234.77L219.982 205.637L225.036 186.585L230.089 195.094L235.142 223.641L240.196 245.838L245.249 241.121L250.302 214.146L255.355 189.726L260.409 183.594L265.462 156.064L270.515 130.568L275.569 128.105L280.622 105.381L285.675 77.2955L290.729 69.3725L295.782 89.0108L300.835 118.606L305.888 130.722L310.942 113.89L315.995 84.2323L321.048 68.8485L326.102 81.6119L331.155 111.208L336.208 130.26L341.261 121.289L346.315 92.6793L351.368 70.4826L356.421 75.2612L361.475 102.699L366.528 127.053L371.581 126.005L376.634 100.602L381.688 74.1511L386.741 70.9447L391.794 93.7274L396.848 121.813L401.901 129.674L406.954 109.573L412.008 79.9778L417.061 68.3244"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="216.76617" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="216.76617" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="216.76617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="216.76617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="216.76617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="216.76677" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="218.00429" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="226.00986" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="217.69536" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="215.69562" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="229.23029" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="246.88673" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="238.4388" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="209.89133" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="187.63272" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="191.88718" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="218.86246" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="243.74142" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="243.74142" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="218.86246" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="191.88721" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="187.69464" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="210.41542" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="238.96289" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="246.94778" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="227.37144" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="198.23798" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="186.06052" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="201.96837" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="231.56396" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="247.40991" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="234.77029" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="205.63687" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="186.58458" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="195.09354" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="223.64101" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="245.83772" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="241.12109" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="214.14581" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="189.72604" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="183.59448" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="156.06386" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="130.56761" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="128.10452" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="105.3808" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="77.295486" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="69.372528" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="89.010803" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="118.60641" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="130.72195" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="113.88979" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="84.232269" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="68.84848" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="81.611908" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="111.20755" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="130.25983" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="121.28871" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="92.679337" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="70.48262" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="75.261154" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="102.69856" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="127.05344" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="126.00531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="100.60226" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="74.151062" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="70.944717" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="93.727432" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="121.81274" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="129.6738" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="109.57335" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="79.977753" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="68.324387" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.766L36.3379 216.766"/>
|
||||
<text transform="translate(31.3379 216.766)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.5541L36.3379 99.5541"/>
|
||||
<text transform="translate(31.3379 99.5541)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 263.651L38.3379 263.651"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 251.93L38.3379 251.93"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 240.209L38.3379 240.209"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 228.487L38.3379 228.487"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 205.045L38.3379 205.045"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 193.324L38.3379 193.324"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 181.603L38.3379 181.603"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 169.881L38.3379 169.881"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 146.439L38.3379 146.439"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 134.718L38.3379 134.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 122.997L38.3379 122.997"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 111.275L38.3379 111.275"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 87.8329L38.3379 87.8329"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 76.1117L38.3379 76.1117"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 64.3905L38.3379 64.3905"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 52.6693L38.3379 52.6693"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-161.49219, -156.42188, -141.76563, -131.84375, -122.16406, -117.61719, -110.57813, -101.92188, -89.664063, -81.34375, -76.929688, -70.460938, -66.046875, -54.796875, -46.476563, -41.40625, -30.960938, -15.648438, -4.3984375, 1.5078125, 10.710938, 15.046875, 19.460938, 28.664063, 33, 37.414063, 47.671875, 52.21875, 60.828125, 68.507813, 77.453125, 92.109375, 100.71875, 110.39844, 122.65625, 131.26563, 137.63281, 144, 148.54688, 155.58594, " y="-6.890625, ">
|
||||
ImpulseHF - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,357 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M51.2131 270.039L51.2131 46.2813M76.9533 270.039L76.9533 46.2813M102.694 270.039L102.694 46.2813M128.434 270.039L128.434 46.2813M154.174 270.039L154.174 46.2813M179.914 270.039L179.914 46.2813M205.654 270.039L205.654 46.2813M231.395 270.039L231.395 46.2813M257.135 270.039L257.135 46.2813M282.875 270.039L282.875 46.2813M308.615 270.039L308.615 46.2813M334.356 270.039L334.356 46.2813M360.096 270.039L360.096 46.2813M385.836 270.039L385.836 46.2813M411.576 270.039L411.576 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M32.9375 251.972L435 251.972M32.9375 224.176L435 224.176M32.9375 196.38L435 196.38M32.9375 168.584L435 168.584M32.9375 140.788L435 140.788M32.9375 112.992L435 112.992M32.9375 85.1956L435 85.1956M32.9375 57.3997L435 57.3997"/>
|
||||
<clipPath id="cl_c1">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_c1)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M51.2131 185.956L51.2131 185.956L56.3611 192.905L61.5092 185.956L66.6572 192.905L71.8053 185.956L76.9533 192.905L82.1013 185.956L87.2494 192.905L92.3974 199.854L97.5455 199.854L102.694 130.364L107.842 102.568L112.99 137.313L118.138 151.211L123.286 144.262L128.434 130.364L133.582 60.8741L138.73 85.1956L143.878 85.1956L149.026 85.1956L154.174 102.568L159.322 92.1447L164.47 102.568L169.618 116.466L174.766 112.992L179.914 102.568L185.062 137.313L190.21 133.839L195.358 137.313L200.506 106.043L205.654 102.568L210.803 88.6702L215.951 88.6702L221.099 88.6702L226.247 109.517L231.395 116.466L236.543 102.568L241.691 140.788L246.839 144.262L251.987 133.839L257.135 137.313L262.283 154.686L267.431 140.788L272.579 144.262L277.727 144.262L282.875 123.415L288.023 133.839L293.171 116.466L298.319 112.992L303.467 74.7722L308.615 88.6702L313.763 99.0937L318.912 88.6702L324.06 106.043L329.208 109.517L334.356 119.941L339.504 144.262L344.652 161.635L349.8 182.482L354.948 161.635L360.096 168.584L365.244 185.956L370.392 206.803L375.54 189.431L380.688 158.16L385.836 168.584L390.984 161.635L396.132 192.905L401.28 192.905L406.428 192.905L411.576 255.446L416.724 248.497"/>
|
||||
<ellipse fill="red" cx="51.213066" cy="185.95616" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="56.361115" cy="192.90515" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="61.509163" cy="185.95616" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="66.657211" cy="192.90515" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="71.805252" cy="185.95616" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="76.953308" cy="192.90515" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="82.101349" cy="185.95616" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="87.249405" cy="192.90515" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="92.397446" cy="199.85416" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="97.545494" cy="199.85416" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="102.69354" cy="130.36415" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="107.84159" cy="102.56815" rx="0.40587616" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="112.98964" cy="137.31316" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="118.13769" cy="151.21115" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="123.28573" cy="144.26215" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="128.43378" cy="130.36415" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="133.58182" cy="60.874146" rx="0.40588379" ry="0.40587997"/>
|
||||
<ellipse fill="red" cx="138.72987" cy="85.195648" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="143.87793" cy="85.195648" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="149.02597" cy="85.195648" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="154.17401" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="159.32205" cy="92.144653" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="164.47011" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="169.61816" cy="116.46616" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="174.7662" cy="112.99165" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="179.91425" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="185.0623" cy="137.31316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="190.21034" cy="133.83865" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="195.3584" cy="137.31316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="200.50644" cy="106.04265" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="205.6545" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="210.80254" cy="88.670151" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="215.95058" cy="88.670151" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="221.09863" cy="88.670151" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="226.24667" cy="109.51715" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="231.39473" cy="116.46616" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="236.54277" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="241.69083" cy="140.78766" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="246.83887" cy="144.26215" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="251.98692" cy="133.83865" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="257.13495" cy="137.31316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="262.28302" cy="154.68565" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="267.43106" cy="140.78766" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="272.5791" cy="144.26215" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="277.72717" cy="144.26215" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="282.87518" cy="123.41516" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="288.02325" cy="133.83865" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="293.1713" cy="116.46616" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="298.31934" cy="112.99165" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="303.46738" cy="74.772156" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="308.61545" cy="88.670151" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="313.76349" cy="99.093658" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="318.91153" cy="88.670151" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="324.05957" cy="106.04265" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="329.20764" cy="109.51715" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="334.35568" cy="119.94066" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="339.50372" cy="144.26215" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="344.65176" cy="161.63466" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="349.7998" cy="182.48166" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="354.94788" cy="161.63466" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="360.09592" cy="168.58365" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="365.24396" cy="185.95616" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="370.392" cy="206.80316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="375.54004" cy="189.43066" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="380.68811" cy="158.16016" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="385.83615" cy="168.58365" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="390.98419" cy="161.63466" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="396.13223" cy="192.90515" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="401.2803" cy="192.90515" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="406.42834" cy="192.90515" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="411.57639" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="416.72443" cy="248.49716" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<clipPath id="cl_c2">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_c2)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M51.2131 189.431L51.2131 189.431L56.3611 189.431L61.5092 189.431L66.6572 189.431L71.8053 189.431L76.9533 189.431L82.1013 189.431L87.2494 189.431L92.3974 189.431L97.5455 190.165L102.694 196.011L107.842 195.812L112.99 163.64L118.138 121.977L123.286 122.146L128.434 142.058L133.582 146.265L138.73 134.007L143.878 97.6398L149.026 76.7088L154.174 83.9121L159.322 86.1132L164.47 93.3311L169.618 96.9894L174.766 98.6416L179.914 108.782L185.062 113.444L190.21 109.8L195.358 120.308L200.506 133.922L205.654 134.105L210.803 121.31L215.951 105.224L221.099 95.8036L226.247 89.4055L231.395 89.7728L236.543 99.4607L241.691 111.156L246.839 111.17L251.987 122.596L257.135 139.954L262.283 139.05L267.431 137.045L272.579 145.081L277.727 147.002L282.875 143.259L288.023 142.977L293.171 134.389L298.319 128.811L303.467 124.417L308.615 113.627L313.763 94.801L318.912 84.2925L324.06 92.5975L329.208 94.249L334.356 98.0911L339.504 107.413L344.652 115.831L349.8 132.469L354.948 152.764L360.096 170.037L365.244 171.323L370.392 167.13L375.54 178.005L380.688 194.542L385.836 195.362L390.984 175.264L396.132 164.659L401.28 166.212L406.428 177.637L411.576 191.254L416.724 196.21"/>
|
||||
<ellipse fill="blue" cx="51.213066" cy="189.43066" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="56.361115" cy="189.43066" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="61.509163" cy="189.43066" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="66.657211" cy="189.43066" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="71.805252" cy="189.43066" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="76.953308" cy="189.43066" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="82.101349" cy="189.43066" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="87.249405" cy="189.43066" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="92.397446" cy="189.431" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="97.545494" cy="190.16519" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="102.69354" cy="196.01071" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="107.84159" cy="195.81232" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="112.98964" cy="163.64041" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="118.13769" cy="121.9769" rx="0.40587616" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="123.28573" cy="122.14639" rx="0.40587616" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="128.43378" cy="142.05835" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="133.58182" cy="146.26459" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="138.72987" cy="134.00717" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="143.87793" cy="97.639801" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="149.02597" cy="76.708847" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="154.17401" cy="83.912079" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="159.32205" cy="86.113174" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="164.47011" cy="93.331131" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="169.61816" cy="96.989395" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="174.7662" cy="98.641632" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="179.91425" cy="108.78244" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="185.0623" cy="113.44376" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="190.21034" cy="109.79994" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="195.3584" cy="120.3082" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="200.50644" cy="133.92226" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="205.6545" cy="134.1055" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="210.80254" cy="121.31029" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="215.95058" cy="105.22371" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="221.09863" cy="95.803619" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="226.24667" cy="89.405487" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="231.39473" cy="89.772751" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="236.54277" cy="99.460663" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="241.69083" cy="111.15582" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="246.83887" cy="111.16983" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="251.98692" cy="122.59587" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="257.13495" cy="139.95383" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="262.28302" cy="139.04988" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="267.43106" cy="137.04491" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="272.5791" cy="145.08136" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="277.72717" cy="147.00185" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="282.87518" cy="143.25867" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="288.02325" cy="142.97702" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="293.1713" cy="134.38918" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="298.31934" cy="128.8105" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="303.46738" cy="124.41725" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="308.61545" cy="113.62691" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="313.76349" cy="94.80101" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="318.91153" cy="84.292496" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="324.05957" cy="92.597549" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="329.20764" cy="94.248993" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="334.35568" cy="98.091125" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="339.50372" cy="107.41342" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="344.65176" cy="115.83098" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="349.7998" cy="132.46921" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="354.94788" cy="152.76395" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="360.09592" cy="170.03723" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="365.24396" cy="171.32344" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="370.392" cy="167.12964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="375.54004" cy="178.00471" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="380.68811" cy="194.5419" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="385.83615" cy="195.36154" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="390.98419" cy="175.26414" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="396.13223" cy="164.65891" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="401.2803" cy="166.21204" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="406.42834" cy="177.63699" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="411.57639" cy="191.25378" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="416.72443" cy="196.21043" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M51.2131 270.039L51.2131 274.039"/>
|
||||
<text transform="translate(51.2131 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M76.9533 270.039L76.9533 274.039"/>
|
||||
<text transform="translate(76.9533 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.694 270.039L102.694 274.039"/>
|
||||
<text transform="translate(102.694 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M128.434 270.039L128.434 274.039"/>
|
||||
<text transform="translate(128.434 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.174 270.039L154.174 274.039"/>
|
||||
<text transform="translate(154.174 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.914 270.039L179.914 274.039"/>
|
||||
<text transform="translate(179.914 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M205.654 270.039L205.654 274.039"/>
|
||||
<text transform="translate(205.654 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M231.395 270.039L231.395 274.039"/>
|
||||
<text transform="translate(231.395 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M257.135 270.039L257.135 274.039"/>
|
||||
<text transform="translate(257.135 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M282.875 270.039L282.875 274.039"/>
|
||||
<text transform="translate(282.875 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M308.615 270.039L308.615 274.039"/>
|
||||
<text transform="translate(308.615 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M334.356 270.039L334.356 274.039"/>
|
||||
<text transform="translate(334.356 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.096 270.039L360.096 274.039"/>
|
||||
<text transform="translate(360.096 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M385.836 270.039L385.836 274.039"/>
|
||||
<text transform="translate(385.836 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.576 270.039L411.576 274.039"/>
|
||||
<text transform="translate(411.576 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.7689 270.039L35.7689 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.917 270.039L40.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M46.065 270.039L46.065 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M56.3611 270.039L56.3611 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M61.5092 270.039L61.5092 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M66.6572 270.039L66.6572 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M71.8053 270.039L71.8053 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M82.1013 270.039L82.1013 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M87.2494 270.039L87.2494 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M92.3974 270.039L92.3974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M97.5455 270.039L97.5455 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M107.842 270.039L107.842 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M112.99 270.039L112.99 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.138 270.039L118.138 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.286 270.039L123.286 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M133.582 270.039L133.582 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M138.73 270.039L138.73 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M143.878 270.039L143.878 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.026 270.039L149.026 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.322 270.039L159.322 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.47 270.039L164.47 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.618 270.039L169.618 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.766 270.039L174.766 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M185.062 270.039L185.062 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M190.21 270.039L190.21 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M195.358 270.039L195.358 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M200.506 270.039L200.506 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M210.803 270.039L210.803 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M215.951 270.039L215.951 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M221.099 270.039L221.099 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M226.247 270.039L226.247 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M236.543 270.039L236.543 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M241.691 270.039L241.691 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M246.839 270.039L246.839 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M251.987 270.039L251.987 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M262.283 270.039L262.283 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M267.431 270.039L267.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M272.579 270.039L272.579 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M277.727 270.039L277.727 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.023 270.039L288.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M293.171 270.039L293.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M298.319 270.039L298.319 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M303.467 270.039L303.467 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M313.763 270.039L313.763 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M318.912 270.039L318.912 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.06 270.039L324.06 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.208 270.039L329.208 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M339.504 270.039L339.504 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M344.652 270.039L344.652 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M349.8 270.039L349.8 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M354.948 270.039L354.948 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.244 270.039L365.244 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.392 270.039L370.392 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.54 270.039L375.54 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M380.688 270.039L380.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M390.984 270.039L390.984 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.132 270.039L396.132 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.28 270.039L401.28 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.428 270.039L406.428 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.724 270.039L416.724 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.872 270.039L421.872 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.021 270.039L427.021 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.169 270.039L432.169 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 251.972L28.9375 251.972"/>
|
||||
<text transform="translate(23.9375 251.972)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
64
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 224.176L28.9375 224.176"/>
|
||||
<text transform="translate(23.9375 224.176)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
66
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 196.38L28.9375 196.38"/>
|
||||
<text transform="translate(23.9375 196.38)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
68
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 168.584L28.9375 168.584"/>
|
||||
<text transform="translate(23.9375 168.584)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 140.788L28.9375 140.788"/>
|
||||
<text transform="translate(23.9375 140.788)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
72
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 112.992L28.9375 112.992"/>
|
||||
<text transform="translate(23.9375 112.992)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
74
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 85.1956L28.9375 85.1956"/>
|
||||
<text transform="translate(23.9375 85.1956)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
76
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 57.3997L28.9375 57.3997"/>
|
||||
<text transform="translate(23.9375 57.3997)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
78
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 268.649L30.9375 268.649"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 263.09L30.9375 263.09"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 257.531L30.9375 257.531"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 246.412L30.9375 246.412"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 240.853L30.9375 240.853"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 235.294L30.9375 235.294"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 229.735L30.9375 229.735"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 218.616L30.9375 218.616"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 213.057L30.9375 213.057"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 207.498L30.9375 207.498"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 201.939L30.9375 201.939"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 190.82L30.9375 190.82"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 185.261L30.9375 185.261"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 179.702L30.9375 179.702"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 174.143L30.9375 174.143"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 163.024L30.9375 163.024"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 157.465L30.9375 157.465"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 151.906L30.9375 151.906"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 146.347L30.9375 146.347"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 135.228L30.9375 135.228"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 129.669L30.9375 129.669"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 124.11L30.9375 124.11"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 118.551L30.9375 118.551"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 107.432L30.9375 107.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 101.873L30.9375 101.873"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 96.3141L30.9375 96.3141"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 90.7549L30.9375 90.7549"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 79.6365L30.9375 79.6365"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 74.0773L30.9375 74.0773"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 68.5181L30.9375 68.5181"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 62.9588L30.9375 62.9588"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 51.8405L30.9375 51.8405"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.2813L30.9375 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L32.9375 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(233.969 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-148.47656, -133.16406, -124.55469, -118.1875, -109.24219, -100.58594, -94.359375, -89.945313, -83.476563, -79.0625, -67.8125, -59.492188, -54.421875, -43.976563, -28.664063, -17.414063, -11.507813, -2.3046875, 2.03125, 6.4453125, 15.648438, 19.984375, 24.398438, 34.65625, 39.203125, 47.8125, 55.492188, 64.4375, 79.09375, 87.703125, 97.382813, 109.64063, 118.25, 124.61719, 130.98438, 135.53125, 142.57031, " y="-6.890625, ">
|
||||
Market - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 33 KiB |
@@ -1,355 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M51.2131 270.039L51.2131 46.2813M76.9533 270.039L76.9533 46.2813M102.694 270.039L102.694 46.2813M128.434 270.039L128.434 46.2813M154.174 270.039L154.174 46.2813M179.914 270.039L179.914 46.2813M205.654 270.039L205.654 46.2813M231.395 270.039L231.395 46.2813M257.135 270.039L257.135 46.2813M282.875 270.039L282.875 46.2813M308.615 270.039L308.615 46.2813M334.356 270.039L334.356 46.2813M360.096 270.039L360.096 46.2813M385.836 270.039L385.836 46.2813M411.576 270.039L411.576 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M32.9375 255.446L435 255.446M32.9375 226.833L435 226.833M32.9375 198.219L435 198.219M32.9375 169.606L435 169.606M32.9375 140.992L435 140.992M32.9375 112.379L435 112.379M32.9375 83.765L435 83.765M32.9375 55.1514L435 55.1514"/>
|
||||
<clipPath id="cl_79">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_79)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M51.2131 255.446L51.2131 255.446L56.3611 255.389L61.5092 255.446L66.6572 255.389L71.8053 255.446L76.9533 255.389L82.1013 249.723L87.2494 244.001L92.3974 238.278L97.5455 232.555L102.694 226.833L107.842 221.11L112.99 215.387L118.138 209.665L123.286 203.942L128.434 198.219L133.582 192.496L138.73 186.774L143.878 181.051L149.026 175.328L154.174 169.606L159.322 163.883L164.47 158.16L169.618 152.437L174.766 146.715L179.914 140.992L185.062 135.269L190.21 129.547L195.358 123.824L200.506 118.101L205.654 112.379L210.803 106.656L215.951 100.933L221.099 95.2104L226.247 89.4877L231.395 83.765L236.543 78.0423L241.691 72.3196L246.839 66.5969L251.987 60.8741L257.135 66.5969L262.283 255.446L267.431 255.446L272.579 255.446L277.727 255.446L282.875 255.446L288.023 255.446L293.171 255.446L298.319 255.446L303.467 255.446L308.615 255.446L313.763 255.446L318.912 255.446L324.06 255.446L329.208 255.446L334.356 255.446L339.504 255.446L344.652 255.446L349.8 255.446L354.948 255.446L360.096 255.446L365.244 255.446L370.392 255.446L375.54 255.446L380.688 255.446L385.836 255.446L390.984 255.446L396.132 255.446L401.28 255.446L406.428 255.446L411.576 255.446L416.724 255.446"/>
|
||||
<ellipse fill="red" cx="51.213066" cy="255.44617" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="56.361115" cy="255.38893" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="61.509163" cy="255.44617" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="66.657211" cy="255.38893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="71.805252" cy="255.44617" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="76.953308" cy="255.38893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="82.101349" cy="249.72345" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="87.249405" cy="244.00075" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="92.397446" cy="238.27805" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="97.545494" cy="232.55533" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="102.69354" cy="226.83263" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="107.84159" cy="221.10992" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="112.98964" cy="215.38722" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="118.13769" cy="209.66452" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="123.28573" cy="203.9418" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="128.43378" cy="198.2191" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="133.58182" cy="192.4964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="138.72987" cy="186.77368" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="143.87793" cy="181.05098" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="149.02597" cy="175.32828" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="154.17401" cy="169.60556" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="159.32205" cy="163.88287" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="164.47011" cy="158.16016" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="169.61816" cy="152.43744" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="174.7662" cy="146.71475" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="179.91425" cy="140.99203" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="185.0623" cy="135.26933" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="190.21034" cy="129.54663" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="195.3584" cy="123.82391" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="200.50644" cy="118.10121" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="205.6545" cy="112.37851" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="210.80254" cy="106.65581" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="215.95058" cy="100.93309" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="221.09863" cy="95.210388" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="226.24667" cy="89.487686" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="231.39473" cy="83.764969" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="236.54277" cy="78.042267" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="241.69083" cy="72.319565" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="246.83887" cy="66.596863" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="251.98692" cy="60.874146" rx="0.40588379" ry="0.40587997"/>
|
||||
<ellipse fill="red" cx="257.13495" cy="66.596863" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="262.28302" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="267.43106" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="272.5791" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="277.72717" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="282.87518" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="288.02325" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="293.1713" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="298.31934" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="303.46738" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="308.61545" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="313.76349" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="318.91153" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="324.05957" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="329.20764" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="334.35568" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="339.50372" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="344.65176" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="349.7998" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="354.94788" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="360.09592" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="365.24396" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="370.392" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="375.54004" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="380.68811" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="385.83615" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="390.98419" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="396.13223" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="401.2803" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="406.42834" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="411.57639" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="416.72443" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<clipPath id="cl_7a">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_7a)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M51.2131 255.418L51.2131 255.418L56.3611 255.418L61.5092 255.418L66.6572 255.418L71.8053 255.418L76.9533 255.418L82.1013 255.417L87.2494 255.115L92.3974 252.257L97.5455 246.859L102.694 241.139L107.842 235.417L112.99 229.694L118.138 223.971L123.286 218.249L128.434 212.526L133.582 206.803L138.73 201.08L143.878 195.358L149.026 189.635L154.174 183.912L159.322 178.19L164.47 172.467L169.618 166.744L174.766 161.022L179.914 155.299L185.062 149.576L190.21 143.853L195.358 138.131L200.506 132.408L205.654 126.685L210.803 120.963L215.951 115.24L221.099 109.517L226.247 103.794L231.395 98.0717L236.543 92.349L241.691 86.6263L246.839 80.9036L251.987 75.1809L257.135 69.4585L262.283 64.3455L267.431 74.0217L272.579 160.719L277.727 245.462L282.875 255.441L288.023 255.446L293.171 255.446L298.319 255.446L303.467 255.446L308.615 255.446L313.763 255.446L318.912 255.446L324.06 255.446L329.208 255.446L334.356 255.446L339.504 255.446L344.652 255.446L349.8 255.446L354.948 255.446L360.096 255.446L365.244 255.446L370.392 255.446L375.54 255.446L380.688 255.446L385.836 255.446L390.984 255.446L396.132 255.446L401.28 255.446L406.428 255.446L411.576 255.446L416.724 255.446"/>
|
||||
<ellipse fill="blue" cx="51.213066" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="56.361115" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="61.509163" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="66.657211" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="71.805252" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="76.953308" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="82.101349" cy="255.4174" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="87.249405" cy="255.11487" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="92.397446" cy="252.25655" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="97.545494" cy="246.85893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="102.69354" cy="241.13939" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="107.84159" cy="235.41669" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="112.98964" cy="229.69398" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="118.13769" cy="223.97128" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="123.28573" cy="218.24857" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="128.43378" cy="212.52586" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="133.58182" cy="206.80316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="138.72987" cy="201.08044" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="143.87793" cy="195.35776" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="149.02597" cy="189.63504" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="154.17401" cy="183.91232" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="159.32205" cy="178.18964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="164.47011" cy="172.46692" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="169.61816" cy="166.74422" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="174.7662" cy="161.02151" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="179.91425" cy="155.2988" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="185.0623" cy="149.5761" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="190.21034" cy="143.85339" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="195.3584" cy="138.13069" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="200.50644" cy="132.40797" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="205.6545" cy="126.68527" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="210.80254" cy="120.96257" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="215.95058" cy="115.23985" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="221.09863" cy="109.51715" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="226.24667" cy="103.79445" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="231.39473" cy="98.071747" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="236.54277" cy="92.34903" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="241.69083" cy="86.626328" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="246.83887" cy="80.903625" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="251.98692" cy="75.180923" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="257.13495" cy="69.458496" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="262.28302" cy="64.345474" rx="0.40588379" ry="0.40587807"/>
|
||||
<ellipse fill="blue" cx="267.43106" cy="74.021729" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="272.5791" cy="160.71912" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="277.72717" cy="245.46246" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="282.87518" cy="255.44139" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="288.02325" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="293.1713" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="298.31934" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="303.46738" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="308.61545" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="313.76349" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="318.91153" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="324.05957" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="329.20764" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="334.35568" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="339.50372" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="344.65176" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="349.7998" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="354.94788" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="360.09592" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="365.24396" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="370.392" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="375.54004" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="380.68811" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="385.83615" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="390.98419" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="396.13223" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="401.2803" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="406.42834" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="411.57639" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="416.72443" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M51.2131 270.039L51.2131 274.039"/>
|
||||
<text transform="translate(51.2131 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M76.9533 270.039L76.9533 274.039"/>
|
||||
<text transform="translate(76.9533 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.694 270.039L102.694 274.039"/>
|
||||
<text transform="translate(102.694 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M128.434 270.039L128.434 274.039"/>
|
||||
<text transform="translate(128.434 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.174 270.039L154.174 274.039"/>
|
||||
<text transform="translate(154.174 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.914 270.039L179.914 274.039"/>
|
||||
<text transform="translate(179.914 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M205.654 270.039L205.654 274.039"/>
|
||||
<text transform="translate(205.654 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M231.395 270.039L231.395 274.039"/>
|
||||
<text transform="translate(231.395 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M257.135 270.039L257.135 274.039"/>
|
||||
<text transform="translate(257.135 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M282.875 270.039L282.875 274.039"/>
|
||||
<text transform="translate(282.875 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M308.615 270.039L308.615 274.039"/>
|
||||
<text transform="translate(308.615 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M334.356 270.039L334.356 274.039"/>
|
||||
<text transform="translate(334.356 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.096 270.039L360.096 274.039"/>
|
||||
<text transform="translate(360.096 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M385.836 270.039L385.836 274.039"/>
|
||||
<text transform="translate(385.836 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.576 270.039L411.576 274.039"/>
|
||||
<text transform="translate(411.576 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.7689 270.039L35.7689 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.917 270.039L40.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M46.065 270.039L46.065 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M56.3611 270.039L56.3611 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M61.5092 270.039L61.5092 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M66.6572 270.039L66.6572 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M71.8053 270.039L71.8053 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M82.1013 270.039L82.1013 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M87.2494 270.039L87.2494 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M92.3974 270.039L92.3974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M97.5455 270.039L97.5455 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M107.842 270.039L107.842 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M112.99 270.039L112.99 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.138 270.039L118.138 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.286 270.039L123.286 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M133.582 270.039L133.582 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M138.73 270.039L138.73 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M143.878 270.039L143.878 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.026 270.039L149.026 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.322 270.039L159.322 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.47 270.039L164.47 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.618 270.039L169.618 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.766 270.039L174.766 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M185.062 270.039L185.062 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M190.21 270.039L190.21 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M195.358 270.039L195.358 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M200.506 270.039L200.506 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M210.803 270.039L210.803 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M215.951 270.039L215.951 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M221.099 270.039L221.099 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M226.247 270.039L226.247 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M236.543 270.039L236.543 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M241.691 270.039L241.691 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M246.839 270.039L246.839 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M251.987 270.039L251.987 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M262.283 270.039L262.283 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M267.431 270.039L267.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M272.579 270.039L272.579 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M277.727 270.039L277.727 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.023 270.039L288.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M293.171 270.039L293.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M298.319 270.039L298.319 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M303.467 270.039L303.467 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M313.763 270.039L313.763 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M318.912 270.039L318.912 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.06 270.039L324.06 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.208 270.039L329.208 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M339.504 270.039L339.504 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M344.652 270.039L344.652 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M349.8 270.039L349.8 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M354.948 270.039L354.948 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.244 270.039L365.244 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.392 270.039L370.392 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.54 270.039L375.54 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M380.688 270.039L380.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M390.984 270.039L390.984 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.132 270.039L396.132 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.28 270.039L401.28 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.428 270.039L406.428 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.724 270.039L416.724 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.872 270.039L421.872 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.021 270.039L427.021 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.169 270.039L432.169 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 255.446L28.9375 255.446"/>
|
||||
<text transform="translate(23.9375 255.446)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 226.833L28.9375 226.833"/>
|
||||
<text transform="translate(23.9375 226.833)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 198.219L28.9375 198.219"/>
|
||||
<text transform="translate(23.9375 198.219)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 169.606L28.9375 169.606"/>
|
||||
<text transform="translate(23.9375 169.606)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 140.992L28.9375 140.992"/>
|
||||
<text transform="translate(23.9375 140.992)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 112.379L28.9375 112.379"/>
|
||||
<text transform="translate(23.9375 112.379)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 83.765L28.9375 83.765"/>
|
||||
<text transform="translate(23.9375 83.765)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 55.1514L28.9375 55.1514"/>
|
||||
<text transform="translate(23.9375 55.1514)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 266.892L30.9375 266.892"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 261.169L30.9375 261.169"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 249.723L30.9375 249.723"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 244.001L30.9375 244.001"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 238.278L30.9375 238.278"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 232.555L30.9375 232.555"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 221.11L30.9375 221.11"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 215.387L30.9375 215.387"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 209.665L30.9375 209.665"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 203.942L30.9375 203.942"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 192.496L30.9375 192.496"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 186.774L30.9375 186.774"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 181.051L30.9375 181.051"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 175.328L30.9375 175.328"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 163.883L30.9375 163.883"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 158.16L30.9375 158.16"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 152.437L30.9375 152.437"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 146.715L30.9375 146.715"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 135.269L30.9375 135.269"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 129.547L30.9375 129.547"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 123.824L30.9375 123.824"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 118.101L30.9375 118.101"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 106.656L30.9375 106.656"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 100.933L30.9375 100.933"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 95.2104L30.9375 95.2104"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 89.4877L30.9375 89.4877"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 78.0423L30.9375 78.0423"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 72.3196L30.9375 72.3196"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 66.5969L30.9375 66.5969"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 60.8741L30.9375 60.8741"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 49.4287L30.9375 49.4287"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L32.9375 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(233.969 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-157.41016, -148.44141, -139.83203, -127.07422, -120.84766, -111.06641, -101.28516, -95.058594, -85.425781, -81.011719, -74.542969, -70.128906, -58.878906, -50.558594, -45.488281, -35.042969, -19.730469, -8.4804688, -2.5742188, 6.6289063, 10.964844, 15.378906, 24.582031, 28.917969, 33.332031, 43.589844, 48.136719, 56.746094, 64.425781, 73.371094, 88.027344, 96.636719, 106.31641, 118.57422, 127.18359, 133.55078, 139.91797, 144.46484, 151.50391, " y="-6.890625, ">
|
||||
Sawtooth - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 33 KiB |
@@ -1,332 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M51.2131 270.039L51.2131 46.2813M76.9533 270.039L76.9533 46.2813M102.694 270.039L102.694 46.2813M128.434 270.039L128.434 46.2813M154.174 270.039L154.174 46.2813M179.914 270.039L179.914 46.2813M205.654 270.039L205.654 46.2813M231.395 270.039L231.395 46.2813M257.135 270.039L257.135 46.2813M282.875 270.039L282.875 46.2813M308.615 270.039L308.615 46.2813M334.356 270.039L334.356 46.2813M360.096 270.039L360.096 46.2813M385.836 270.039L385.836 46.2813M411.576 270.039L411.576 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M32.9375 232.283L435 232.283M32.9375 185.956L435 185.956M32.9375 139.629L435 139.629M32.9375 93.3028L435 93.3028M32.9375 46.9762L435 46.9762"/>
|
||||
<clipPath id="cl_a9">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_a9)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M51.2131 233.209L51.2131 233.209L56.3611 231.356L61.5092 233.209L66.6572 231.356L71.8053 233.209L76.9533 232.283L82.1013 232.283L87.2494 219.775L92.3974 235.989L97.5455 235.989L102.694 215.605L107.842 189.199L112.99 176.922L118.138 185.725L123.286 203.097L128.434 209.119L133.582 193.832L138.73 166.962L143.878 149.126L149.026 152.369L154.174 169.51L159.322 180.397L164.47 170.9L169.618 145.42L174.766 123.184L179.914 120.172L185.062 135.228L190.21 150.053L195.358 146.81L200.506 124.11L205.654 98.862L210.803 89.5967L215.951 100.947L221.099 117.856L226.247 120.867L231.395 102.568L236.543 75.9303L241.691 60.8741L246.839 67.1283L251.987 84.7324L257.135 102.337L262.283 247.107L267.431 225.334L272.579 210.046L277.727 214.91L282.875 235.989L288.023 253.593L293.171 251.508L298.319 231.82L303.467 212.594L308.615 211.436L313.763 229.503L318.912 250.119L324.06 254.288L329.208 238.305L334.356 216.763L339.504 209.351L344.652 223.017L349.8 245.254L354.948 255.446L360.096 244.328L365.244 222.091L370.392 209.351L375.54 217.458L380.688 239.232L385.836 254.751L390.984 249.424L396.132 228.345L401.28 210.973L406.428 213.057L411.576 232.978L416.724 252.203"/>
|
||||
<ellipse fill="red" cx="51.213066" cy="233.20937" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="56.361115" cy="231.35629" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="61.509163" cy="233.20937" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="66.657211" cy="231.35629" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="71.805252" cy="233.20937" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="76.953308" cy="232.28282" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="82.101349" cy="232.28282" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="87.249405" cy="219.77463" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="92.397446" cy="235.98895" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="97.545494" cy="235.98895" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="102.69354" cy="215.60522" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="107.84159" cy="189.19904" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="112.98964" cy="176.92245" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="118.13769" cy="185.72452" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="123.28573" cy="203.09702" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="128.43378" cy="209.11949" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="133.58182" cy="193.8317" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="138.72987" cy="166.96222" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="143.87793" cy="149.12646" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="149.02597" cy="152.36932" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="154.17401" cy="169.51019" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="159.32205" cy="180.39696" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="164.47011" cy="170.89999" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="169.61816" cy="145.42032" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="174.7662" cy="123.18352" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="179.91425" cy="120.17229" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="185.0623" cy="135.22845" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="190.21034" cy="150.05298" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="195.3584" cy="146.81012" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="200.50644" cy="124.11006" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="205.6545" cy="98.862015" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="210.80254" cy="89.59668" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="215.95058" cy="100.94672" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="221.09863" cy="117.85596" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="226.24667" cy="120.86719" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="231.39473" cy="102.56815" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="236.54277" cy="75.930313" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="241.69083" cy="60.874146" rx="0.40588379" ry="0.40587997"/>
|
||||
<ellipse fill="red" cx="246.83887" cy="67.12825" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="251.98692" cy="84.732391" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="257.13495" cy="102.33652" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="262.28302" cy="247.10736" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="267.43106" cy="225.33383" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="272.5791" cy="210.04602" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="277.72717" cy="214.91032" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="282.87518" cy="235.98895" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="288.02325" cy="253.59309" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="293.1713" cy="251.50839" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="298.31934" cy="231.81956" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="303.46738" cy="212.59399" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="308.61545" cy="211.43582" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="313.76349" cy="229.50323" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="318.91153" cy="250.11859" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="324.05957" cy="254.28799" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="329.20764" cy="238.3053" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="334.35568" cy="216.7634" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="339.50372" cy="209.35114" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="344.65176" cy="223.01749" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="349.7998" cy="245.2543" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="354.94788" cy="255.44617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="360.09592" cy="244.32776" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="365.24396" cy="222.09096" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="370.392" cy="209.35114" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="375.54004" cy="217.4583" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="380.68811" cy="239.23183" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="385.83615" cy="254.75127" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="390.98419" cy="249.42369" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="396.13223" cy="228.34506" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="401.2803" cy="210.97256" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="406.42834" cy="213.05725" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="411.57639" cy="232.97772" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="416.72443" cy="252.20329" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<clipPath id="cl_aa">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_aa)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M51.2131 232.283L51.2131 232.283L56.3611 232.283L61.5092 232.283L66.6572 232.283L71.8053 232.283L76.9533 232.283L82.1013 232.332L87.2494 232.648L92.3974 231.671L97.5455 226.886L102.694 228.543L107.842 234.054L112.99 224.4L118.138 202.831L123.286 184.923L128.434 182.892L133.582 194.264L138.73 204.381L143.878 199.736L149.026 180.262L154.174 159.637L159.322 152.598L164.47 161.344L169.618 173.545L174.766 173.725L179.914 157.486L185.062 135.49L190.21 123.65L195.358 128.644L200.506 141.673L205.654 146.447L210.803 134.296L215.951 112.197L221.099 96.1651L226.247 96.6561L231.395 108.96L236.543 117.499L241.691 110.149L246.839 89.4207L251.987 70.142L257.135 65.7289L262.283 76.5344L267.431 100.256L272.579 172.639L277.727 227.759L282.875 219.095L288.023 214.402L293.171 226.123L298.319 243.566L303.467 250.578L308.615 240.757L313.763 223.187L318.912 213.987L324.06 221.621L329.208 239.076L334.356 250.268L339.504 244.937L344.652 227.988L349.8 214.92L354.948 217.753L360.096 233.952L365.244 248.586L370.392 248.172L375.54 233.124L380.688 217.326L385.836 215.23L390.984 228.737L396.132 245.558L401.28 250.152L406.428 238.247L411.576 220.884L416.724 213.987"/>
|
||||
<ellipse fill="blue" cx="51.213066" cy="232.28282" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="56.361115" cy="232.28282" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="61.509163" cy="232.28282" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="66.657211" cy="232.28282" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="71.805252" cy="232.28282" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="76.953308" cy="232.28285" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="82.101349" cy="232.33176" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="87.249405" cy="232.64786" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="92.397446" cy="231.67093" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="97.545494" cy="226.88593" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="102.69354" cy="228.54253" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="107.84159" cy="234.05385" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="112.98964" cy="224.40041" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="118.13769" cy="202.83093" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="123.28573" cy="184.92297" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="128.43378" cy="182.89171" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="133.58182" cy="194.26376" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="138.72987" cy="204.38077" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="143.87793" cy="199.73587" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="149.02597" cy="180.26219" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="154.17401" cy="159.63705" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="159.32205" cy="152.59789" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="164.47011" cy="161.34406" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="169.61816" cy="173.54465" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="174.7662" cy="173.72496" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="179.91425" cy="157.48631" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="185.0623" cy="135.49034" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="190.21034" cy="123.65042" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="195.3584" cy="128.64374" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="200.50644" cy="141.67285" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="205.6545" cy="146.44679" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="210.80254" cy="134.29617" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="215.95058" cy="112.19664" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="221.09863" cy="96.165115" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="226.24667" cy="96.656143" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="231.39473" cy="108.96028" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="236.54277" cy="117.49933" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="241.69083" cy="110.14946" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="246.83887" cy="89.420746" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="251.98692" cy="70.141983" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="257.13495" cy="65.728912" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="262.28302" cy="76.534378" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="267.43106" cy="100.25644" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="272.5791" cy="172.6394" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="277.72717" cy="227.75874" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="282.87518" cy="219.09502" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="288.02325" cy="214.40169" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="293.1713" cy="226.12347" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="298.31934" cy="243.56587" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="303.46738" cy="250.57823" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="308.61545" cy="240.75735" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="313.76349" cy="223.18692" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="318.91153" cy="213.98743" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="324.05957" cy="221.62119" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="329.20764" cy="239.07582" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="334.35568" cy="250.26753" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="339.50372" cy="244.93671" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="344.65176" cy="227.98766" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="349.7998" cy="214.91951" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="354.94788" cy="217.75252" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="360.09592" cy="233.95212" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="365.24396" cy="248.586" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="370.392" cy="248.17174" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="375.54004" cy="233.1236" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="380.68811" cy="217.32602" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="385.83615" cy="215.23022" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="390.98419" cy="228.73709" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="396.13223" cy="245.55811" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="401.2803" cy="250.15173" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="406.42834" cy="238.24728" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="411.57639" cy="220.88397" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="416.72443" cy="213.98743" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M51.2131 270.039L51.2131 274.039"/>
|
||||
<text transform="translate(51.2131 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M76.9533 270.039L76.9533 274.039"/>
|
||||
<text transform="translate(76.9533 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.694 270.039L102.694 274.039"/>
|
||||
<text transform="translate(102.694 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M128.434 270.039L128.434 274.039"/>
|
||||
<text transform="translate(128.434 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.174 270.039L154.174 274.039"/>
|
||||
<text transform="translate(154.174 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.914 270.039L179.914 274.039"/>
|
||||
<text transform="translate(179.914 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M205.654 270.039L205.654 274.039"/>
|
||||
<text transform="translate(205.654 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M231.395 270.039L231.395 274.039"/>
|
||||
<text transform="translate(231.395 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M257.135 270.039L257.135 274.039"/>
|
||||
<text transform="translate(257.135 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M282.875 270.039L282.875 274.039"/>
|
||||
<text transform="translate(282.875 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M308.615 270.039L308.615 274.039"/>
|
||||
<text transform="translate(308.615 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M334.356 270.039L334.356 274.039"/>
|
||||
<text transform="translate(334.356 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.096 270.039L360.096 274.039"/>
|
||||
<text transform="translate(360.096 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M385.836 270.039L385.836 274.039"/>
|
||||
<text transform="translate(385.836 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.576 270.039L411.576 274.039"/>
|
||||
<text transform="translate(411.576 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.7689 270.039L35.7689 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.917 270.039L40.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M46.065 270.039L46.065 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M56.3611 270.039L56.3611 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M61.5092 270.039L61.5092 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M66.6572 270.039L66.6572 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M71.8053 270.039L71.8053 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M82.1013 270.039L82.1013 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M87.2494 270.039L87.2494 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M92.3974 270.039L92.3974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M97.5455 270.039L97.5455 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M107.842 270.039L107.842 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M112.99 270.039L112.99 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.138 270.039L118.138 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.286 270.039L123.286 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M133.582 270.039L133.582 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M138.73 270.039L138.73 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M143.878 270.039L143.878 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.026 270.039L149.026 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.322 270.039L159.322 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.47 270.039L164.47 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.618 270.039L169.618 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.766 270.039L174.766 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M185.062 270.039L185.062 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M190.21 270.039L190.21 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M195.358 270.039L195.358 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M200.506 270.039L200.506 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M210.803 270.039L210.803 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M215.951 270.039L215.951 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M221.099 270.039L221.099 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M226.247 270.039L226.247 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M236.543 270.039L236.543 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M241.691 270.039L241.691 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M246.839 270.039L246.839 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M251.987 270.039L251.987 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M262.283 270.039L262.283 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M267.431 270.039L267.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M272.579 270.039L272.579 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M277.727 270.039L277.727 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.023 270.039L288.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M293.171 270.039L293.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M298.319 270.039L298.319 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M303.467 270.039L303.467 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M313.763 270.039L313.763 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M318.912 270.039L318.912 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.06 270.039L324.06 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.208 270.039L329.208 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M339.504 270.039L339.504 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M344.652 270.039L344.652 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M349.8 270.039L349.8 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M354.948 270.039L354.948 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.244 270.039L365.244 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.392 270.039L370.392 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.54 270.039L375.54 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M380.688 270.039L380.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M390.984 270.039L390.984 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.132 270.039L396.132 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.28 270.039L401.28 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.428 270.039L406.428 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.724 270.039L416.724 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.872 270.039L421.872 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.021 270.039L427.021 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.169 270.039L432.169 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 232.283L28.9375 232.283"/>
|
||||
<text transform="translate(23.9375 232.283)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 185.956L28.9375 185.956"/>
|
||||
<text transform="translate(23.9375 185.956)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 139.629L28.9375 139.629"/>
|
||||
<text transform="translate(23.9375 139.629)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 93.3028L28.9375 93.3028"/>
|
||||
<text transform="translate(23.9375 93.3028)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.9762L28.9375 46.9762"/>
|
||||
<text transform="translate(23.9375 46.9762)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 269.344L30.9375 269.344"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 260.079L30.9375 260.079"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 250.813L30.9375 250.813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 241.548L30.9375 241.548"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 223.017L30.9375 223.017"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 213.752L30.9375 213.752"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 204.487L30.9375 204.487"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 195.221L30.9375 195.221"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 176.691L30.9375 176.691"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 167.425L30.9375 167.425"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 158.16L30.9375 158.16"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 148.895L30.9375 148.895"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 130.364L30.9375 130.364"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 121.099L30.9375 121.099"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 111.833L30.9375 111.833"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 102.568L30.9375 102.568"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 84.0375L30.9375 84.0375"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 74.7722L30.9375 74.7722"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 65.5068L30.9375 65.5068"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 56.2415L30.9375 56.2415"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L32.9375 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(233.969 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-167.69922, -158.73047, -150.12109, -137.36328, -131.13672, -121.35547, -111.57422, -105.34766, -95.714844, -83.457031, -75.136719, -70.722656, -64.253906, -59.839844, -48.589844, -40.269531, -35.199219, -24.753906, -9.4414063, 1.8085938, 7.7148438, 16.917969, 21.253906, 25.667969, 34.871094, 39.207031, 43.621094, 53.878906, 58.425781, 67.035156, 74.714844, 83.660156, 98.316406, 106.92578, 116.60547, 128.86328, 137.47266, 143.83984, 150.20703, 154.75391, 161.79297, " y="-6.890625, ">
|
||||
SawtoothHF - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_7f">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_7f)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 158.16L58.2771 158.16L63.3304 157.187L68.3837 158.16L73.437 157.187L78.4902 158.16L83.5435 157.187L88.5968 120.219L93.6501 103.68L98.7034 88.1142L103.757 76.4399L108.81 67.6842L113.863 61.847L118.917 60.8741L123.97 63.7927L129.023 69.6299L134.076 79.3585L139.13 92.0057L144.183 107.571L149.236 126.056L154.29 144.54L159.343 163.997L164.396 183.455L169.45 200.966L174.503 217.505L179.556 232.098L184.609 242.799L189.663 250.582L194.716 254.473L199.769 255.446L204.823 251.555L209.876 243.772L214.929 233.07L219.982 219.45L225.036 202.912L230.089 185.4L235.142 165.943L240.196 146.486L245.249 128.001L250.302 110.49L255.355 93.9514L260.409 81.3042L265.462 70.6028L270.515 63.7927L275.569 60.8741L280.622 61.847L285.675 66.7113L290.729 75.4671L295.782 87.1414L300.835 101.734L305.888 118.273L310.942 136.757L315.995 156.214L321.048 174.699L326.102 194.156L331.155 210.695L336.208 226.26L341.261 238.908L346.315 247.663L351.368 253.5L356.421 255.446L361.475 253.5L366.528 247.663L371.581 237.935L376.634 225.288L381.688 210.695L386.741 193.183L391.794 174.699L396.848 155.242L401.901 135.784L406.954 117.3L412.008 100.761L417.061 86.1685"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="157.18729" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="120.21861" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="103.67999" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="88.114227" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="76.439911" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="108.81" cy="67.684174" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="61.847015" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="60.874146" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="63.792725" rx="0.4021225" ry="0.4021244"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="69.629898" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="79.35849" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="92.005676" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="107.57143" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="126.05577" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="144.54012" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="163.99731" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="183.45453" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="200.966" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="217.50462" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="232.09752" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="242.79898" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="251.55472" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="243.77184" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="219.45035" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="202.91171" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="185.40024" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="165.94304" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="146.48584" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="128.0015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="110.49002" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="93.951385" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="81.304214" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="70.602753" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="63.792725" rx="0.40213013" ry="0.4021244"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="66.711304" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="75.467056" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="101.73427" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="118.27289" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="136.75723" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="156.21445" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="174.69878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="194.15598" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="210.6946" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="226.26036" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="238.90755" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="247.66328" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="247.66328" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="237.93468" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="225.28751" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="210.6946" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="193.18312" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="174.69878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="155.24158" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="135.78438" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="117.30003" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="100.76141" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="86.168518" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<clipPath id="cl_80">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_80)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 157.674L58.2771 157.674L63.3304 157.674L68.3837 157.674L73.437 157.674L78.4902 157.674L83.5435 157.674L88.5968 157.673L93.6501 155.668L98.7034 137.88L103.757 113.081L108.81 96.155L113.863 82.6374L118.917 72.371L123.97 65.1774L129.023 61.8238L134.076 62.6938L139.13 67.0717L144.183 74.8545L149.236 85.991L154.29 100.097L159.343 116.968L164.396 135.349L169.45 154.32L174.503 173.623L179.556 192.056L184.609 209.081L189.663 224.492L194.716 237.088L199.769 246.33L204.823 252.167L209.876 254.548L214.929 253.037L219.982 247.303L225.036 238.112L230.089 225.952L235.142 210.975L240.196 194.002L245.249 175.569L250.302 156.266L255.355 137.347L260.409 119.349L265.462 102.478L270.515 87.9367L275.569 76.2624L280.622 67.6095L285.675 62.7453L290.729 61.7724L295.782 64.691L300.835 71.4495L305.888 81.6131L310.942 94.6952L315.995 110.21L321.048 127.669L326.102 146.486L331.155 165.457L336.208 184.324L341.261 202.219L346.315 218.271L351.368 232.224L356.421 242.925L361.475 250.221L366.528 254.061L371.581 254.061L376.634 250.17L381.688 242.439L386.741 231.354L391.794 217.734L396.848 201.733L401.901 183.838L406.954 164.919L412.008 145.564L417.061 126.697"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="157.67374" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="157.67374" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="157.67374" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="157.67276" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="155.66754" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="137.87965" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="113.08051" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="96.154984" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="82.63736" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="72.370987" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="65.177399" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="61.823822" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="62.693848" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="67.071671" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="74.854523" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="85.990982" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="100.09735" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="116.96806" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="135.34947" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="154.32013" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="173.62302" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="192.05585" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="209.0808" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="224.49225" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="237.08792" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="246.33006" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="252.16721" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="254.5479" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="253.0372" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="247.3029" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="238.11221" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="225.95154" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="210.97508" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="194.00154" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="175.56873" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="156.26587" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="137.3466" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="119.34879" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="102.47806" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="87.936661" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="76.262405" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="67.609528" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="62.74527" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="61.772415" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="64.690979" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="71.449539" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="81.613083" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="94.695221" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="110.2095" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="127.66945" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="146.4859" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="165.45656" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="184.32442" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="202.21942" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="218.27148" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="232.22366" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="242.92505" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="250.22148" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="254.06149" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="254.06146" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="250.17004" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="242.43864" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="231.35364" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="217.73367" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="201.73297" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="183.83797" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="164.91873" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="145.56445" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="126.69662" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-137.34375, -128.375, -123.82813, -114.14844, -105.49219, -101.07813, -94.609375, -90.195313, -78.945313, -70.625, -65.554688, -55.109375, -39.796875, -28.546875, -22.640625, -13.4375, -9.1015625, -4.6875, 4.515625, 8.8515625, 13.265625, 23.523438, 28.070313, 36.679688, 44.359375, 53.304688, 67.960938, 76.570313, 86.25, 98.507813, 107.11719, 113.48438, 119.85156, 124.39844, 131.4375, " y="-6.890625, ">
|
||||
Sine - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,346 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 264.905L435 264.905M40.3379 231.125L435 231.125M40.3379 197.345L435 197.345M40.3379 163.565L435 163.565M40.3379 129.785L435 129.785M40.3379 96.0052L435 96.0052M40.3379 62.2253L435 62.2253"/>
|
||||
<clipPath id="cl_af">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_af)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 177.077L58.2771 177.077L63.3304 150.053L68.3837 177.077L73.437 150.053L78.4902 177.077L83.5435 163.565L88.5968 163.565L93.6501 123.705L98.7034 107.49L103.757 113.571L108.81 129.785L113.863 102.086L118.917 71.6837L123.97 100.734L129.023 104.788L134.076 123.029L139.13 137.892L144.183 110.868L149.236 127.758L154.29 135.19L159.343 154.107L164.396 162.889L169.45 193.967L174.503 211.532L179.556 230.449L184.609 231.125L189.663 255.446L194.716 245.988L199.769 235.854L204.823 242.61L209.876 201.398L214.929 227.747L219.982 238.556L225.036 174.374L230.089 151.404L235.142 182.482L240.196 120.327L245.249 197.345L250.302 147.351L255.355 133.163L260.409 118.3L265.462 114.922L270.515 85.8712L275.569 60.8741L280.622 77.0885L285.675 70.3325L290.729 93.9784L295.782 195.318L300.835 98.7076L305.888 119.651L310.942 144.648L315.995 143.297L321.048 152.08L326.102 168.294L331.155 208.83L336.208 198.02L341.261 253.419L346.315 185.86L351.368 254.095L356.421 216.262L361.475 245.312L366.528 209.506L371.581 192.616L376.634 201.398L381.688 222.342L386.741 226.395L391.794 190.589L396.848 128.434L401.901 156.809L406.954 83.8445L412.008 83.8445L417.061 72.3593"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="177.07687" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="150.05298" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="177.07687" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="150.05298" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="177.07687" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="163.56494" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="163.56494" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="123.7047" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="107.49036" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="113.57074" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="108.81" cy="129.78506" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="102.08559" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="71.683701" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="100.73439" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="104.78798" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="123.0291" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="137.89224" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="110.86835" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="127.75829" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="135.18985" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="154.10657" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="162.88934" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="193.96681" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="211.53235" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="230.44907" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="231.12466" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="245.98779" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="235.85384" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="242.60982" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="201.39838" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="227.74667" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="238.55623" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="174.37448" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="151.40417" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="182.48166" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="120.32671" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="197.34479" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="147.3506" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="133.16306" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="118.29991" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="114.92194" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="85.871246" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="77.088486" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="70.33252" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="93.978424" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="195.31801" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="98.707596" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="119.65111" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="144.64821" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="143.29703" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="152.07977" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="168.29411" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="208.82996" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="198.02039" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="253.41937" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="185.85965" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="254.09497" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="216.26152" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="245.31219" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="209.50555" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="192.61562" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="201.39838" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="222.34189" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="226.39548" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="190.58882" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="128.43388" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="156.80896" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="83.844452" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="83.844452" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="72.359299" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<clipPath id="cl_b0">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_b0)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 163.565L58.2771 163.565L63.3304 163.565L68.3837 163.565L73.437 163.565L78.4902 163.565L83.5435 163.565L88.5968 164.279L93.6501 168.892L98.7034 162.171L103.757 142.778L108.81 118.027L113.863 112.245L118.917 119.892L123.97 113.472L129.023 89.8844L134.076 88.0317L139.13 102.191L144.183 114.479L149.236 128.068L154.29 124.487L159.343 121.135L164.396 131.582L169.45 144.72L174.503 159.141L179.556 178.892L184.609 202.106L189.663 220.098L194.716 231.072L199.769 242.749L204.823 248.896L209.876 241.776L214.929 237.59L219.982 223.04L225.036 217.321L230.089 228.366L235.142 204.68L240.196 167.923L245.249 164.875L250.302 153.832L255.355 159.477L260.409 167.527L265.462 142.112L270.515 126.303L275.569 115.861L280.622 99.2545L285.675 75.7656L290.729 69.947L295.782 74.1066L300.835 87.8671L305.888 138.292L310.942 142.763L315.995 115.606L321.048 130.974L326.102 143.115L331.155 148.617L336.208 161.865L341.261 187.135L346.315 204.209L351.368 222.72L356.421 220.317L361.475 221.548L366.528 233.108L371.581 230.892L376.634 224.981L381.688 203.418L386.741 199.008L391.794 211.62L396.848 221.367L401.901 204.992L406.954 162.902L412.008 142.051L417.061 118.828"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="163.56494" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="163.56494" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="163.56494" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="163.56494" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="163.56494" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="163.56528" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="164.27856" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="168.89197" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="162.17093" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="142.77814" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="118.0266" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="112.24521" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="119.89177" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="113.47153" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="89.884445" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="88.031708" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="102.19087" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="114.47858" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="128.06805" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="124.48717" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="121.1349" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="131.58211" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="144.72" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="159.14108" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="178.89238" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="202.10649" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="220.09764" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="231.0719" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="242.74895" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="248.89565" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="241.77634" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="237.58981" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="223.04037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="217.32083" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="228.36603" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="204.6797" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="167.9234" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="164.87497" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="153.83215" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="159.47749" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="167.52728" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="142.112" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="126.30347" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="115.86063" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="99.254471" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="75.765564" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="69.94696" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="74.106552" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="87.867111" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="138.29153" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="142.7627" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="115.60556" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="130.97371" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="143.11533" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="148.6174" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="161.86534" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="187.13458" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="204.2088" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="222.72047" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="220.31741" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="221.54813" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="233.10754" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="230.89186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="224.98138" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="203.4176" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="199.00807" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="211.61966" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="221.36679" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="204.99222" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="162.90239" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="142.05087" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="118.82794" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 264.905L36.3379 264.905"/>
|
||||
<text transform="translate(31.3379 264.905)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-1.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 231.125L36.3379 231.125"/>
|
||||
<text transform="translate(31.3379 231.125)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.345L36.3379 197.345"/>
|
||||
<text transform="translate(31.3379 197.345)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 163.565L36.3379 163.565"/>
|
||||
<text transform="translate(31.3379 163.565)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 129.785L36.3379 129.785"/>
|
||||
<text transform="translate(31.3379 129.785)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 96.0052L36.3379 96.0052"/>
|
||||
<text transform="translate(31.3379 96.0052)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 62.2253L36.3379 62.2253"/>
|
||||
<text transform="translate(31.3379 62.2253)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
1.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 258.149L38.3379 258.149"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 251.393L38.3379 251.393"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 244.637L38.3379 244.637"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 237.881L38.3379 237.881"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 224.369L38.3379 224.369"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 217.613L38.3379 217.613"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 210.857L38.3379 210.857"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 204.101L38.3379 204.101"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 190.589L38.3379 190.589"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 183.833L38.3379 183.833"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.077L38.3379 177.077"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 170.321L38.3379 170.321"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 156.809L38.3379 156.809"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 150.053L38.3379 150.053"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 143.297L38.3379 143.297"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 136.541L38.3379 136.541"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 123.029L38.3379 123.029"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 116.273L38.3379 116.273"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L38.3379 109.517"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 102.761L38.3379 102.761"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 89.2492L38.3379 89.2492"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 82.4933L38.3379 82.4933"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 75.7373L38.3379 75.7373"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 68.9813L38.3379 68.9813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 55.4694L38.3379 55.4694"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 48.7134L38.3379 48.7134"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-143.03125, -134.0625, -129.51563, -119.83594, -111.17969, -99.804688, -95.390625, -88.921875, -84.507813, -73.257813, -64.9375, -59.867188, -49.421875, -34.109375, -22.859375, -16.953125, -7.75, -3.4140625, 1, 10.203125, 14.539063, 18.953125, 29.210938, 33.757813, 42.367188, 50.046875, 58.992188, 73.648438, 82.257813, 91.9375, 104.19531, 112.80469, 119.17188, 125.53906, 130.08594, 137.125, " y="-6.890625, ">
|
||||
SineG - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 32 KiB |
@@ -1,338 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M53.6964 270.039L53.6964 46.2813M79.2701 270.039L79.2701 46.2813M104.844 270.039L104.844 46.2813M130.417 270.039L130.417 46.2813M155.991 270.039L155.991 46.2813M181.565 270.039L181.565 46.2813M207.138 270.039L207.138 46.2813M232.712 270.039L232.712 46.2813M258.286 270.039L258.286 46.2813M283.86 270.039L283.86 46.2813M309.433 270.039L309.433 46.2813M335.007 270.039L335.007 46.2813M360.581 270.039L360.581 46.2813M386.154 270.039L386.154 46.2813M411.728 270.039L411.728 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M35.5391 255.446L435 255.446M35.5391 216.532L435 216.532M35.5391 177.617L435 177.617M35.5391 138.703L435 138.703M35.5391 99.7886L435 99.7886M35.5391 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_67">
|
||||
<rect x="35.539063" y="46.28125" width="399.46094" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_67)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M53.6964 255.446L53.6964 255.446L58.8111 253.5L63.9258 255.446L69.0406 253.5L74.1553 255.446L79.2701 253.5L84.3848 255.446L89.4995 255.446L94.6143 255.446L99.729 255.446L104.844 255.446L109.958 255.446L115.073 255.446L120.188 255.446L125.303 255.446L130.417 255.446L135.532 255.446L140.647 255.446L145.762 255.446L150.876 255.446L155.991 255.446L161.106 255.446L166.221 255.446L171.335 255.446L176.45 255.446L181.565 255.446L186.68 255.446L191.794 255.446L196.909 255.446L202.024 255.446L207.138 255.446L212.253 255.446L217.368 255.446L222.483 255.446L227.597 255.446L232.712 255.446L237.827 255.446L242.942 255.446L248.056 255.446L253.171 60.8741L258.286 255.446L263.401 255.446L268.515 255.446L273.63 255.446L278.745 255.446L283.86 255.446L288.974 255.446L294.089 255.446L299.204 255.446L304.318 255.446L309.433 255.446L314.548 255.446L319.663 255.446L324.777 255.446L329.892 255.446L335.007 255.446L340.122 255.446L345.236 255.446L350.351 255.446L355.466 255.446L360.581 255.446L365.695 255.446L370.81 255.446L375.925 255.446L381.04 255.446L386.154 255.446L391.269 255.446L396.384 255.446L401.498 255.446L406.613 255.446L411.728 255.446L416.843 255.446"/>
|
||||
<ellipse fill="red" cx="53.696381" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="58.811115" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="63.92585" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="69.040588" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="74.155319" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="79.270065" cy="253.50044" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="84.384796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="89.499535" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="94.614273" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="99.729012" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="104.84374" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="109.95848" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="115.07322" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="120.18796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="125.30269" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="130.41742" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="135.53217" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="140.64691" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="145.76164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="150.87637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="155.99112" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="161.10585" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="166.22058" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="171.33533" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="176.45006" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="181.56479" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="186.67953" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="191.79427" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="196.90901" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="202.02374" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="207.13847" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="212.25322" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="217.36795" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="222.4827" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="227.59743" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="232.71216" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="237.8269" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="242.94164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="248.05637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="253.17111" cy="60.874146" rx="0.40455627" ry="0.4045639"/>
|
||||
<ellipse fill="red" cx="258.28583" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="263.40057" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="268.51532" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="273.63007" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="278.74481" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="283.85953" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="288.97427" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="294.08899" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="299.20374" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="304.31848" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="309.43323" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="314.54794" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="319.66269" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="324.77744" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="329.89215" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="335.0069" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="340.12164" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="345.23636" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="350.3511" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="355.46585" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="360.58057" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="365.69531" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="370.81006" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="375.9248" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="381.03952" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="386.15427" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="391.26901" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="396.38373" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="401.49847" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="406.61322" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="411.72794" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="red" cx="416.84268" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
</g>
|
||||
<clipPath id="cl_68">
|
||||
<rect x="35.539063" y="46.28125" width="399.46094" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_68)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M53.6964 254.473L53.6964 254.473L58.8111 254.473L63.9258 254.473L69.0406 254.473L74.1553 254.473L79.2701 254.473L84.3848 254.473L89.4995 254.473L94.6143 254.576L99.729 255.343L104.844 255.446L109.958 255.446L115.073 255.446L120.188 255.446L125.303 255.446L130.417 255.446L135.532 255.446L140.647 255.446L145.762 255.446L150.876 255.446L155.991 255.446L161.106 255.446L166.221 255.446L171.335 255.446L176.45 255.446L181.565 255.446L186.68 255.446L191.794 255.446L196.909 255.446L202.024 255.446L207.138 255.446L212.253 255.446L217.368 255.446L222.483 255.446L227.597 255.446L232.712 255.446L237.827 255.446L242.942 255.446L248.056 255.446L253.171 255.441L258.286 245.165L263.401 168.446L268.515 168.446L273.63 245.165L278.745 255.441L283.86 255.446L288.974 255.446L294.089 255.446L299.204 255.446L304.318 255.446L309.433 255.446L314.548 255.446L319.663 255.446L324.777 255.446L329.892 255.446L335.007 255.446L340.122 255.446L345.236 255.446L350.351 255.446L355.466 255.446L360.581 255.446L365.695 255.446L370.81 255.446L375.925 255.446L381.04 255.446L386.154 255.446L391.269 255.446L396.384 255.446L401.498 255.446L406.613 255.446L411.728 255.446L416.843 255.446"/>
|
||||
<ellipse fill="blue" cx="53.696381" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="58.811115" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="63.92585" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="69.040588" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="74.155319" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="79.270065" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="84.384796" cy="254.4733" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="89.499535" cy="254.47336" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="94.614273" cy="254.57611" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="99.729012" cy="255.34335" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="104.84374" cy="255.44611" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="109.95848" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="115.07322" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="120.18796" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="125.30269" cy="255.44617" rx="0.4045639" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="130.41742" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="135.53217" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="140.64691" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="145.76164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="150.87637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="155.99112" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="161.10585" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="166.22058" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="171.33533" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="176.45006" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="181.56479" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="186.67953" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="191.79427" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="196.90901" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="202.02374" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="207.13847" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="212.25322" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="217.36795" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="222.4827" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="227.59743" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="232.71216" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="237.8269" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="242.94164" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="248.05637" cy="255.44617" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="253.17111" cy="255.44125" rx="0.40455627" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="258.28583" cy="245.16499" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="263.40057" cy="168.44623" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="268.51532" cy="168.44623" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="273.63007" cy="245.16499" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="278.74481" cy="255.44125" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="283.85953" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="288.97427" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="294.08899" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="299.20374" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="304.31848" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="309.43323" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="314.54794" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="319.66269" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="324.77744" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="329.89215" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="335.0069" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="340.12164" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="345.23636" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="350.3511" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="355.46585" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="360.58057" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="365.69531" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="370.81006" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="375.9248" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="381.03952" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="386.15427" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="391.26901" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="396.38373" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="401.49847" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="406.61322" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="411.72794" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
<ellipse fill="blue" cx="416.84268" cy="255.44617" rx="0.40457153" ry="0.40455627"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.6964 270.039L53.6964 274.039"/>
|
||||
<text transform="translate(53.6964 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M79.2701 270.039L79.2701 274.039"/>
|
||||
<text transform="translate(79.2701 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M104.844 270.039L104.844 274.039"/>
|
||||
<text transform="translate(104.844 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M130.417 270.039L130.417 274.039"/>
|
||||
<text transform="translate(130.417 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M155.991 270.039L155.991 274.039"/>
|
||||
<text transform="translate(155.991 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M181.565 270.039L181.565 274.039"/>
|
||||
<text transform="translate(181.565 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M207.138 270.039L207.138 274.039"/>
|
||||
<text transform="translate(207.138 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M232.712 270.039L232.712 274.039"/>
|
||||
<text transform="translate(232.712 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M258.286 270.039L258.286 274.039"/>
|
||||
<text transform="translate(258.286 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M283.86 270.039L283.86 274.039"/>
|
||||
<text transform="translate(283.86 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M309.433 270.039L309.433 274.039"/>
|
||||
<text transform="translate(309.433 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M335.007 270.039L335.007 274.039"/>
|
||||
<text transform="translate(335.007 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.581 270.039L360.581 274.039"/>
|
||||
<text transform="translate(360.581 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.154 270.039L386.154 274.039"/>
|
||||
<text transform="translate(386.154 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.728 270.039L411.728 274.039"/>
|
||||
<text transform="translate(411.728 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M38.3522 270.039L38.3522 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.4669 270.039L43.4669 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.5816 270.039L48.5816 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.8111 270.039L58.8111 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.9258 270.039L63.9258 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M69.0406 270.039L69.0406 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M74.1553 270.039L74.1553 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M84.3848 270.039L84.3848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M89.4995 270.039L89.4995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M94.6143 270.039L94.6143 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M99.729 270.039L99.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M109.958 270.039L109.958 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M115.073 270.039L115.073 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M120.188 270.039L120.188 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M125.303 270.039L125.303 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M135.532 270.039L135.532 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M140.647 270.039L140.647 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M145.762 270.039L145.762 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M150.876 270.039L150.876 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M161.106 270.039L161.106 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M166.221 270.039L166.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M171.335 270.039L171.335 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M176.45 270.039L176.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M186.68 270.039L186.68 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M191.794 270.039L191.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M196.909 270.039L196.909 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M202.024 270.039L202.024 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M212.253 270.039L212.253 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M217.368 270.039L217.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M222.483 270.039L222.483 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M227.597 270.039L227.597 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M237.827 270.039L237.827 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M242.942 270.039L242.942 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M248.056 270.039L248.056 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M253.171 270.039L253.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M263.401 270.039L263.401 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M268.515 270.039L268.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M273.63 270.039L273.63 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M278.745 270.039L278.745 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.974 270.039L288.974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M294.089 270.039L294.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M299.204 270.039L299.204 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M304.318 270.039L304.318 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M314.548 270.039L314.548 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M319.663 270.039L319.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.777 270.039L324.777 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.892 270.039L329.892 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M340.122 270.039L340.122 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M345.236 270.039L345.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M350.351 270.039L350.351 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M355.466 270.039L355.466 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.695 270.039L365.695 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.81 270.039L370.81 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.925 270.039L375.925 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.04 270.039L381.04 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.269 270.039L391.269 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.384 270.039L396.384 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.498 270.039L401.498 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.613 270.039L406.613 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.843 270.039L416.843 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.957 270.039L421.957 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.072 270.039L427.072 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.187 270.039L432.187 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 255.446L31.5391 255.446"/>
|
||||
<text transform="translate(26.5391 255.446)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 216.532L31.5391 216.532"/>
|
||||
<text transform="translate(26.5391 216.532)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.2
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 177.617L31.5391 177.617"/>
|
||||
<text transform="translate(26.5391 177.617)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.4
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 138.703L31.5391 138.703"/>
|
||||
<text transform="translate(26.5391 138.703)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.6
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 99.7886L31.5391 99.7886"/>
|
||||
<text transform="translate(26.5391 99.7886)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.8
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 60.8741L31.5391 60.8741"/>
|
||||
<text transform="translate(26.5391 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 263.229L33.5391 263.229"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 247.663L33.5391 247.663"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 239.88L33.5391 239.88"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 232.098L33.5391 232.098"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 224.315L33.5391 224.315"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 208.749L33.5391 208.749"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 200.966L33.5391 200.966"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 193.183L33.5391 193.183"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 185.4L33.5391 185.4"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 169.834L33.5391 169.834"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 162.052L33.5391 162.052"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 154.269L33.5391 154.269"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 146.486L33.5391 146.486"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 130.92L33.5391 130.92"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 123.137L33.5391 123.137"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 115.354L33.5391 115.354"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 107.571L33.5391 107.571"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 92.0057L33.5391 92.0057"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 84.2228L33.5391 84.2228"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 76.4399L33.5391 76.4399"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 68.657L33.5391 68.657"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 53.0913L33.5391 53.0913"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.5391 270.039L35.5391 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(235.27 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-141.9375, -132.96875, -123.04688, -118.5, -109.55469, -100.89844, -96.484375, -90.015625, -85.601563, -74.351563, -66.03125, -60.960938, -50.515625, -35.203125, -23.953125, -18.046875, -8.84375, -4.5078125, -0.09375, 9.109375, 13.445313, 17.859375, 28.117188, 32.664063, 41.273438, 48.953125, 57.898438, 72.554688, 81.164063, 90.84375, 103.10156, 111.71094, 118.07813, 124.44531, 128.99219, 136.03125, " y="-6.890625, ">
|
||||
Spike - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,355 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M51.2131 270.039L51.2131 46.2813M76.9533 270.039L76.9533 46.2813M102.694 270.039L102.694 46.2813M128.434 270.039L128.434 46.2813M154.174 270.039L154.174 46.2813M179.914 270.039L179.914 46.2813M205.654 270.039L205.654 46.2813M231.395 270.039L231.395 46.2813M257.135 270.039L257.135 46.2813M282.875 270.039L282.875 46.2813M308.615 270.039L308.615 46.2813M334.356 270.039L334.356 46.2813M360.096 270.039L360.096 46.2813M385.836 270.039L385.836 46.2813M411.576 270.039L411.576 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M32.9375 255.446L435 255.446M32.9375 226.833L435 226.833M32.9375 198.219L435 198.219M32.9375 169.606L435 169.606M32.9375 140.992L435 140.992M32.9375 112.379L435 112.379M32.9375 83.765L435 83.765M32.9375 55.1514L435 55.1514"/>
|
||||
<clipPath id="cl_73">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_73)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M51.2131 255.446L51.2131 255.446L56.3611 255.389L61.5092 255.446L66.6572 255.389L71.8053 255.446L76.9533 255.389L82.1013 249.723L87.2494 244.001L92.3974 238.278L97.5455 232.555L102.694 226.833L107.842 221.11L112.99 215.387L118.138 209.665L123.286 203.942L128.434 198.219L133.582 192.496L138.73 186.774L143.878 181.051L149.026 175.328L154.174 169.606L159.322 163.883L164.47 158.16L169.618 152.437L174.766 146.715L179.914 140.992L185.062 135.269L190.21 129.547L195.358 123.824L200.506 118.101L205.654 112.379L210.803 106.656L215.951 100.933L221.099 95.2104L226.247 89.4877L231.395 83.765L236.543 78.0423L241.691 72.3196L246.839 66.5969L251.987 60.8741L257.135 66.5969L262.283 72.3196L267.431 78.0423L272.579 83.765L277.727 89.4877L282.875 95.2104L288.023 100.933L293.171 106.656L298.319 112.379L303.467 118.101L308.615 123.824L313.763 129.547L318.912 135.269L324.06 140.992L329.208 146.715L334.356 152.437L339.504 158.16L344.652 163.883L349.8 169.606L354.948 175.328L360.096 181.051L365.244 186.774L370.392 192.496L375.54 198.219L380.688 203.942L385.836 209.665L390.984 215.387L396.132 221.11L401.28 226.833L406.428 232.555L411.576 238.278L416.724 244.001"/>
|
||||
<ellipse fill="red" cx="51.213066" cy="255.44617" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="56.361115" cy="255.38893" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="61.509163" cy="255.44617" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="66.657211" cy="255.38893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="71.805252" cy="255.44617" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="76.953308" cy="255.38893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="82.101349" cy="249.72345" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="87.249405" cy="244.00075" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="92.397446" cy="238.27805" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="97.545494" cy="232.55533" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="102.69354" cy="226.83263" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="107.84159" cy="221.10992" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="112.98964" cy="215.38722" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="118.13769" cy="209.66452" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="123.28573" cy="203.9418" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="128.43378" cy="198.2191" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="133.58182" cy="192.4964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="138.72987" cy="186.77368" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="143.87793" cy="181.05098" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="149.02597" cy="175.32828" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="154.17401" cy="169.60556" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="159.32205" cy="163.88287" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="164.47011" cy="158.16016" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="169.61816" cy="152.43744" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="174.7662" cy="146.71475" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="179.91425" cy="140.99203" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="185.0623" cy="135.26933" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="190.21034" cy="129.54663" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="195.3584" cy="123.82391" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="200.50644" cy="118.10121" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="205.6545" cy="112.37851" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="210.80254" cy="106.65581" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="215.95058" cy="100.93309" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="221.09863" cy="95.210388" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="226.24667" cy="89.487686" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="231.39473" cy="83.764969" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="236.54277" cy="78.042267" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="241.69083" cy="72.319565" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="246.83887" cy="66.596863" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="251.98692" cy="60.874146" rx="0.40588379" ry="0.40587997"/>
|
||||
<ellipse fill="red" cx="257.13495" cy="66.596863" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="262.28302" cy="72.319565" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="267.43106" cy="78.042267" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="272.5791" cy="83.764969" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="277.72717" cy="89.487686" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="282.87518" cy="95.210388" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="288.02325" cy="100.93309" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="293.1713" cy="106.65581" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="298.31934" cy="112.37851" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="303.46738" cy="118.10121" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="308.61545" cy="123.82391" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="red" cx="313.76349" cy="129.54663" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="318.91153" cy="135.26933" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="324.05957" cy="140.99203" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="329.20764" cy="146.71475" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="334.35568" cy="152.43744" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="339.50372" cy="158.16016" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="344.65176" cy="163.88287" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="349.7998" cy="169.60556" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="354.94788" cy="175.32828" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="360.09592" cy="181.05098" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="365.24396" cy="186.77368" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="370.392" cy="192.4964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="375.54004" cy="198.2191" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="380.68811" cy="203.9418" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="385.83615" cy="209.66452" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="390.98419" cy="215.38722" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="396.13223" cy="221.10992" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="401.2803" cy="226.83263" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="406.42834" cy="232.55533" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="411.57639" cy="238.27805" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="red" cx="416.72443" cy="244.00075" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<clipPath id="cl_74">
|
||||
<rect x="32.9375" y="46.28125" width="402.0625" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_74)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M51.2131 255.418L51.2131 255.418L56.3611 255.418L61.5092 255.418L66.6572 255.418L71.8053 255.418L76.9533 255.418L82.1013 255.417L87.2494 255.115L92.3974 252.257L97.5455 246.859L102.694 241.139L107.842 235.417L112.99 229.694L118.138 223.971L123.286 218.249L128.434 212.526L133.582 206.803L138.73 201.08L143.878 195.358L149.026 189.635L154.174 183.912L159.322 178.19L164.47 172.467L169.618 166.744L174.766 161.022L179.914 155.299L185.062 149.576L190.21 143.853L195.358 138.131L200.506 132.408L205.654 126.685L210.803 120.963L215.951 115.24L221.099 109.517L226.247 103.794L231.395 98.0717L236.543 92.349L241.691 86.6263L246.839 80.9036L251.987 75.1809L257.135 69.4585L262.283 64.3409L267.431 64.3409L272.579 69.4585L277.727 75.1809L282.875 80.9036L288.023 86.6263L293.171 92.349L298.319 98.0717L303.467 103.794L308.615 109.517L313.763 115.24L318.912 120.963L324.06 126.685L329.208 132.408L334.356 138.131L339.504 143.853L344.652 149.576L349.8 155.299L354.948 161.022L360.096 166.744L365.244 172.467L370.392 178.19L375.54 183.912L380.688 189.635L385.836 195.358L390.984 201.08L396.132 206.803L401.28 212.526L406.428 218.249L411.576 223.971L416.724 229.694"/>
|
||||
<ellipse fill="blue" cx="51.213066" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="56.361115" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="61.509163" cy="255.41754" rx="0.40587997" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="66.657211" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="71.805252" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="76.953308" cy="255.41754" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="82.101349" cy="255.4174" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="87.249405" cy="255.11487" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="92.397446" cy="252.25655" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="97.545494" cy="246.85893" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="102.69354" cy="241.13939" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="107.84159" cy="235.41669" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="112.98964" cy="229.69398" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="118.13769" cy="223.97128" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="123.28573" cy="218.24857" rx="0.40587616" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="128.43378" cy="212.52586" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="133.58182" cy="206.80316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="138.72987" cy="201.08044" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="143.87793" cy="195.35776" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="149.02597" cy="189.63504" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="154.17401" cy="183.91232" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="159.32205" cy="178.18964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="164.47011" cy="172.46692" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="169.61816" cy="166.74422" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="174.7662" cy="161.02151" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="179.91425" cy="155.2988" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="185.0623" cy="149.5761" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="190.21034" cy="143.85339" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="195.3584" cy="138.13069" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="200.50644" cy="132.40797" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="205.6545" cy="126.68527" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="210.80254" cy="120.96257" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="215.95058" cy="115.23985" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="221.09863" cy="109.51715" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="226.24667" cy="103.79445" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="231.39473" cy="98.071747" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="236.54277" cy="92.34903" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="241.69083" cy="86.626328" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="246.83887" cy="80.903625" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="251.98692" cy="75.180923" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="257.13495" cy="69.458496" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="262.28302" cy="64.340851" rx="0.40588379" ry="0.40587807"/>
|
||||
<ellipse fill="blue" cx="267.43106" cy="64.340851" rx="0.40588379" ry="0.40587807"/>
|
||||
<ellipse fill="blue" cx="272.5791" cy="69.458496" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="277.72717" cy="75.180923" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="282.87518" cy="80.903625" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="288.02325" cy="86.626328" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="293.1713" cy="92.34903" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="298.31934" cy="98.071747" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="303.46738" cy="103.79445" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="308.61545" cy="109.51715" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="313.76349" cy="115.23985" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="318.91153" cy="120.96257" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="324.05957" cy="126.68527" rx="0.40588379" ry="0.40587616"/>
|
||||
<ellipse fill="blue" cx="329.20764" cy="132.40797" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="334.35568" cy="138.13069" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="339.50372" cy="143.85339" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="344.65176" cy="149.5761" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="349.7998" cy="155.2988" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="354.94788" cy="161.02151" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="360.09592" cy="166.74422" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="365.24396" cy="172.46692" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="370.392" cy="178.18964" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="375.54004" cy="183.91232" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="380.68811" cy="189.63504" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="385.83615" cy="195.35776" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="390.98419" cy="201.08044" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="396.13223" cy="206.80316" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="401.2803" cy="212.52586" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="406.42834" cy="218.24857" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="411.57639" cy="223.97128" rx="0.40588379" ry="0.40588379"/>
|
||||
<ellipse fill="blue" cx="416.72443" cy="229.69398" rx="0.40588379" ry="0.40588379"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M51.2131 270.039L51.2131 274.039"/>
|
||||
<text transform="translate(51.2131 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M76.9533 270.039L76.9533 274.039"/>
|
||||
<text transform="translate(76.9533 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M102.694 270.039L102.694 274.039"/>
|
||||
<text transform="translate(102.694 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M128.434 270.039L128.434 274.039"/>
|
||||
<text transform="translate(128.434 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.174 270.039L154.174 274.039"/>
|
||||
<text transform="translate(154.174 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.914 270.039L179.914 274.039"/>
|
||||
<text transform="translate(179.914 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M205.654 270.039L205.654 274.039"/>
|
||||
<text transform="translate(205.654 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M231.395 270.039L231.395 274.039"/>
|
||||
<text transform="translate(231.395 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M257.135 270.039L257.135 274.039"/>
|
||||
<text transform="translate(257.135 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M282.875 270.039L282.875 274.039"/>
|
||||
<text transform="translate(282.875 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M308.615 270.039L308.615 274.039"/>
|
||||
<text transform="translate(308.615 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M334.356 270.039L334.356 274.039"/>
|
||||
<text transform="translate(334.356 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M360.096 270.039L360.096 274.039"/>
|
||||
<text transform="translate(360.096 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M385.836 270.039L385.836 274.039"/>
|
||||
<text transform="translate(385.836 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M411.576 270.039L411.576 274.039"/>
|
||||
<text transform="translate(411.576 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M35.7689 270.039L35.7689 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.917 270.039L40.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M46.065 270.039L46.065 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M56.3611 270.039L56.3611 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M61.5092 270.039L61.5092 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M66.6572 270.039L66.6572 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M71.8053 270.039L71.8053 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M82.1013 270.039L82.1013 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M87.2494 270.039L87.2494 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M92.3974 270.039L92.3974 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M97.5455 270.039L97.5455 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M107.842 270.039L107.842 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M112.99 270.039L112.99 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.138 270.039L118.138 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.286 270.039L123.286 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M133.582 270.039L133.582 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M138.73 270.039L138.73 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M143.878 270.039L143.878 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.026 270.039L149.026 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.322 270.039L159.322 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.47 270.039L164.47 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.618 270.039L169.618 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.766 270.039L174.766 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M185.062 270.039L185.062 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M190.21 270.039L190.21 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M195.358 270.039L195.358 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M200.506 270.039L200.506 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M210.803 270.039L210.803 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M215.951 270.039L215.951 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M221.099 270.039L221.099 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M226.247 270.039L226.247 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M236.543 270.039L236.543 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M241.691 270.039L241.691 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M246.839 270.039L246.839 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M251.987 270.039L251.987 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M262.283 270.039L262.283 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M267.431 270.039L267.431 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M272.579 270.039L272.579 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M277.727 270.039L277.727 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M288.023 270.039L288.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M293.171 270.039L293.171 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M298.319 270.039L298.319 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M303.467 270.039L303.467 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M313.763 270.039L313.763 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M318.912 270.039L318.912 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M324.06 270.039L324.06 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M329.208 270.039L329.208 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M339.504 270.039L339.504 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M344.652 270.039L344.652 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M349.8 270.039L349.8 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M354.948 270.039L354.948 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M365.244 270.039L365.244 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M370.392 270.039L370.392 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M375.54 270.039L375.54 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M380.688 270.039L380.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M390.984 270.039L390.984 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.132 270.039L396.132 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.28 270.039L401.28 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.428 270.039L406.428 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M416.724 270.039L416.724 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M421.872 270.039L421.872 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.021 270.039L427.021 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.169 270.039L432.169 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 255.446L28.9375 255.446"/>
|
||||
<text transform="translate(23.9375 255.446)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 226.833L28.9375 226.833"/>
|
||||
<text transform="translate(23.9375 226.833)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 198.219L28.9375 198.219"/>
|
||||
<text transform="translate(23.9375 198.219)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 169.606L28.9375 169.606"/>
|
||||
<text transform="translate(23.9375 169.606)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 140.992L28.9375 140.992"/>
|
||||
<text transform="translate(23.9375 140.992)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 112.379L28.9375 112.379"/>
|
||||
<text transform="translate(23.9375 112.379)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 83.765L28.9375 83.765"/>
|
||||
<text transform="translate(23.9375 83.765)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 55.1514L28.9375 55.1514"/>
|
||||
<text transform="translate(23.9375 55.1514)" font-size="12" font-family="Segoe UI" x="-12.9375, -6.46875, " y="3.046875, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 266.892L30.9375 266.892"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 261.169L30.9375 261.169"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 249.723L30.9375 249.723"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 244.001L30.9375 244.001"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 238.278L30.9375 238.278"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 232.555L30.9375 232.555"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 221.11L30.9375 221.11"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 215.387L30.9375 215.387"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 209.665L30.9375 209.665"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 203.942L30.9375 203.942"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 192.496L30.9375 192.496"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 186.774L30.9375 186.774"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 181.051L30.9375 181.051"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 175.328L30.9375 175.328"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 163.883L30.9375 163.883"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 158.16L30.9375 158.16"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 152.437L30.9375 152.437"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 146.715L30.9375 146.715"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 135.269L30.9375 135.269"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 129.547L30.9375 129.547"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 123.824L30.9375 123.824"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 118.101L30.9375 118.101"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 106.656L30.9375 106.656"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 100.933L30.9375 100.933"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 95.2104L30.9375 95.2104"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 89.4877L30.9375 89.4877"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 78.0423L30.9375 78.0423"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 72.3196L30.9375 72.3196"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 66.5969L30.9375 66.5969"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 60.8741L30.9375 60.8741"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 49.4287L30.9375 49.4287"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M32.9375 270.039L32.9375 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(233.969 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-152.26172, -142.88672, -136.51953, -131.97266, -123.36328, -113.68359, -103.77734, -99.230469, -90.574219, -86.160156, -79.691406, -75.277344, -64.027344, -55.707031, -50.636719, -40.191406, -24.878906, -13.628906, -7.7226563, 1.4804688, 5.8164063, 10.230469, 19.433594, 23.769531, 28.183594, 38.441406, 42.988281, 51.597656, 59.277344, 68.222656, 82.878906, 91.488281, 101.16797, 113.42578, 122.03516, 128.40234, 134.76953, 139.31641, 146.35547, " y="-6.890625, ">
|
||||
Triangle - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 33 KiB |
@@ -1,335 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 234.965L435 234.965M40.3379 194.002L435 194.002M40.3379 153.04L435 153.04M40.3379 112.077L435 112.077M40.3379 71.1148L435 71.1148"/>
|
||||
<clipPath id="cl_8b">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_8b)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 234.965L58.2771 234.965L63.3304 71.1148L68.3837 234.965L73.437 71.1148L78.4902 234.965L83.5435 71.1148L88.5968 146.895L93.6501 234.965L98.7034 249.302L103.757 114.125L108.81 234.965L113.863 200.147L118.917 89.5479L123.97 69.0667L129.023 114.125L134.076 120.27L139.13 255.446L144.183 216.532L149.236 196.051L154.29 101.837L159.343 116.174L164.396 251.35L169.45 173.521L174.503 75.211L179.556 93.6442L184.609 230.869L189.663 169.425L194.716 196.051L199.769 83.4035L204.823 150.992L209.876 247.254L214.929 95.6923L219.982 251.35L225.036 130.51L230.089 148.944L235.142 228.821L240.196 114.125L245.249 194.002L250.302 132.559L255.355 103.885L260.409 136.655L265.462 198.099L270.515 177.617L275.569 122.318L280.622 79.3073L285.675 241.109L290.729 159.184L295.782 218.58L300.835 60.8741L305.888 255.446L310.942 161.232L315.995 161.232L321.048 169.425L326.102 189.906L331.155 126.414L336.208 220.628L341.261 191.954L346.315 79.3073L351.368 232.917L356.421 112.077L361.475 216.532L366.528 95.6923L371.581 179.665L376.634 167.377L381.688 212.436L386.741 77.2592L391.794 146.895L396.848 204.243L401.901 165.329L406.954 214.484L412.008 169.425L417.061 171.473"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="234.9649" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="71.114777" rx="0.40212631" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="234.9649" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="71.114777" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="234.9649" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="71.114777" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="146.89546" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="234.9649" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="249.30179" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="114.12544" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="108.81" cy="234.9649" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="200.14676" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="89.547928" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="69.06665" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="114.12544" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="120.26982" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="216.53177" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="196.05051" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="101.83669" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="116.17357" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="251.34991" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="173.5211" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="75.211029" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="93.64418" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="230.86865" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="169.42485" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="196.05051" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="83.403534" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="150.99171" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="247.25366" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="95.692307" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="251.34991" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="130.51045" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="148.94359" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="228.82053" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="114.12544" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="194.00237" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="132.55858" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="103.88481" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="136.65483" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="198.09863" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="177.61736" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="122.31795" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="79.307281" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="241.10928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="159.18422" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="218.5799" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="161.23235" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="161.23235" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="169.42485" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="189.90611" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="126.4142" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="220.62802" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="191.95424" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="79.307281" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="232.91678" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="112.07732" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="216.53177" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="95.692307" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="179.66548" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="167.37672" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="212.4355" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="77.259155" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="146.89546" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="204.24301" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="165.3286" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="214.48364" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="169.42485" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="171.47298" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<clipPath id="cl_8c">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_8c)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 153.04L58.2771 153.04L63.3304 153.04L68.3837 153.04L73.437 153.04L78.4902 153.04L83.5435 153.04L88.5968 153.038L93.6501 148.39L98.7034 122.319L103.757 187.683L108.81 230.333L113.863 187.341L118.917 179.847L123.97 205.324L129.023 145.603L134.076 87.5372L139.13 93.0098L144.183 121.961L149.236 185.474L154.29 227.758L159.343 203.365L164.396 150.789L169.45 121.13L174.503 178.889L179.556 200.092L184.609 129.455L189.663 96.8796L194.716 158.037L199.769 194.297L204.823 180.029L209.876 141.896L214.929 128.237L219.982 187.544L225.036 174.608L230.089 175.143L235.142 183.682L240.196 150.331L245.249 181.849L250.302 171.471L255.355 156.876L260.409 157.546L265.462 123.202L270.515 125.035L275.569 164.561L280.622 181.684L285.675 148.779L290.729 112.288L295.782 158.154L300.835 194.73L305.888 184.877L310.942 146.873L315.995 161.515L321.048 198.057L326.102 166.642L331.155 166.412L336.208 175.878L341.261 162.057L346.315 175.358L351.368 195.361L356.421 145.262L361.475 155.682L366.528 169.898L371.581 164.303L376.634 155.032L381.688 143.416L386.741 171.464L391.794 183.409L396.848 146.148L401.901 122.253L406.954 169.835L412.008 184.35L417.061 189.58"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="153.03984" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="153.03984" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="153.03984" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="153.03984" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="153.03984" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="153.03984" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="153.03763" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="148.39038" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="122.31912" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="187.68266" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="230.33255" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="187.34079" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="179.84747" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="205.3237" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="145.60335" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="87.537186" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="93.009811" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="121.96124" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="185.4743" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="227.75757" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="203.36467" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="150.78864" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="121.13042" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="178.88928" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="200.09232" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="129.45503" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="96.879593" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="158.03687" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="194.29662" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="180.02905" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="141.89648" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="128.23714" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="187.54407" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="174.60818" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="175.14325" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="183.68163" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="150.3311" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="181.84927" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="171.47096" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="156.87631" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="157.54564" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="123.20186" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="125.03493" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="164.56091" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="181.68443" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="148.77916" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="112.28816" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="158.15396" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="194.73013" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="184.87672" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="146.87283" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="161.51517" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="198.05736" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="166.64168" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="166.41211" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="175.87825" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="162.0571" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="175.35841" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="195.36087" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="145.26178" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="155.68228" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="169.89825" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="164.30278" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="155.03201" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="143.41595" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="171.46353" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="183.40927" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="146.14838" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="122.25301" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="169.83533" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="184.34981" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="189.5799" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 234.965L36.3379 234.965"/>
|
||||
<text transform="translate(31.3379 234.965)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.4
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 194.002L36.3379 194.002"/>
|
||||
<text transform="translate(31.3379 194.002)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.2
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 153.04L36.3379 153.04"/>
|
||||
<text transform="translate(31.3379 153.04)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 112.077L36.3379 112.077"/>
|
||||
<text transform="translate(31.3379 112.077)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.2
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 71.1148L36.3379 71.1148"/>
|
||||
<text transform="translate(31.3379 71.1148)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.4
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 267.735L38.3379 267.735"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 259.542L38.3379 259.542"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 251.35L38.3379 251.35"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 243.157L38.3379 243.157"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.772L38.3379 226.772"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 218.58L38.3379 218.58"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 210.387L38.3379 210.387"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 202.195L38.3379 202.195"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 185.81L38.3379 185.81"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 169.425L38.3379 169.425"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 161.232L38.3379 161.232"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 144.847L38.3379 144.847"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 136.655L38.3379 136.655"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.462L38.3379 128.462"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 120.27L38.3379 120.27"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 103.885L38.3379 103.885"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 95.6923L38.3379 95.6923"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 87.4998L38.3379 87.4998"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 79.3073L38.3379 79.3073"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 62.9223L38.3379 62.9223"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 54.7298L38.3379 54.7298"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.5373L38.3379 46.5373"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-143.98828, -127.91016, -118.27734, -113.73047, -107.50391, -98.847656, -94.433594, -87.964844, -83.550781, -72.300781, -63.980469, -58.910156, -48.464844, -33.152344, -21.902344, -15.996094, -6.7929688, -2.4570313, 1.9570313, 11.160156, 15.496094, 19.910156, 30.167969, 34.714844, 43.324219, 51.003906, 59.949219, 74.605469, 83.214844, 92.894531, 105.15234, 113.76172, 120.12891, 126.49609, 131.04297, 138.08203, " y="-6.890625, ">
|
||||
White - AFIRMA(6, 6, BlackmanHarris)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,53 +0,0 @@
|
||||
## ALMA: Arnaud Legoux Moving Average
|
||||
|
||||
### Concept
|
||||
|
||||
ALMA is a moving average designed to reduce the lag of traditional moving averages while maintaining smoothness. It uses a Gaussian distribution to weight the price data, allowing for greater flexibility in balancing smoothness and responsiveness.
|
||||
|
||||
### Origin
|
||||
|
||||
ALMA was developed by *Arnaud Legoux and Dimitrios Kouzis-Loukas*, introduced in 2009. It was created to address the limitations of traditional moving averages, particularly the lag issue in trend identification and signal generation.
|
||||
|
||||
### Key Features
|
||||
|
||||
1. **Gaussian Distribution**: Uses a Gaussian (normal) distribution to weight price data, concentrating the most weight around a specific point.
|
||||
2. **Offset Parameter**: Allows shifting the Gaussian distribution to the left or right, affecting the lag and responsiveness.
|
||||
3. **Sigma Parameter**: Controls the width of the Gaussian distribution, affecting the smoothness of the average.
|
||||
4. **Lag Reduction**: Designed to minimize lag while maintaining a smooth output.
|
||||
|
||||
### Usage
|
||||
|
||||
1. **Trend Identification**: ALMA can identify trends more quickly than traditional moving averages due to its reduced lag.
|
||||
2. **Signal Generation**: Crossovers between ALMA and price, or between different ALMA settings, can generate trading signals.
|
||||
3. **Support and Resistance**: ALMA can act as dynamic support and resistance levels.
|
||||
4. **Smoothing Price Action**: Useful for smoothing noisy price data while preserving important trend information.
|
||||
|
||||
### Advantages
|
||||
|
||||
- Reduces lag compared to simple and exponential moving averages.
|
||||
- Highly customizable through its offset and sigma parameters.
|
||||
- Can be tuned to be more responsive or more smooth based on trading preferences.
|
||||
- Potentially more effective in capturing short-term price movements.
|
||||
|
||||
### Considerations
|
||||
|
||||
- **Offset Parameter**: Ranges from 0 to 1, determining the distribution's center of weight.
|
||||
- 0 results in a simple moving average (more lag, very smooth).
|
||||
- 1 creates a weighted average focused on the most recent prices (less lag, less smooth).
|
||||
- 0.85 is often used as a default, balancing lag reduction and smoothness.
|
||||
|
||||
- **Sigma Parameter**: Controls the Gaussian distribution's width.
|
||||
- Lower values create a narrower distribution, focusing on fewer price bars.
|
||||
- Higher values create a wider distribution, incorporating more price bars.
|
||||
- 6 is often used as a default value.
|
||||
|
||||
- **Period**: As with other moving averages, determines how many price bars are included in the calculation.
|
||||
|
||||
- **Balancing Responsiveness and Stability**:
|
||||
- Adjusting offset and sigma allows fine-tuning between quick response to price changes and stability in noisy markets.
|
||||
- Higher offset and lower sigma increase responsiveness but may lead to more false signals in volatile markets.
|
||||
- Lower offset and higher sigma increase smoothness but may introduce more lag.
|
||||
|
||||
- **Computational Complexity**: More complex to calculate than simple moving averages, which may be a consideration in high-frequency trading systems.
|
||||
|
||||
- **Interpretation**: Due to its unique weighting system, ALMA may behave differently from traditional moving averages in certain market conditions, requiring careful interpretation.
|
||||
@@ -1,51 +0,0 @@
|
||||
# ALMA: Benchmark Analysis
|
||||
|
||||
This analysis evaluates the Arnaud Legoux Moving Average (ALMA) across four core benchmarks: accuracy, timeliness, overshooting, and smoothness. These benchmarks provide a comprehensive view of ALMA's performance characteristics and serve as a basis for comparison with other moving averages.
|
||||
|
||||
## Accuracy (closeness to the original data)
|
||||
|
||||
ALMA generally exhibits good accuracy in representing the original price data due to its Gaussian distribution-based weighting system.
|
||||
|
||||
- **Strengths**:
|
||||
- The Gaussian distribution weighting helps to reduce noise while preserving important price trends.
|
||||
- The offset parameter allows for fine-tuning of the balance between recent and historical data representation.
|
||||
|
||||
- **Considerations**:
|
||||
- Accuracy can vary based on parameter settings. Incorrect parameter selection might lead to over-smoothing or under-smoothing, potentially reducing accuracy.
|
||||
- In highly volatile markets, ALMA may sacrifice some accuracy for smoothness, especially if the sigma parameter is set to prioritize noise reduction.
|
||||
|
||||
## Timeliness (amount of lag)
|
||||
|
||||
ALMA is designed to minimize lag, which is one of its key advantages over traditional moving averages.
|
||||
|
||||
- **Strengths**:
|
||||
- The offset parameter allows ALMA to be more responsive to recent price changes, potentially reducing lag.
|
||||
- The ability to adjust the window size provides flexibility in balancing timeliness and stability.
|
||||
|
||||
- **Considerations**:
|
||||
- While ALMA generally has less lag than traditional MAs, it's not entirely lag-free. Some minimal lag may still be present, especially with larger window sizes.
|
||||
- The amount of lag can be influenced by parameter settings. Optimizing for minimal lag might come at the cost of increased noise sensitivity.
|
||||
|
||||
## Overshooting (overcompensation during reversals)
|
||||
|
||||
ALMA's design helps to mitigate overshooting during price reversals, but the extent can vary based on settings and market conditions.
|
||||
|
||||
- **Strengths**:
|
||||
- The Gaussian distribution weighting helps to dampen extreme price movements, reducing the likelihood of significant overshooting.
|
||||
- The sigma parameter allows for control over the smoothness of transitions, potentially minimizing overshoot.
|
||||
|
||||
- **Considerations**:
|
||||
- Overshooting can still occur, especially in markets with sudden, sharp reversals.
|
||||
- The degree of overshooting can be influenced by parameter settings. More aggressive settings (lower sigma, higher offset) might increase responsiveness but also the risk of overshooting.
|
||||
|
||||
## Smoothness (continuous 2nd derivative, less jagged flow)
|
||||
|
||||
ALMA generally produces a smoother line than many traditional moving averages, which is one of its defining characteristics.
|
||||
|
||||
- **Strengths**:
|
||||
- The Gaussian distribution weighting effectively smooths out minor price fluctuations and noise.
|
||||
- The sigma parameter provides direct control over the smoothness of the line.
|
||||
- The resulting smooth line can make trend identification easier.
|
||||
|
||||
- **Considerations**:
|
||||
- The degree of smoothness can be adjusted through parameter settings.
|
||||
@@ -1,45 +0,0 @@
|
||||
# The Math Behind ALMA
|
||||
|
||||
## Components of ALMA
|
||||
|
||||
ALMA is a single-formula moving average that incorporates elements of several advanced techniques:
|
||||
|
||||
- Gaussian distribution
|
||||
- Weighted moving average
|
||||
- Offset parameter
|
||||
|
||||
### ALMA Formula
|
||||
|
||||
$ ALMA_t = \sum_{i=0}^{n-1} w_i \cdot P_{t-i} $
|
||||
|
||||
Where:
|
||||
- $ALMA_t$ is the ALMA value at time $t$
|
||||
- $n$ is the window size (number of periods)
|
||||
- $P_{t-i}$ is the price at time $t-i$
|
||||
- $w_i$ are the weights
|
||||
|
||||
### Weight Calculation
|
||||
|
||||
The weights $w_i$ are calculated using a Gaussian distribution function with an offset:
|
||||
|
||||
$ w_i = \exp\left(-\frac{(i - m)^2}{2s^2}\right) $
|
||||
|
||||
Where:
|
||||
- $i$ is the position of the price in the window (0 to $n-1$)
|
||||
- $m$ is the offset of the Gaussian distribution, calculated as $m = \text{floor}(offset \cdot (n - 1))$
|
||||
- $s$ is the standard deviation of the Gaussian distribution, calculated as $s = \frac{n}{sigma}$
|
||||
|
||||
### Parameter Definitions
|
||||
|
||||
ALMA uses three main parameters:
|
||||
|
||||
- **Window size** ($n$): Affects the overall reactivity of the indicator.
|
||||
- **Offset**: Influences the lag of the moving average. Lower values reduce lag but may increase noise.
|
||||
- **Sigma**: Controls the smoothness of the indicator. Higher values increase smoothness but may increase lag.
|
||||
|
||||
### Computational Process
|
||||
|
||||
For each new data point:
|
||||
- Calculate the weights for the entire window.
|
||||
- Apply these weights to the most recent $n$ prices.
|
||||
- Sum the weighted prices to produce the final ALMA value.
|
||||
@@ -1,62 +0,0 @@
|
||||
#!meta
|
||||
|
||||
{"kernelInfo":{"defaultKernelName":"csharp","items":[{"aliases":[],"name":"csharp"}]}}
|
||||
|
||||
#!csharp
|
||||
|
||||
#r "..\..\..\..\lib\obj\Debug\QuanTAlib.dll"
|
||||
|
||||
#r "nuget: ScottPlot"
|
||||
|
||||
using QuanTAlib;
|
||||
using ScottPlot;
|
||||
using Microsoft.DotNet.Interactive.Formatting;
|
||||
|
||||
QuanTAlib.Formatters.Initialize();
|
||||
Formatter.Register(typeof(ScottPlot.Plot), (p, w) =>
|
||||
w.Write(((ScottPlot.Plot)p).GetSvgXml(600, 300)), HtmlFormatter.MimeType);
|
||||
|
||||
#!csharp
|
||||
|
||||
Dictionary<string, double[]> Data = new Dictionary<string, double[]>
|
||||
{
|
||||
{ "Spike", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } },
|
||||
{ "Impulse", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } },
|
||||
{ "Triangle", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2 } },
|
||||
{ "Sawtooth", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } },
|
||||
{ "Sine", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.39,0.56,0.72,0.84,0.93,0.99,1,0.97,0.91,0.81,0.68,0.52,0.33,0.14,-0.06,-0.26,-0.44,-0.61,-0.76,-0.87,-0.95,-0.99,-1,-0.96,-0.88,-0.77,-0.63,-0.46,-0.28,-0.08,0.12,0.31,0.49,0.66,0.79,0.9,0.97,1,0.99,0.94,0.85,0.73,0.58,0.41,0.22,0.02,-0.17,-0.37,-0.54,-0.7,-0.83,-0.92,-0.98,-1,-0.98,-0.92,-0.82,-0.69,-0.54,-0.36,-0.17,0.03,0.23,0.42,0.59,0.74 } },
|
||||
{ "Chirp", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.93,0.27,-0.59,-1,-0.71,0.05,0.75,1,0.67,0,-0.67,-0.99,-0.85,-0.34,0.31,0.81,1,0.82,0.35,-0.22,-0.71,-0.98,-0.95,-0.66,-0.2,0.31,0.72,0.96,0.98,0.78,0.43,-0.01,-0.43,-0.77,-0.96,-0.99,-0.85,-0.58,-0.23,0.16,0.51,0.79,0.95,1,0.92,0.73,0.47,0.15,-0.17,-0.47,-0.72,-0.9,-0.99,-0.99,-0.9,-0.74,-0.52,-0.26,0.01,0.28,0.53,0.73,0.88,0.97,1,0.97 } },
|
||||
{ "White", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0.03,-0.4,-0.47,0.19,-0.4,-0.23,0.31,0.41,0.19,0.16,-0.5,-0.31,-0.21,0.25,0.18,-0.48,-0.1,0.38,0.29,-0.38,-0.08,-0.21,0.34,0.01,-0.46,0.28,-0.48,0.11,0.02,-0.37,0.19,-0.2,0.1,0.24,0.08,-0.22,-0.12,0.15,0.36,-0.43,-0.03,-0.32,0.45,-0.5,-0.04,-0.04,-0.08,-0.18,0.13,-0.33,-0.19,0.36,-0.39,0.2,-0.31,0.28,-0.13,-0.07,-0.29,0.37,0.03,-0.25,-0.06,-0.3,-0.08,-0.09 } },
|
||||
{ "Gauss", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0,0.03,0.11,-0.1,-0.43,-0.08,0.36,-0.04,-0.04,-0.21,-0.3,0.26,0.2,0.28,0.2,0.27,-0.01,-0.1,-0.23,-0.13,-0.41,-0.23,-0.07,-0.21,0.32,-0.18,-0.48,0.3,0.46,-0.2,0.52,-0.81,-0.25,-0.21,-0.12,-0.18,0.18,0.52,0.29,0.44,0.18,-1.2,0.38,0.24,0.06,0.28,0.34,0.3,-0.13,0.19,-0.5,0.59,-0.36,0.22,-0.23,0.24,0.39,0.13,-0.33,-0.57,-0.23,0.49,-0.13,0.76,0.59,0.61 } },
|
||||
{ "B", new double[] { -0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0,-0.28,0.41,-0.54,0.65,-0.75,0.84,-0.91,0.96,-0.99,1,-0.99,0.96,-0.92,0.85,-0.77,0.67,-0.56,0.44,-0.3,0.17,-0.03,-0.11,0.25,-0.39,0.51,-0.63,0.73,-0.82,0.89,-0.95,0.98,-1,0.99,-0.97,0.93,-0.86,0.78,-0.69,0.58,-0.46,0.33,-0.19,0.05,0.09,-0.23,0.36,-0.49,0.61,-0.71,0.81,-0.88,0.94,-0.98,1,-1,0.98,-0.94,0.88,-0.8,0.71,-0.6,0.48,-0.35,0.22,-0.08,-0.06 } },
|
||||
{ "HF", new double[] { -0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,0,0.14,-0.76,-0.96,-0.28,0.66,0.99,0.41,-0.54,-1,-0.54,0.42,0.99,0.65,-0.29,-0.96,-0.75,0.15,0.91,0.84,-0.01,-0.85,-0.91,-0.13,0.76,0.96,0.27,-0.66,-0.99,-0.4,0.55,1,0.53,-0.43,-0.99,-0.64,0.3,0.96,0.75,-0.16,-0.92,-0.83,0.02,0.85,0.9,0.12,-0.77,-0.95,-0.26,0.67,0.99,0.4,-0.56,-1,-0.52,0.44,0.99,0.64,-0.3,-0.97,-0.74,0.17,0.92,0.83,-0.03,-0.86 } },
|
||||
{ "ImpulseHF", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.05,-0.25,-0.32,-0.09,0.22,0.33,0.14,-0.18,-0.33,-0.18,0.14,0.33,0.22,-0.1,-0.32,-0.25,0.05,0.3,0.28,0,-0.28,-0.3,-0.04,0.25,0.32,0.09,-0.22,-0.33,-0.13,0.18,0.33,0.18,0.86,0.67,0.79,1.1,1.32,1.25,0.95,0.69,0.72,1.01,1.28,1.3,1.04,0.74,0.68,0.91,1.22,1.33,1.13,0.81,0.67,0.83,1.15,1.33,1.21,0.9,0.68,0.75,1.06,1.31,1.28,0.99,0.71 } },
|
||||
{ "SawtoothHF", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,2.7,-0.8,-0.8,3.6,9.3,11.95,10.05,6.3,5,8.3,14.1,17.95,17.25,13.55,11.2,13.25,18.75,23.55,24.2,20.95,17.75,18.45,23.35,28.8,30.8,28.35,24.7,24.05,28,33.75,37,35.65,31.85,28.05,-3.2,1.5,4.8,3.75,-0.8,-4.6,-4.15,0.1,4.25,4.5,0.6,-3.85,-4.75,-1.3,3.35,4.95,2,-2.8,-5,-2.6,2.2,4.95,3.2,-1.5,-4.85,-3.7,0.85,4.6,4.15,-0.15,-4.3} },
|
||||
{ "SineG", new double[] { -0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.59,0.83,0.74,0.5,0.91,1.36,0.93,0.87,0.6,0.38,0.78,0.53,0.42,0.14,0.01,-0.45,-0.71,-0.99,-1,-1.36,-1.22,-1.07,-1.17,-0.56,-0.95,-1.11,-0.16,0.18,-0.28,0.64,-0.5,0.24,0.45,0.67,0.72,1.15,1.52,1.28,1.38,1.03,-0.47,0.96,0.65,0.28,0.3,0.17,-0.07,-0.67,-0.51,-1.33,-0.33,-1.34,-0.78,-1.21,-0.68,-0.43,-0.56,-0.87,-0.93,-0.4,0.52,0.1,1.18,1.18,1.35} },
|
||||
{ "ChirpG", new double[] { 0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1.3,0.3,-0.48,-1.1,-1.14,-0.03,1.11,0.96,0.63,-0.21,-0.97,-0.73,-0.65,-0.06,0.51,1.08,0.99,0.72,0.12,-0.35,-1.12,-1.21,-1.02,-0.87,0.12,0.13,0.24,1.26,1.44,0.58,0.95,-0.82,-0.68,-0.98,-1.08,-1.17,-0.67,-0.06,0.06,0.6,0.69,-0.41,1.33,1.24,0.98,1.01,0.81,0.45,-0.3,-0.28,-1.22,-0.31,-1.35,-0.77,-1.13,-0.5,-0.13,-0.13,-0.32,-0.29,0.3,1.22,0.75,1.73,1.59,1.58} },
|
||||
{ "Complex", new double[] { 175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.44,176.27,176.04,176.99,175.49,175.68,174.34,176.4,174.05,174.4,174.2,176.16,175,177.72,174.33,176.96,174.62,174.76,170.9,171.12,171.05,170.01,169.24,172.64,171.96,175.72,174.16,175.81,177.3,178.38,176.75,177.19,175.55,178.49,176.52,178.45,178.04,178.25,177.8,176.97,172.94,174.92,173.98,172.29,171.19,172.54,172.11,175.32,175.63,176.65,173.8,176.04,172.74,175.24,171.84,171.54,172.17,171.85,172.38,170.78,173.49,173.69,171.71,174.38,173.99,174.83} },
|
||||
{ "Market", new double[] { 68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,67.75,67.75,72.75,74.75,72.25,71.25,71.75,72.75,77.75,76,76,76,74.75,75.5,74.75,73.75,74,74.75,72.25,72.5,72.25,74.5,74.75,75.75,75.75,75.75,74.25,73.75,74.75,72,71.75,72.5,72.25,71,72,71.75,71.75,73.25,72.5,73.75,74,76.75,75.75,75,75.75,74.5,74.25,73.5,71.75,70.5,69,70.5,70,68.75,67.25,68.5,70.75,70,70.5,68.25,68.25,68.25,63.75,64.25} }
|
||||
|
||||
};
|
||||
|
||||
#!csharp
|
||||
|
||||
String Name = "ALMA";
|
||||
int p = 10;
|
||||
double offset = 0.85;
|
||||
double sigma = 6.0;
|
||||
Func<int, AbstractBase> Indicator = period => new Alma(period, offset: offset, sigma: sigma);
|
||||
|
||||
foreach (var item in Data) {
|
||||
string Signal = item.Key;
|
||||
double[] Input = item.Value;
|
||||
TSeries Output = new();
|
||||
var ma = Indicator(p);
|
||||
foreach (var value in Input) { Output.Add(ma.Calc(value)); }
|
||||
Plot plt = new();
|
||||
var p1a = plt.Add.Signal(Input[24..]); p1a.Color = ScottPlot.Colors.Red; p1a.LineWidth = 2;
|
||||
var p1b = plt.Add.Signal(Output.v.ToArray()[24..]); p1b.Color = ScottPlot.Colors.Blue; p1b.LineWidth = 4;
|
||||
plt.Title($"{Signal} - {Name}({p}, {offset:F2}, {sigma:F2})");
|
||||
plt.Display();
|
||||
plt.SaveSvg($"img/{Name}{p}_{Signal}.svg", 450, 300);
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# ALMA Charts
|
||||
|
||||
               
|
||||
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_277">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_277)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 197.075L58.2771 197.075L63.3304 119.246L68.3837 197.075L73.437 119.246L78.4902 197.075L83.5435 158.16L88.5968 185.4L93.6501 118.273L98.7034 210.695L103.757 94.9243L108.81 231.125L113.863 76.4399L118.917 246.69L123.97 64.7656L129.023 254.473L134.076 60.8741L139.13 254.473L144.183 64.7656L149.236 247.663L154.29 75.4671L159.343 233.07L164.396 92.9785L169.45 212.64L174.503 115.354L179.556 187.346L184.609 141.622L189.663 161.079L194.716 168.862L199.769 133.839L204.823 196.102L209.876 108.544L214.929 219.45L219.982 87.1414L225.036 237.935L230.089 71.5756L235.142 250.582L240.196 62.8199L245.249 255.446L250.302 61.847L255.355 252.528L260.409 67.6842L265.462 241.826L270.515 82.2771L275.569 225.288L280.622 101.734L285.675 202.912L290.729 126.056L295.782 176.645L300.835 153.296L305.888 149.404L310.942 180.536L315.995 123.137L321.048 205.83L326.102 98.8157L331.155 227.233L336.208 79.3585L341.261 243.772L346.315 66.7113L351.368 253.5L356.421 60.8741L361.475 255.446L366.528 62.8199L371.581 249.609L376.634 72.5485L381.688 235.989L386.741 89.0871L391.794 216.532L396.848 111.463L401.901 192.21L406.954 136.757L412.008 165.943L417.061 163.997"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="197.07455" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="119.24576" rx="0.40212631" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="197.07455" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="119.24576" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="197.07455" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="185.40024" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="118.27289" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="210.6946" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="94.924255" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="108.81" cy="231.12466" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="76.439911" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="246.69043" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="64.765594" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="247.66328" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="75.467056" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="92.978531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="212.64032" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="115.35431" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="187.34595" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="141.62154" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="161.07874" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="168.86162" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="133.83865" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="196.1017" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="108.5443" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="219.45035" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="237.93468" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="230.089" cy="71.575607" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="61.847015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="252.52759" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="67.684174" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="241.82613" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="82.277069" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="225.28751" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="101.73427" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="202.91171" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="126.05577" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="176.6445" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="153.29585" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="149.40442" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="180.53593" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="123.13719" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="205.83029" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="98.815689" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="227.23322" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="79.35849" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="243.77184" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="66.711304" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="255.44617" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="249.60901" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="72.548477" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="235.98895" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="89.087097" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="216.53177" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="111.46288" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="192.21027" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="136.75723" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="165.94304" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="163.99731" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<clipPath id="cl_278">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_278)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 161.002L58.2771 161.002L63.3304 155.319L68.3837 161.002L73.437 155.319L78.4902 161.002L83.5435 163.029L88.5968 169.16L93.6501 161.905L98.7034 167.02L103.757 154.973L108.81 164.578L113.863 151.945L118.917 164.9L123.97 151.138L129.023 165.264L134.076 151.069L139.13 165.077L144.183 151.554L149.236 164.505L154.29 152.673L159.343 163.35L164.396 154.083L169.45 161.663L174.503 155.707L179.556 159.513L184.609 157.418L189.663 157.475L194.716 159.496L199.769 155.63L204.823 161.6L209.876 154.085L214.929 163.362L219.982 152.707L225.036 164.523L230.089 151.658L235.142 165.26L240.196 151.273L245.249 165.482L250.302 151.439L255.355 165.087L260.409 151.945L265.462 163.847L270.515 152.96L275.569 162.522L280.622 154.661L285.675 160.864L290.729 156.529L295.782 158.802L300.835 158.46L305.888 156.803L310.942 160.472L315.995 155.031L321.048 162.349L326.102 153.348L331.155 163.636L336.208 151.822L341.261 164.475L346.315 151.029L351.368 165.114L356.421 150.959L361.475 165.177L366.528 151.358L371.581 164.574L376.634 152.27L381.688 163.383L386.741 153.553L391.794 161.747L396.848 155.295L401.901 159.929L406.954 157.183L412.008 157.933L417.061 159.196"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="161.00175" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="155.31856" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="161.00175" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="155.31856" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="161.00175" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="163.02945" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="169.15973" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="161.90521" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="167.0202" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="154.97304" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="164.57834" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="151.94452" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="164.89973" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="151.1377" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="165.26392" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="151.06931" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="165.07742" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="151.55396" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="164.50522" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="152.67278" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="163.35034" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="154.08299" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="161.66255" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="155.70749" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="159.51266" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="157.41815" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="157.47508" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="159.49625" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="155.63039" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="161.60019" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="154.08533" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="163.36194" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="152.70651" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="164.52338" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="151.65828" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="165.25999" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="151.27313" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="165.48157" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="151.439" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="165.08675" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="151.94476" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="163.84695" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="152.95969" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="162.52155" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="154.66051" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="160.86365" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="156.52887" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="158.80209" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="158.45982" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="156.80298" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="160.47232" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="155.03065" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="162.34923" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="153.34763" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="163.63556" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="151.82184" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="164.47528" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="151.02884" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="165.1138" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="150.95924" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="165.17737" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="151.35779" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="164.57411" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="152.2702" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="163.38306" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="153.5535" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="161.7467" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="155.29503" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="159.92885" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="157.18259" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="157.93347" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="159.19624" rx="0.40213013" ry="0.40213013"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-91.578125, -81.320313, -76.90625, -70.4375, -66.023438, -54.773438, -46.59375, -31.28125, -20.03125, -14.125, -4.921875, 4.28125, 8.6171875, 13.03125, 22.234375, 26.570313, 35.773438, 44.976563, 49.3125, 53.726563, 62.929688, 67.265625, 76.46875, 85.671875, " y="-6.890625, ">
|
||||
B - ALMA(10, 0.85, 6.00)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,330 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300">
|
||||
<rect fill="white" width="450" height="300"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M58.2771 270.039L58.2771 46.2813M83.5435 270.039L83.5435 46.2813M108.81 270.039L108.81 46.2813M134.076 270.039L134.076 46.2813M159.343 270.039L159.343 46.2813M184.609 270.039L184.609 46.2813M209.876 270.039L209.876 46.2813M235.142 270.039L235.142 46.2813M260.409 270.039L260.409 46.2813M285.675 270.039L285.675 46.2813M310.942 270.039L310.942 46.2813M336.208 270.039L336.208 46.2813M361.475 270.039L361.475 46.2813M386.741 270.039L386.741 46.2813M412.008 270.039L412.008 46.2813"/>
|
||||
<path fill="none" stroke="#010101" stroke-width="1" stroke-miterlimit="4" stroke-opacity="0.098039217" d="M40.3379 255.446L435 255.446M40.3379 206.803L435 206.803M40.3379 158.16L435 158.16M40.3379 109.517L435 109.517M40.3379 60.8741L435 60.8741"/>
|
||||
<clipPath id="cl_265">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_265)">
|
||||
<path fill="none" stroke="red" stroke-width="2" stroke-miterlimit="4" d="M58.2771 158.16L58.2771 158.16L63.3304 157.187L68.3837 158.16L73.437 157.187L78.4902 158.16L83.5435 157.187L88.5968 67.6842L93.6501 131.893L98.7034 215.559L103.757 255.446L108.81 227.233L113.863 153.296L118.917 85.1956L123.97 60.8741L129.023 92.9785L134.076 158.16L139.13 223.342L144.183 254.473L149.236 240.853L154.29 191.237L159.343 128.001L164.396 79.3585L169.45 60.8741L174.503 78.3856L179.556 124.11L184.609 179.563L189.663 227.233L194.716 253.5L199.769 250.582L204.823 222.369L209.876 177.617L214.929 128.001L219.982 88.1142L225.036 64.7656L230.089 62.8199L235.142 82.2771L240.196 116.327L245.249 159.133L250.302 199.993L255.355 233.07L260.409 251.555L265.462 254.473L270.515 240.853L275.569 214.586L280.622 180.536L285.675 142.594L290.729 108.544L295.782 81.3042L300.835 65.7384L305.888 60.8741L310.942 68.657L315.995 87.1414L321.048 112.436L326.102 143.567L331.155 174.699L336.208 203.885L341.261 228.206L346.315 245.718L351.368 254.473L356.421 254.473L361.475 245.718L366.528 230.152L371.581 208.749L376.634 183.455L381.688 157.187L386.741 130.92L391.794 106.599L396.848 87.1414L401.901 72.5485L406.954 63.7927L412.008 60.8741L417.061 63.7927"/>
|
||||
<ellipse fill="red" cx="58.277077" cy="158.16016" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="63.330368" cy="157.18729" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="68.383659" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="73.436951" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="78.49025" cy="158.16016" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="83.543533" cy="157.18729" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="88.596832" cy="67.684174" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="93.650124" cy="131.89293" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="98.703415" cy="215.5589" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="103.75671" cy="255.44617" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="108.81" cy="227.23322" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="113.86329" cy="153.29585" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="118.91658" cy="85.195648" rx="0.4021225" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="123.96987" cy="60.874146" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="129.02316" cy="92.978531" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="134.07646" cy="158.16016" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="139.12976" cy="223.34178" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="144.18304" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="149.23633" cy="240.85326" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="154.28963" cy="191.2374" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="159.34293" cy="128.0015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="164.39621" cy="79.35849" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="169.44951" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="174.50279" cy="78.385635" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="179.55609" cy="124.11006" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="184.60938" cy="179.56308" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="189.66267" cy="227.23322" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="194.71596" cy="253.50044" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="199.76926" cy="250.58186" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="204.82254" cy="222.36893" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="209.87584" cy="177.61736" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="214.92914" cy="128.0015" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="219.98242" cy="88.114227" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="225.03572" cy="64.765594" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="230.089" cy="62.81987" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="235.1423" cy="82.277069" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="240.19559" cy="116.32718" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="245.24889" cy="159.13303" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="250.30217" cy="199.99313" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="255.35547" cy="233.07037" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="260.40875" cy="251.55472" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="265.46204" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="270.51535" cy="240.85326" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="275.56863" cy="214.58604" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="280.62195" cy="180.53593" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="285.67523" cy="142.59439" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="290.72852" cy="108.5443" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="295.7818" cy="81.304214" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="300.83508" cy="65.738449" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="305.8884" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="310.94168" cy="68.657028" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="315.99496" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="321.04828" cy="112.43573" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="326.10156" cy="143.56726" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="331.15485" cy="174.69878" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="336.20813" cy="203.88458" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="341.26144" cy="228.20609" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="346.31473" cy="245.71756" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="351.36801" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="356.4213" cy="254.4733" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="361.47461" cy="245.71756" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="366.52789" cy="230.15179" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="371.58118" cy="208.74887" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="376.63449" cy="183.45453" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="381.68777" cy="157.18729" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="386.74106" cy="130.92007" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="red" cx="391.79434" cy="106.59857" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="396.84766" cy="87.141373" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="401.90094" cy="72.548477" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="red" cx="406.95422" cy="63.792725" rx="0.40213013" ry="0.4021244"/>
|
||||
<ellipse fill="red" cx="412.00751" cy="60.874146" rx="0.40213013" ry="0.40212631"/>
|
||||
<ellipse fill="red" cx="417.06082" cy="63.792725" rx="0.40213013" ry="0.4021244"/>
|
||||
</g>
|
||||
<clipPath id="cl_266">
|
||||
<rect x="40.337891" y="46.28125" width="394.66211" height="223.75781"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#cl_266)">
|
||||
<path fill="none" stroke="blue" stroke-width="4" stroke-miterlimit="4" d="M58.2771 157.709L58.2771 157.709L63.3304 157.638L68.3837 157.709L73.437 157.638L78.4902 157.709L83.5435 157.638L88.5968 139.781L93.6501 128.28L98.7034 139.211L103.757 170.858L108.81 201.176L113.863 205.948L118.917 179.692L123.97 138.418L129.023 107.736L134.076 105.466L139.13 132.751L144.183 174.458L149.236 209.175L154.29 220.264L159.343 203.004L164.396 165.845L169.45 124.757L174.503 96.2385L179.556 90.9042L184.609 109.897L189.663 145.82L194.716 186.26L199.769 218.085L204.823 231.969L209.876 224.553L214.929 198.582L219.982 161.915L225.036 124.294L230.089 94.9247L235.142 80.4497L240.196 83.3853L245.249 102.53L250.302 133.097L255.355 168.589L260.409 201.88L265.462 227.033L270.515 239.86L275.569 238.713L280.622 224.451L285.675 199.694L290.729 168.782L295.782 136.465L300.835 107.602L305.888 85.8083L310.942 73.6725L315.995 72.3525L321.048 81.3842L326.102 99.4292L331.155 123.907L336.208 151.853L341.261 180.174L346.315 206.037L351.368 226.96L356.421 241.124L361.475 247.397L366.528 245.595L371.581 236.217L376.634 220.344L381.688 199.64L386.741 175.892L391.794 150.945L396.848 126.826L401.901 105.264L406.954 87.6829L412.008 75.0307L417.061 67.8391"/>
|
||||
<ellipse fill="blue" cx="58.277077" cy="157.70924" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="63.330368" cy="157.63821" rx="0.40212631" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="68.383659" cy="157.70924" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="73.436951" cy="157.63821" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="78.49025" cy="157.70924" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="83.543533" cy="157.63821" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="88.596832" cy="139.78143" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="93.650124" cy="128.28047" rx="0.4021225" ry="0.40212631"/>
|
||||
<ellipse fill="blue" cx="98.703415" cy="139.21063" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="103.75671" cy="170.85822" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="108.81" cy="201.17551" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="113.86329" cy="205.94821" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="118.91658" cy="179.69208" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="123.96987" cy="138.41762" rx="0.4021225" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="129.02316" cy="107.73586" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="134.07646" cy="105.46558" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="139.12976" cy="132.75101" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="144.18304" cy="174.45827" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="149.23633" cy="209.17505" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="154.28963" cy="220.26396" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="159.34293" cy="203.00375" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="164.39621" cy="165.84549" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="169.44951" cy="124.75743" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="174.50279" cy="96.238464" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="179.55609" cy="90.90419" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="184.60938" cy="109.89708" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="189.66267" cy="145.81999" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="194.71596" cy="186.25974" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="199.76926" cy="218.08545" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="204.82254" cy="231.96899" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="209.87584" cy="224.55321" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="214.92914" cy="198.5817" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="219.98242" cy="161.91476" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="225.03572" cy="124.29437" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="230.089" cy="94.924713" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="235.1423" cy="80.449722" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="240.19559" cy="83.38533" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="245.24889" cy="102.5298" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="250.30217" cy="133.09714" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="255.35547" cy="168.58926" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="260.40875" cy="201.87976" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="265.46204" cy="227.03307" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="270.51535" cy="239.85951" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="275.56863" cy="238.71291" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="280.62195" cy="224.45123" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="285.67523" cy="199.69397" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="290.72852" cy="168.78192" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="295.7818" cy="136.46547" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="300.83508" cy="107.60205" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="305.8884" cy="85.808258" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="310.94168" cy="73.672546" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="315.99496" cy="72.352509" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="321.04828" cy="81.384186" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="326.10156" cy="99.429184" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="331.15485" cy="123.90665" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="336.20813" cy="151.85316" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="341.26144" cy="180.17427" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="346.31473" cy="206.03722" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="351.36801" cy="226.95963" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="356.4213" cy="241.12387" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="361.47461" cy="247.39656" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="366.52789" cy="245.595" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="371.58118" cy="236.217" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="376.63449" cy="220.34357" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="381.68777" cy="199.63956" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="386.74106" cy="175.89233" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="391.79434" cy="150.94525" rx="0.40213013" ry="0.40213013"/>
|
||||
<ellipse fill="blue" cx="396.84766" cy="126.82646" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="401.90094" cy="105.26393" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="406.95422" cy="87.682892" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="412.00751" cy="75.030716" rx="0.40213013" ry="0.4021225"/>
|
||||
<ellipse fill="blue" cx="417.06082" cy="67.839066" rx="0.40213013" ry="0.4021225"/>
|
||||
</g>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M58.2771 270.039L58.2771 274.039"/>
|
||||
<text transform="translate(58.2771 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M83.5435 270.039L83.5435 274.039"/>
|
||||
<text transform="translate(83.5435 276.039)" font-size="12" font-family="Segoe UI" x="-3.234375, " y="11.027344, ">
|
||||
5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M108.81 270.039L108.81 274.039"/>
|
||||
<text transform="translate(108.81 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
10
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M134.076 270.039L134.076 274.039"/>
|
||||
<text transform="translate(134.076 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
15
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M159.343 270.039L159.343 274.039"/>
|
||||
<text transform="translate(159.343 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
20
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M184.609 270.039L184.609 274.039"/>
|
||||
<text transform="translate(184.609 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
25
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M209.876 270.039L209.876 274.039"/>
|
||||
<text transform="translate(209.876 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
30
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M235.142 270.039L235.142 274.039"/>
|
||||
<text transform="translate(235.142 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
35
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M260.409 270.039L260.409 274.039"/>
|
||||
<text transform="translate(260.409 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
40
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M285.675 270.039L285.675 274.039"/>
|
||||
<text transform="translate(285.675 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
45
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M310.942 270.039L310.942 274.039"/>
|
||||
<text transform="translate(310.942 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
50
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M336.208 270.039L336.208 274.039"/>
|
||||
<text transform="translate(336.208 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
55
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M361.475 270.039L361.475 274.039"/>
|
||||
<text transform="translate(361.475 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
60
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M386.741 270.039L386.741 274.039"/>
|
||||
<text transform="translate(386.741 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
65
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M412.008 270.039L412.008 274.039"/>
|
||||
<text transform="translate(412.008 276.039)" font-size="12" font-family="Segoe UI" x="-6.46875, 0, " y="11.027344, ">
|
||||
70
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M43.1172 270.039L43.1172 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M48.1705 270.039L48.1705 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M53.2238 270.039L53.2238 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M63.3304 270.039L63.3304 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M68.3837 270.039L68.3837 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M73.437 270.039L73.437 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M78.4902 270.039L78.4902 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M88.5968 270.039L88.5968 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M93.6501 270.039L93.6501 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M98.7034 270.039L98.7034 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M103.757 270.039L103.757 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M113.863 270.039L113.863 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M118.917 270.039L118.917 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M123.97 270.039L123.97 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M129.023 270.039L129.023 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M139.13 270.039L139.13 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M144.183 270.039L144.183 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M149.236 270.039L149.236 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M154.29 270.039L154.29 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M164.396 270.039L164.396 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M169.45 270.039L169.45 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M174.503 270.039L174.503 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M179.556 270.039L179.556 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M189.663 270.039L189.663 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M194.716 270.039L194.716 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M199.769 270.039L199.769 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M204.823 270.039L204.823 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M214.929 270.039L214.929 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M219.982 270.039L219.982 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M225.036 270.039L225.036 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M230.089 270.039L230.089 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M240.196 270.039L240.196 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M245.249 270.039L245.249 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M250.302 270.039L250.302 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M255.355 270.039L255.355 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M265.462 270.039L265.462 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M270.515 270.039L270.515 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M275.569 270.039L275.569 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M280.622 270.039L280.622 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M290.729 270.039L290.729 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M295.782 270.039L295.782 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M300.835 270.039L300.835 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M305.888 270.039L305.888 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M315.995 270.039L315.995 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M321.048 270.039L321.048 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M326.102 270.039L326.102 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M331.155 270.039L331.155 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M341.261 270.039L341.261 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M346.315 270.039L346.315 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M351.368 270.039L351.368 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M356.421 270.039L356.421 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M366.528 270.039L366.528 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M371.581 270.039L371.581 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M376.634 270.039L376.634 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M381.688 270.039L381.688 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M391.794 270.039L391.794 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M396.848 270.039L396.848 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M401.901 270.039L401.901 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M406.954 270.039L406.954 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M417.061 270.039L417.061 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M422.114 270.039L422.114 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M427.167 270.039L427.167 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M432.221 270.039L432.221 272.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L435 270.039"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 46.3812L435 46.3812"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 255.446L36.3379 255.446"/>
|
||||
<text transform="translate(31.3379 255.446)" font-size="12" font-family="Segoe UI" x="-11.267578, -6.46875, " y="3.046875, ">
|
||||
-1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 206.803L36.3379 206.803"/>
|
||||
<text transform="translate(31.3379 206.803)" font-size="12" font-family="Segoe UI" x="-20.337891, -15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
-0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 158.16L36.3379 158.16"/>
|
||||
<text transform="translate(31.3379 158.16)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
0
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 109.517L36.3379 109.517"/>
|
||||
<text transform="translate(31.3379 109.517)" font-size="12" font-family="Segoe UI" x="-15.539063, -9.0703125, -6.46875, " y="3.046875, ">
|
||||
0.5
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 60.8741L36.3379 60.8741"/>
|
||||
<text transform="translate(31.3379 60.8741)" font-size="12" font-family="Segoe UI" x="-6.46875, " y="3.046875, ">
|
||||
1
|
||||
</text>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 265.175L38.3379 265.175"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 245.718L38.3379 245.718"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 235.989L38.3379 235.989"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 226.26L38.3379 226.26"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 216.532L38.3379 216.532"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 197.075L38.3379 197.075"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 187.346L38.3379 187.346"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 177.617L38.3379 177.617"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 167.889L38.3379 167.889"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 148.432L38.3379 148.432"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 138.703L38.3379 138.703"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 128.974L38.3379 128.974"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 119.246L38.3379 119.246"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 99.7886L38.3379 99.7886"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 90.06L38.3379 90.06"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 80.3313L38.3379 80.3313"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 70.6028L38.3379 70.6028"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 51.1456L38.3379 51.1456"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M40.3379 270.039L40.3379 46.2813"/>
|
||||
<path fill="none" stroke="black" stroke-width="1" stroke-miterlimit="4" d="M435 270.039L435 46.2813"/>
|
||||
<text transform="translate(237.669 31.2813)" font-size="16" font-weight="600" font-family="Segoe UI" x="-106.67578, -96.691406, -87.058594, -82.511719, -76.144531, -66.222656, -61.808594, -55.339844, -50.925781, -39.675781, -31.496094, -16.183594, -4.9335938, 0.97265625, 10.175781, 19.378906, 23.714844, 28.128906, 37.332031, 41.667969, 50.871094, 60.074219, 64.410156, 68.824219, 78.027344, 82.363281, 91.566406, 100.76953, " y="-6.890625, ">
|
||||
Chirp - ALMA(10, 0.85, 6.00)
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 30 KiB |