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>
94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
import sqlite3
|
|
import json
|
|
import os
|
|
|
|
db_path = r"J:\Softwareprojekte\Polytrader\DBBackup\polytrader.db"
|
|
conn = sqlite3.connect(db_path)
|
|
conn.row_factory = sqlite3.Row
|
|
cursor = conn.cursor()
|
|
|
|
# Accounts
|
|
cursor.execute("SELECT * FROM polymarket_accounts")
|
|
accounts_rows = cursor.fetchall()
|
|
accounts_dict = {}
|
|
for r in accounts_rows:
|
|
acc = dict(r)
|
|
# Map to C# AccountState
|
|
acc_obj = {
|
|
"AccountId": acc["id"],
|
|
"Name": acc["name"],
|
|
"WalletAddress": acc["wallet_address"],
|
|
"ApiKey": acc["api_key"] or "",
|
|
"ApiSecret": acc["api_secret"] or "",
|
|
"ApiPassphrase": acc["api_passphrase"] or "",
|
|
"PrivateKey": acc["private_key"] or "",
|
|
"IsDemo": bool(acc["is_demo"]),
|
|
"IsActive": bool(acc["is_active"]),
|
|
"CloseOnlyMode": bool(acc["close_only_mode"]),
|
|
"PayoutAddress": acc["payout_address"] or "",
|
|
"PayoutLimitUsd": float(acc["payout_limit_usd"] or 0),
|
|
"PerMarketLimit": float(acc["per_market_limit"] or acc.get("max_trade_percent", 5.0)),
|
|
"MaxPriceDifference": float(acc["max_price_difference"] or 2.0),
|
|
"MaxBuyPrice": float(acc["max_buy_price"] or 0.98),
|
|
"ProfitTarget": float(acc["profit_target"] or 50.0),
|
|
"LimitUnder6h": float(acc["limit_under_6h"] or 20.0),
|
|
"LimitUnder24h": float(acc["limit_under_24h"] or 20.0),
|
|
"LimitUnder72h": float(acc["limit_under_72h"] or 20.0),
|
|
"LimitOver72h": float(acc["limit_over_72h"] or 40.0),
|
|
"TotalBalance": 0.0,
|
|
"AvailableBalance": 0.0,
|
|
"OpenPositions": {}
|
|
}
|
|
accounts_dict[str(acc["id"])] = acc_obj
|
|
|
|
# Traders
|
|
cursor.execute("SELECT * FROM tracked_traders")
|
|
traders_rows = cursor.fetchall()
|
|
|
|
# Links
|
|
cursor.execute("SELECT * FROM trader_account_links")
|
|
links_rows = cursor.fetchall()
|
|
links_map = {}
|
|
for r in links_rows:
|
|
t_id = r["trader_id"]
|
|
a_id = r["account_id"]
|
|
if t_id not in links_map:
|
|
links_map[t_id] = []
|
|
links_map[t_id].append(a_id)
|
|
|
|
traders_dict = {}
|
|
for r in traders_rows:
|
|
t = dict(r)
|
|
t_id = t["id"]
|
|
trader_obj = {
|
|
"Id": t_id,
|
|
"WalletAddress": t["wallet_address"],
|
|
"Category": t["category"] or "",
|
|
"DisplayName": t["display_name"] or "",
|
|
"Description": t["description"] or "",
|
|
"Reasoning": t["reasoning"] or "",
|
|
"IsActive": bool(t["is_active"]),
|
|
"IsHidden": bool(t["is_hidden"]),
|
|
"TotalTrades": int(t["total_trades"] or 0),
|
|
"WinningTrades": int(t["winning_trades"] or 0),
|
|
"Winrate30t": float(t["winrate_30t"] or 0.0),
|
|
"TotalPnl": float(t["total_pnl"] or 0.0),
|
|
"AssignedAccountIds": links_map.get(t_id, [])
|
|
}
|
|
traders_dict[str(t_id)] = trader_obj
|
|
|
|
snapshot = {
|
|
"GlobalTradingPaused": False,
|
|
"LiveTradingMode": 0,
|
|
"DemoTradingMode": 0,
|
|
"Accounts": accounts_dict,
|
|
"Traders": traders_dict,
|
|
"TotalCopyTrades": 0,
|
|
"GlobalPnl": 0.0
|
|
}
|
|
|
|
with open("snapshot.json", "w") as f:
|
|
json.dump(snapshot, f, indent=4)
|
|
|
|
print("Export to snapshot.json complete! File size:", os.path.getsize("snapshot.json"))
|