CopyTrading Slice 1: Settings-Fundament + detaillierte Erklärungen
Umsetzung des Fable-Plans, Start mit dem risikoarmen Settings-Fundament (kein Hot-Path/CLOB-Verhalten geändert): - Alle Copytrading-Settings (alt + neu) haben jetzt [Description]/[DisplayName] -> im PropertyGrid als Erklärung sichtbar (Richards Vorgabe). Test erzwingt, dass jede einstellbare Option eine Beschreibung trägt. - ProfitTarget-Default -> 9999 (praktisch deaktiviert); Migration setzt zusätzlich bestehende Zeilen per SQL auf 9999 (Entscheidung 2). Take-Profit-LOGIK folgt. - Neue Account-Settings (noch nicht verdrahtet, für Phase 0.1/1.3/2): SellFloorPct (15), MaxSpreadPct (5), MinSellRatioPct (10). - Neue Master-Trader-Settings: AutoPauseEnabled (Default AN, per Master abschaltbar, Entscheidung 3) + MakerEntry (Default aus, Entscheidung 4). - EF-Migration AddCopytradingBehaviorSettings (neue Spalten + sinnvolle Defaults fuer Bestandszeilen) erstellt und auf MySQL angewendet. - Erklärung dokumentiert einen gefundenen Skalen-Verdacht: PreRedeemLimit wird gegen den 0-1-Preis verglichen; Alt-Werte 99.5 triggern nie (-> ggf. 0.995). Tests: 86 gruen. Build/Smoke gruen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
92a88e8be8
commit
38f609ed31
@@ -48,6 +48,9 @@ namespace PolyTrader.Tests
|
||||
[InlineData(nameof(CopyTradingAccountSettings.PerMarketLimit))]
|
||||
[InlineData(nameof(CopyTradingAccountSettings.PerMasterLimit))]
|
||||
[InlineData(nameof(CopyTradingAccountSettings.perMaxTimeNone))]
|
||||
[InlineData(nameof(CopyTradingAccountSettings.SellFloorPct))]
|
||||
[InlineData(nameof(CopyTradingAccountSettings.MaxSpreadPct))]
|
||||
[InlineData(nameof(CopyTradingAccountSettings.MinSellRatioPct))]
|
||||
public void Settings_money_fields_have_precision_18_6(string name)
|
||||
{
|
||||
using var ctx = CtCtx();
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using PolyTraderSharp.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace PolyTrader.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// Fixiert die entscheidungsrelevanten Default-Werte und stellt sicher, dass alle
|
||||
/// einstellbaren Settings eine [Description] als Erklärung tragen (Richards Vorgabe).
|
||||
/// </summary>
|
||||
public class SettingsDefaultsTests
|
||||
{
|
||||
[Fact]
|
||||
public void ProfitTarget_defaults_to_9999_inactive()
|
||||
{
|
||||
Assert.Equal(9999m, new CopyTradingAccountSettings().ProfitTarget);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void New_account_settings_have_expected_defaults()
|
||||
{
|
||||
var s = new CopyTradingAccountSettings();
|
||||
Assert.Equal(15.0m, s.SellFloorPct);
|
||||
Assert.Equal(5.0m, s.MaxSpreadPct);
|
||||
Assert.Equal(10.0m, s.MinSellRatioPct);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Master_auto_pause_is_on_by_default_maker_off()
|
||||
{
|
||||
var t = new TrackedTrader();
|
||||
Assert.True(t.AutoPauseEnabled);
|
||||
Assert.False(t.MakerEntry);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(typeof(CopyTradingAccountSettings))]
|
||||
[InlineData(typeof(TrackedTrader))]
|
||||
public void All_browsable_writable_settings_have_a_description(System.Type type)
|
||||
{
|
||||
var missing = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
|
||||
.Where(p => p.CanWrite)
|
||||
.Where(p => p.GetCustomAttribute<BrowsableAttribute>()?.Browsable != false)
|
||||
.Where(p => string.IsNullOrWhiteSpace(p.GetCustomAttribute<DescriptionAttribute>()?.Description))
|
||||
.Select(p => p.Name)
|
||||
.ToList();
|
||||
|
||||
Assert.True(missing.Count == 0, $"Ohne [Description]: {string.Join(", ", missing)}");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user