money/config.go

134 lines
3.8 KiB
Go

package main
import (
"os"
"strconv"
)
// ================== Config ==================
//
// Matrix ENV attese (nuovo):
// MATRIX_HS es. https://matrix.tuodominio.tld
// MATRIX_USER es. demone oppure @demone:tuodominio.tld
// MATRIX_PASS password
// MATRIX_DEVICE_NAME (opzionale) nome dispositivo, default "daemon-bot"
// MATRIX_ROOM ID (!...), alias (#...), o permalink (https://matrix.to/#/...)
//
// Retro-compat:
// MATRIX_ROOM_ID (vecchio nome campo; se presente ma c'è anche MATRIX_ROOM, vince MATRIX_ROOM)
//
type Config struct {
// Dati e simboli
DataDir string
StateDir string
BinanceSymbol string // es. "BTCUSDT" o "ETHUSDT"
// Asset THORChain
ThorFrom string // es. "ETH.USDT-0xdAC17F..." (USDT ERC-20 mainnet)
ThorTo string // es. "BTC.BTC" oppure "ETH.ETH"
FromUnitPow int // unità per quote (tipicamente 8 per THORChain)
ToUnitPow int // unità per quote (tipicamente 8 per THORChain)
// Dataset / training
Lookback int
LearningRate float64
BatchSize int
ValSplit float64
MaxEpochs int
EarlyStopFrac float64
ValConfZ float64
// Decisione
SafetyBps float64
MinMoveBps float64
// Quantità di riferimento per quote e per istruzioni manuali
RefFrom float64 // es. 100.0 USDT
RefTo float64 // es. 0.1 ETH/BTC
// Matrix (username+password da env; il token lo gestiamo noi)
MatrixHS string // es. "https://matrix.tuodominio.tld"
MatrixUser string // es. "demone" oppure "@demone:tuodominio.tld"
MatrixPass string // password dell'utente bot
MatrixDeviceName string // opzionale: nome dispositivo per il login
// Nuova chiave generica stanza (ID/alias/permalink). Preferita.
MatrixRoom string
// Legacy per retro-compat (ID puro). Usata solo se MatrixRoom è vuota.
MatrixRoomID string
}
func getenvDefault(k, def string) string {
if v := os.Getenv(k); v != "" {
return v
}
return def
}
func getInt(k string, def int) int {
if v := os.Getenv(k); v != "" {
if n, err := strconv.Atoi(v); err == nil {
return n
}
}
return def
}
func getF(k string, def float64) float64 {
if v := os.Getenv(k); v != "" {
if f, err := strconv.ParseFloat(v, 64); err == nil {
return f
}
}
return def
}
func loadConfig() Config {
cfg := Config{
// Cartelle / simboli
DataDir: getenvDefault("DATA_DIR", "data"),
StateDir: getenvDefault("STATE_DIR", "state"),
BinanceSymbol: getenvDefault("BINANCE_SYMBOL", "BTCUSDT"),
// THORChain
ThorFrom: getenvDefault("THOR_FROM", "ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"),
ThorTo: getenvDefault("THOR_TO", "BTC.BTC"),
FromUnitPow: getInt("FROM_UNIT_POW", 8),
ToUnitPow: getInt("TO_UNIT_POW", 8),
// Training
Lookback: getInt("LOOKBACK", 30),
LearningRate: getF("LR", 0.03),
BatchSize: getInt("BATCH", 32),
ValSplit: getF("VAL_SPLIT", 0.2),
MaxEpochs: getInt("MAX_EPOCHS", 100),
EarlyStopFrac: getF("EARLY_STOP_PCT", 0.5),
ValConfZ: getF("VAL_CONF_Z", 0.90),
// Decisione
SafetyBps: getF("SAFETY_BPS", 10.0),
MinMoveBps: getF("MIN_MOVE_BPS", 5.0),
// Quote di riferimento
RefFrom: getF("REF_FROM", 100.0),
RefTo: getF("REF_TO", 0.1),
// Matrix base
MatrixHS: getenvDefault("MATRIX_HS", ""),
MatrixUser: getenvDefault("MATRIX_USER", ""),
MatrixPass: getenvDefault("MATRIX_PASS", ""),
MatrixDeviceName: getenvDefault("MATRIX_DEVICE_NAME", "daemon-bot"),
// Matrix room (nuovo + legacy)
MatrixRoom: getenvDefault("MATRIX_ROOM", ""),
MatrixRoomID: getenvDefault("MATRIX_ROOM_ID", ""),
}
// Retro-compatibilità: se MATRIX_ROOM è vuota ma MATRIX_ROOM_ID è valorizzata, usa quella.
if cfg.MatrixRoom == "" && cfg.MatrixRoomID != "" {
cfg.MatrixRoom = cfg.MatrixRoomID
}
return cfg
}