Baseline: Ausgangszustand vor Modularisierung

Erster Commit des bestehenden monolithischen WinForms-Copytraders,
inklusive der Alt-Backups (*.bak), damit diese dauerhaft in der
Historie rekonstruierbar bleiben. Threema-Lib unter libs/ wurde
vendored (nested .git entfernt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
bergm
2026-07-01 13:16:16 +02:00
co-authored by Claude Opus 4.8
commit 475d396f80
147 changed files with 25455 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
import re
import sys
def patch_file(designer_file):
with open(designer_file, 'r', encoding='utf-8') as f:
content = f.read()
grids = {
"dgv_dashboard": [
("AccountId", "Account ID", False, False),
("IsDemo", "Is Demo", False, False),
("IsActive", "Is Active", False, False),
("AccountName", "Account", True, False),
("TotalBalance", "Total USD", True, False),
("AvailableBalance", "Available", True, False),
("PositionBalance", "Positions", True, False),
("OpenTradesCount", "Open", True, False),
("ClosedTrades24h", "Closed 24h", True, False),
("Pnl24h", "Pnl 24h", True, False),
("Winrate24h", "Winrate 24h", True, False),
("ClosedTrades7d", "Closed 7d", True, False),
("Pnl7d", "Pnl 7d", True, False),
("Winrate7d", "Winrate 7d", True, False)
],
"dgv_openTrades": [
("AccountName", "Account", True, False),
("SourceTraderName", "Copied From", True, True),
("MarketQuestion", "Market", True, True),
("MarketSlug", "Market Slug", False, False),
("Outcome", "Outcome", True, False),
("Side", "Side", True, False),
("EntryPrice", "Entry Price", True, False),
("Size", "Shares", True, False),
("AmountUsd", "Amount USD", True, False)
],
"dgv_closedTrades": [
("TradeId", "ID", False, False),
("AccountId", "Account ID", False, False),
("SourceTraderId", "SourceTraderId", False, False),
("IsDemo", "Is Demo", False, False),
("TokenId", "TokenId", False, False),
("MarketSlug", "Market Slug", False, False),
("MarketQuestion", "Market", True, True),
("Outcome", "Outcome", True, False),
("Side", "Side", True, False),
("EntryPrice", "Entry Price", True, False),
("ExitPrice", "Exit Price", True, False),
("Size", "Shares", True, False),
("RealizedPnl", "P&L", True, False),
("PnlPercent", "P&L %", True, False),
("TotalFees", "Fees", True, False),
("OpenedAt", "Opened At", True, False),
("ClosedAt", "Closed At", True, False),
("ExitReason", "Reason", True, False)
],
"dgv_masterTraders": [
("Id", "Id", False, False),
("WalletAddress", "Wallet", True, False),
("DisplayName", "Name", True, False),
("Category", "Category", True, False),
("Description", "Description", True, False),
("Reasoning", "Reasoning", True, False),
("IsActive", "Is Active", True, False),
("IsHidden", "Is Hidden", True, False),
("TotalTrades", "Trades", True, False),
("WinningTrades", "Wins", True, False),
("Winrate30t", "Winrate 30t", True, False),
("TotalPnl", "Total P&L", True, False)
],
"dgv_SlaveTraders": [
("AccountId", "ID", False, False),
("Name", "Name", True, False),
("WalletAddress", "Wallet", True, False),
("IsDemo", "Is Demo", True, False),
("IsActive", "Is Active", True, False),
("CloseOnlyMode", "Close Only", True, False),
("PayoutAddress", "Payout Address", True, False),
("PayoutLimitUsd", "Payout Limit", True, False),
("PerMarketLimit", "Max %", True, False),
("MaxPriceDifference", "Max Price Diff", True, False),
("MaxBuyPrice", "Max Buy Price", True, False),
("ProfitTarget", "Profit Target", True, False),
("LimitUnder6h", "< 6h", True, False),
("LimitUnder24h", "< 24h", True, False),
("LimitUnder72h", "< 72h", True, False),
("LimitOver72h", "> 72h", True, False)
]
}
declarations = []
instantiations = []
setups = []
for dgv_name, cols in grids.items():
if f"{dgv_name}.Columns.AddRange" in content:
print(f"{dgv_name} already patched.")
continue
col_refs = []
for prop, header, visible, is_link in cols:
col_type = "DataGridViewLinkColumn" if is_link else "DataGridViewTextBoxColumn"
col_name = f"col_{dgv_name}_{prop}"
col_refs.append(f"{col_name}")
declarations.append(f"private {col_type} {col_name};")
instantiations.append(f"{col_name} = new {col_type}();")
setup = f"""//
// {col_name}
//
{col_name}.DataPropertyName = "{prop}";
{col_name}.HeaderText = "{header}";
{col_name}.Name = "{col_name}";
{col_name}.ReadOnly = true;
"""
if not visible:
setup += f"{col_name}.Visible = false;\n"
if is_link:
setup += f"{col_name}.ActiveLinkColor = Color.White;\n"
setup += f"{col_name}.LinkBehavior = LinkBehavior.SystemDefault;\n"
setup += f"{col_name}.LinkColor = Color.Blue;\n"
setup += f"{col_name}.TrackVisitedState = true;\n"
setup += f"{col_name}.VisitedLinkColor = Color.Purple;\n"
setups.append(setup)
add_range_code = f"{dgv_name}.Columns.AddRange(new DataGridViewColumn[] {{ " + ", ".join(col_refs) + " });\n"
# find `dgv_name.Name = "..."`
pattern = f'({dgv_name}\\.Name = "{dgv_name}";)'
content, n = re.subn(pattern, r'\1\n ' + add_range_code.replace('\n', '\n '), content)
if n == 0:
print(f"FAILED to find {pattern}")
if not declarations:
print("No grids to patch or already patched.")
return
# Declarations
bottom_pattern = r'(private DataGridView dgv_dashboard;)'
decl_str = "\n ".join(declarations) + "\n "
content, n = re.subn(bottom_pattern, decl_str + r'\1', content)
# Instantiations
top_pattern = r'(dgv_dashboard = new DataGridView\(\);)'
inst_str = "\n ".join(instantiations) + "\n "
content, n = re.subn(top_pattern, inst_str + r'\1', content)
# Setups
resume_pattern = r'(\(\(System\.ComponentModel\.ISupportInitialize\)dgv_dashboard\)\.EndInit\(\);)'
setup_str = "\n ".join("\n ".join(s.splitlines()) for s in setups) + "\n "
content, n = re.subn(resume_pattern, setup_str + r'\1', content)
with open(designer_file, 'w', encoding='utf-8') as f:
f.write(content)
print("Patched successfully.")
if __name__ == '__main__':
patch_file(sys.argv[1])